Skip to content

Commit

Permalink
vmess ws
Browse files Browse the repository at this point in the history
  • Loading branch information
ibigbug committed Aug 27, 2023
1 parent ad1456e commit 037035b
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 24 deletions.
3 changes: 2 additions & 1 deletion Cargo.Bazel.lock
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"checksum": "6445e063a149a7b0135e4155efe8c41159e55a94e4729b0257796245b6749682",
"checksum": "4cbdcb9e3b0bf965148711c63b8c4f9f82332f99af211db5d11b917158b49e50",
"crates": {
"addr2line 0.20.0": {
"name": "addr2line",
Expand Down Expand Up @@ -15658,6 +15658,7 @@
],
"crate_features": {
"common": [
"cors",
"default",
"fs",
"httpdate",
Expand Down
16 changes: 15 additions & 1 deletion clash/tests/data/config/rules.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ proxy-groups:
proxies:
- "ss"
- "plain-vmess"
- "ws-vmess"
- "auto"
- "fallback-auto"
- "load-balance"
Expand Down Expand Up @@ -117,10 +118,23 @@ proxies:
cipher: auto
udp: true
skip-cert-verify: true
- name: ws-vmess
type: vmess
server: 10.0.0.13
port: 16824
uuid: b831381d-6324-4d53-ad4f-8cda48b30811
alterId: 0
cipher: auto
udp: true
skip-cert-verify: true
ws-opts:
path: /api/v3/download.getFile
headers:
Host: www.amazon.com

rules:
- DOMAIN,ipinfo.io,relay
- DOMAIN-KEYWORD,httpbin,relay-one
- DOMAIN-KEYWORD,httpbin,ws-vmess
- DOMAIN-SUFFIX,facebook.com,REJECT
- DOMAIN-KEYWORD,google,ss
- DOMAIN,google.com,ss
Expand Down
2 changes: 1 addition & 1 deletion clash_lib/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ chacha20poly1305 = "0.10"
aes-gcm = "0.10"
filetime = "0.2"
axum = { version = "0.6.20", features = ["ws"] }
tower-http = { version = "0.4.0", features = ["fs", "trace"] }
tower-http = { version = "0.4.0", features = ["fs", "trace", "cors"] }
chrono = { version = "0.4.26", features = ["serde"] }


Expand Down
18 changes: 16 additions & 2 deletions clash_lib/src/app/api/handlers/log.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,22 @@ pub async fn handle(
})
.on_upgrade(move |mut socket| async move {
let mut rx = state.log_source_tx.subscribe();
while let Ok(msg) = rx.recv().await {
if let Err(e) = socket.send(Message::Text(msg)).await {
while let Ok(evt) = rx.recv().await {
// TODO: if I'd need to do 1 more of this I'd def pull serde-json |
let res = vec![
"{\"type\": \"",
match evt.level {
crate::config::def::LogLevel::Debug => "debug",
crate::config::def::LogLevel::Info => "info",
crate::config::def::LogLevel::Warning => "warning",
crate::config::def::LogLevel::Error => "error",
crate::config::def::LogLevel::Silent => "slient",
},
"\", \"payload\": \"",
evt.msg.as_str(),
"\"}",
];
if let Err(e) = socket.send(Message::Text(res.concat())).await {
warn!("ws send error: {}", e);
break;
}
Expand Down
20 changes: 14 additions & 6 deletions clash_lib/src/app/api/mod.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
use std::{net::SocketAddr, path::PathBuf, sync::Arc};
use std::{net::SocketAddr, sync::Arc};

use axum::http::Request;
use axum::{middleware, response::Redirect, routing::get, Router};
use axum::{response::Redirect, routing::get, Router};

use futures::future::BoxFuture;
use http::header;
use http::Method;
use tokio::sync::{broadcast::Sender, Mutex};
use tower_http::cors::{Any, CorsLayer};
use tower_http::services::ServeDir;
use tracing::info;

use crate::{config::internal::config::Controller, GlobalState, Runner};

use super::logging::LogEvent;
use super::{
dispatcher, inbound::manager::ThreadSafeInboundManager,
outbound::manager::ThreadSafeOutboundManager, router::ThreadSafeRouter, ThreadSafeDNSResolver,
Expand All @@ -19,12 +21,12 @@ mod handlers;
mod middlewares;

pub struct AppState {
log_source_tx: Sender<String>,
log_source_tx: Sender<LogEvent>,
}

pub fn get_api_runner(
controller_cfg: Controller,
log_source: Sender<String>,
log_source: Sender<LogEvent>,
inbound_manager: ThreadSafeInboundManager,
dispatcher: Arc<dispatcher::Dispatcher>,
global_state: Arc<Mutex<GlobalState>>,
Expand All @@ -39,6 +41,11 @@ pub fn get_api_runner(

let addr = bind_addr.parse().unwrap();

let cors = CorsLayer::new()
.allow_methods([Method::GET, Method::POST, Method::PUT, Method::PATCH])
.allow_headers([header::AUTHORIZATION, header::CONTENT_TYPE])
.allow_origin(Any);

let runner = async move {
info!("Starting API server at {}", addr);
let mut app = Router::new()
Expand Down Expand Up @@ -68,6 +75,7 @@ pub fn get_api_runner(
.route_layer(middlewares::auth::AuthMiddlewareLayer::new(
controller_cfg.secret.unwrap_or_default(),
))
.route_layer(cors)
.with_state(app_state);

if let Some(external_ui) = controller_cfg.external_ui {
Expand Down
33 changes: 22 additions & 11 deletions clash_lib/src/app/logging.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::def::LogLevel;
use tokio::sync::broadcast::Sender;

use tracing::Event;
use tracing_subscriber::filter::Targets;
use tracing_subscriber::prelude::*;
use tracing_subscriber::Layer;
Expand All @@ -18,10 +19,16 @@ impl From<LogLevel> for filter::LevelFilter {
}
}

pub struct EventCollector(Vec<Sender<String>>);
#[derive(Clone)]
pub struct LogEvent {
pub level: LogLevel,
pub msg: String,
}

pub struct EventCollector(Vec<Sender<LogEvent>>);

impl EventCollector {
pub fn new(recivers: Vec<Sender<String>>) -> Self {
pub fn new(recivers: Vec<Sender<LogEvent>>) -> Self {
Self(recivers)
}
}
Expand All @@ -35,16 +42,20 @@ where
event: &tracing::Event<'_>,
_ctx: tracing_subscriber::layer::Context<'_, S>,
) {
let mut msg = vec![];
msg.push(format!("{}", event.metadata().level()));
msg.push(format!("{}", event.metadata().target()));
msg.push(format!("{}", event.metadata().name()));
for field in event.fields() {
msg.push(format!("{}", field.name()));
}

// TODO: format log here
let msg = format!("{}", event.metadata().name());
let event = LogEvent {
level: match event.metadata().level() {
&tracing::Level::ERROR => LogLevel::Error,
&tracing::Level::WARN => LogLevel::Warning,
&tracing::Level::INFO => LogLevel::Info,
&tracing::Level::DEBUG => LogLevel::Debug,
&tracing::Level::TRACE => LogLevel::Debug,
},
msg,
};
for tx in &self.0 {
_ = tx.send(msg.join(""));
_ = tx.send(event.clone());
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion clash_lib/src/app/proxy_manager/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ impl ProxyManager {
manager
.url_test(proxy, url.as_str(), timeout)
.await
.map_err(|e| error!("healthcheck failed: {}", e))
.map_err(|e| warn!("healthcheck failed: {}", e))
});
}
futures::future::join_all(futures).await;
Expand Down
8 changes: 7 additions & 1 deletion docker/v2ray/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,13 @@
]
},
"streamSettings": {
"network": "ws"
"network": "ws",
"wsSettings": {
"path": "/api/v3/download.getFile",
"headers": {
"Host": "www.amazon.com"
}
}
}
},
{
Expand Down

0 comments on commit 037035b

Please sign in to comment.