Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
8706733610
|
|||
|
47d2937c45
|
|||
|
9fbc498615
|
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -718,7 +718,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "simple-rust-http3-proxy"
|
name = "simple-rust-http3-proxy"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"deser-hjson",
|
"deser-hjson",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "simple-rust-http3-proxy"
|
name = "simple-rust-http3-proxy"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|||||||
@@ -21,9 +21,7 @@ pub async fn run(listen_config: &ListenConfig) -> XResult<()> {
|
|||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
while let Ok((inbound, _)) = listener.accept().await {
|
while let Ok((inbound, _)) = listener.accept().await {
|
||||||
information!("Receive connection: {}", inbound.peer_addr().map(|addr| format!("{}", addr)).unwrap_or_else(|_| "n/a".to_string()));
|
information!("Receive connection: {}", inbound.peer_addr().map(|addr| format!("{}", addr)).unwrap_or_else(|_| "n/a".to_string()));
|
||||||
// if is_in_peer_addr_matches(&inbound, &allow_ips, sender_tx.clone()) {
|
// TODO if is_in_peer_addr_matches(&inbound, &allow_ips) {
|
||||||
// } else {
|
|
||||||
// }
|
|
||||||
if let Err(e) = inbound_stream_channel_sender.send((util_time::get_current_millis(), inbound)).await {
|
if let Err(e) = inbound_stream_channel_sender.send((util_time::get_current_millis(), inbound)).await {
|
||||||
failure!("Send tcp stream to channel failed: {}", e);
|
failure!("Send tcp stream to channel failed: {}", e);
|
||||||
}
|
}
|
||||||
@@ -69,9 +67,30 @@ pub async fn run(listen_config: &ListenConfig) -> XResult<()> {
|
|||||||
|
|
||||||
let endpoint = endpoint_opt.as_mut().unwrap();
|
let endpoint = endpoint_opt.as_mut().unwrap();
|
||||||
|
|
||||||
let connect = endpoint.connect(addr, &server_name).unwrap();
|
let connect = match endpoint.connect(addr, &server_name) {
|
||||||
let quinn::NewConnection { connection, .. } = connect.await.unwrap();
|
Ok(connect) => connect,
|
||||||
let (send, recv) = connection.open_bi().await.unwrap();
|
Err(e) => {
|
||||||
|
failure!("Connect failed: {:?}", e);
|
||||||
|
endpoint_opt = None;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let quinn::NewConnection { connection, .. } = match connect.await {
|
||||||
|
Ok(connection) => connection,
|
||||||
|
Err(e) => {
|
||||||
|
failure!("Connect failed: {:?}", e);
|
||||||
|
endpoint_opt = None;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let (send, recv) = match connection.open_bi().await {
|
||||||
|
Ok(stream) => stream,
|
||||||
|
Err(e) => {
|
||||||
|
failure!("Connect failed: {:?}", e);
|
||||||
|
endpoint_opt = None;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
let remote_addr = format!("{}", connection.remote_address());
|
let remote_addr = format!("{}", connection.remote_address());
|
||||||
let local_addr = connection.local_ip().map(|ip| format!("{}", ip)).unwrap_or_else(|| "".to_string());
|
let local_addr = connection.local_ip().map(|ip| format!("{}", ip)).unwrap_or_else(|| "".to_string());
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
@@ -85,10 +104,7 @@ pub async fn run(listen_config: &ListenConfig) -> XResult<()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_client_endpoint(
|
fn make_client_endpoint(bind_addr: SocketAddr, server_certs: &[&[u8]]) -> Result<Endpoint, Box<dyn Error>> {
|
||||||
bind_addr: SocketAddr,
|
|
||||||
server_certs: &[&[u8]],
|
|
||||||
) -> Result<Endpoint, Box<dyn Error>> {
|
|
||||||
let client_cfg = configure_client(server_certs)?;
|
let client_cfg = configure_client(server_certs)?;
|
||||||
let mut endpoint = Endpoint::client(bind_addr)?;
|
let mut endpoint = Endpoint::client(bind_addr)?;
|
||||||
endpoint.set_default_client_config(client_cfg);
|
endpoint.set_default_client_config(client_cfg);
|
||||||
@@ -100,6 +116,5 @@ fn configure_client(server_certs: &[&[u8]]) -> Result<ClientConfig, Box<dyn Erro
|
|||||||
for cert in server_certs {
|
for cert in server_certs {
|
||||||
certs.add(&rustls::Certificate(cert.to_vec()))?;
|
certs.add(&rustls::Certificate(cert.to_vec()))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(ClientConfig::with_root_certificates(certs))
|
Ok(ClientConfig::with_root_certificates(certs))
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,7 @@ async fn main() -> XResult<()> {
|
|||||||
failure_and_exit!("Cannot run in both server and client mode");
|
failure_and_exit!("Cannot run in both server and client mode");
|
||||||
}
|
}
|
||||||
if !server_mode && !client_mode {
|
if !server_mode && !client_mode {
|
||||||
failure_and_exit!("Must run in server on client mode")
|
failure_and_exit!("Must run in server or client mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
let config_file = opt_value_result!(matches.value_of("config"), "--config is required");
|
let config_file = opt_value_result!(matches.value_of("config"), "--config is required");
|
||||||
|
|||||||
@@ -26,8 +26,7 @@ pub async fn run(listen_config: &ListenConfig) -> XResult<()> {
|
|||||||
let cert_chain = vec![rustls::Certificate(cert_bytes)];
|
let cert_chain = vec![rustls::Certificate(cert_bytes)];
|
||||||
|
|
||||||
let mut server_config = opt_result!(ServerConfig::with_single_cert(cert_chain, priv_key), "Create server config failed: {}");
|
let mut server_config = opt_result!(ServerConfig::with_single_cert(cert_chain, priv_key), "Create server config failed: {}");
|
||||||
Arc::get_mut(&mut server_config.transport)
|
Arc::get_mut(&mut server_config.transport).unwrap()
|
||||||
.unwrap()
|
|
||||||
.max_concurrent_uni_streams(0_u8.into());
|
.max_concurrent_uni_streams(0_u8.into());
|
||||||
information!("Listen: {}", &listen_config.listen);
|
information!("Listen: {}", &listen_config.listen);
|
||||||
let listen_addr: SocketAddr = opt_result!(listen_config.listen.parse(), "Parse listen address: {} failed: {}", &listen_config.listen);
|
let listen_addr: SocketAddr = opt_result!(listen_config.listen.parse(), "Parse listen address: {} failed: {}", &listen_config.listen);
|
||||||
@@ -45,7 +44,7 @@ pub async fn run(listen_config: &ListenConfig) -> XResult<()> {
|
|||||||
let connection = match connection.await {
|
let connection = match connection.await {
|
||||||
Ok(connection) => connection,
|
Ok(connection) => connection,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
warning!("Create connection failed: {}", e);
|
warning!("Create connection failed: {:?}", e);
|
||||||
sleep(Duration::from_secs(3)).await;
|
sleep(Duration::from_secs(3)).await;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -67,7 +66,7 @@ pub async fn run(listen_config: &ListenConfig) -> XResult<()> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Some(Err(e)) => {
|
Some(Err(e)) => {
|
||||||
information!("Connection ended: {}", e);
|
information!("Connection ended: {:?}", e);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Some(Ok((send, recv))) => {
|
Some(Ok((send, recv))) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user