Skip to content

Commit e07c63a

Browse files
committed
Run a separated gateway sever
1 parent 49942f4 commit e07c63a

File tree

3 files changed

+95
-39
lines changed

3 files changed

+95
-39
lines changed

README.md

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,27 @@
33
dephy-pproxy is a http proxy over litep2p.
44

55
## Usage
6-
Run the server:
6+
Run the server pproxy:
77
```shell
8-
cargo run -- --proxy-addr 127.0.0.1:8000
8+
cargo run -- serve --server-addr 127.0.0.1:6666 --commander-server-addr 127.0.0.1:7777 --proxy-addr 127.0.0.1:8000
99
```
1010

11-
Run the client:
11+
Provide a simple http server for testing:
1212
```shell
13-
cargo run -- --server-addr 127.0.0.1:6666 --commander-server-addr 127.0.0.1:7777 --proxy-gateway-addr 127.0.0.1:8080
13+
python3 -m http.server 8000
1414
```
1515

16-
Add server peer to client:
16+
Run the client pproxy:
1717
```shell
18-
grpcurl -plaintext -import-path ./proto -proto command_v1.proto -d '{"address": "<The litep2p multiaddr>"}' '127.0.0.1:7777' command.v1.CommandService/AddPeer
18+
cargo run -- serve
19+
```
20+
21+
Run a gateway on client:
22+
```shell
23+
cargo run -- gateway --proxy-gateway-addr 127.0.0.1:8080 --peer-multiaddr <The litep2p multiaddr>
1924
```
2025

2126
Access server via the gateway address:
2227
```shell
23-
curl -H 'peerid: <peerid provided by AddPeer>' 127.0.0.1:8080
28+
curl 127.0.0.1:8080
2429
```

src/gateway.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,43 @@ use hyper::service::service_fn;
1111
use hyper::Request;
1212
use hyper::Response;
1313
use hyper_util::rt::TokioIo;
14+
use multiaddr::Multiaddr;
1415
use tokio::net::TcpListener;
1516

1617
use crate::command::proto::command_service_client::CommandServiceClient;
18+
use crate::command::proto::AddPeerRequest;
1719
use crate::command::proto::RequestHttpServerRequest;
1820

1921
pub async fn proxy_gateway(
2022
addr: SocketAddr,
2123
commander_addr: SocketAddr,
24+
peer_multiaddr: Multiaddr,
2225
) -> Result<(), Box<dyn std::error::Error>> {
2326
let listener = TcpListener::bind(addr).await?;
2427

28+
let mut client = CommandServiceClient::connect(format!("http://{}", commander_addr)).await?;
29+
let pp_response = client
30+
.add_peer(AddPeerRequest {
31+
address: peer_multiaddr.to_string(),
32+
peer_id: None,
33+
})
34+
.await?
35+
.into_inner();
36+
2537
loop {
2638
let (stream, _) = listener.accept().await?;
2739
let io = TokioIo::new(stream);
40+
let peer_id = pp_response.peer_id.clone();
2841

2942
tokio::task::spawn(async move {
43+
let peer_id = peer_id.clone();
3044
if let Err(err) = http1::Builder::new()
3145
.preserve_header_case(true)
3246
.title_case_headers(true)
33-
.serve_connection(io, service_fn(move |req| gateway(req, commander_addr)))
47+
.serve_connection(
48+
io,
49+
service_fn(move |req| gateway(req, commander_addr, peer_id.clone())),
50+
)
3451
.await
3552
{
3653
println!("Failed to serve connection: {:?}", err);
@@ -40,20 +57,10 @@ pub async fn proxy_gateway(
4057
}
4158

4259
async fn gateway(
43-
mut req: Request<hyper::body::Incoming>,
60+
req: Request<hyper::body::Incoming>,
4461
commander_addr: SocketAddr,
62+
peer_id: String,
4563
) -> Result<Response<BoxBody<Bytes, hyper::Error>>, hyper::Error> {
46-
let headers = req.headers_mut();
47-
let Some(Ok(peer_id)) = headers
48-
.remove("peerid")
49-
.map(|x| x.to_str().map(|x| x.to_string()))
50-
else {
51-
return Ok(error_response(
52-
"Invalid peerid in header",
53-
http::StatusCode::BAD_REQUEST,
54-
));
55-
};
56-
5764
let Ok(mut data) = request_header_to_vec(&req) else {
5865
return Ok(error_response(
5966
"Failed to dump headers",

src/main.rs

Lines changed: 63 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use clap::Arg;
22
use clap::ArgAction;
3+
use clap::ArgMatches;
34
use clap::Command;
45
use dephy_pproxy::command::PProxyCommander;
56
use dephy_pproxy::gateway::proxy_gateway;
@@ -12,7 +13,8 @@ fn parse_args() -> Command {
1213
.about("A proxy tool based on p2p network")
1314
.version("0.1.0");
1415

15-
app = app
16+
let serve = Command::new("serve")
17+
.about("Start a pproxy server")
1618
.arg(
1719
Arg::new("KEY")
1820
.long("key")
@@ -42,6 +44,17 @@ fn parse_args() -> Command {
4244
.num_args(1)
4345
.action(ArgAction::Set)
4446
.help("Will reverse proxy this address if set"),
47+
);
48+
49+
let gateway = Command::new("gateway")
50+
.about("Set up a local server that allows users proxy data to remote peer")
51+
.arg(
52+
Arg::new("COMMANDER_SERVER_ADDR")
53+
.long("commander-server-addr")
54+
.num_args(1)
55+
.default_value("127.0.0.1:10086")
56+
.action(ArgAction::Set)
57+
.help("Commander server address"),
4558
)
4659
.arg(
4760
Arg::new("PROXY_GATEWAY_ADDR")
@@ -50,18 +63,21 @@ fn parse_args() -> Command {
5063
.default_value("127.0.0.1:10000")
5164
.action(ArgAction::Set)
5265
.help("Set up a local HTTP server that allows users use peerid header to proxy requests to remote peer"),
66+
)
67+
.arg(
68+
Arg::new("PEER_MULTIADDR")
69+
.long("peer-multiaddr")
70+
.num_args(1)
71+
.action(ArgAction::Set)
72+
.required(true)
73+
.help("The multiaddr of the remote peer"),
5374
);
5475

76+
app = app.subcommand(serve).subcommand(gateway);
5577
app
5678
}
5779

58-
#[tokio::main]
59-
async fn main() {
60-
let _ = tracing_subscriber::fmt()
61-
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
62-
.try_init();
63-
64-
let args = parse_args().get_matches();
80+
async fn serve(args: &ArgMatches) {
6581
let key = args
6682
.get_one::<String>("KEY")
6783
.map(|key| {
@@ -85,15 +101,9 @@ async fn main() {
85101
let proxy_addr = args
86102
.get_one::<String>("PROXY_ADDR")
87103
.map(|addr| addr.parse().expect("Invalid proxy address"));
88-
let proxy_gateway_addr = args
89-
.get_one::<String>("PROXY_GATEWAY_ADDR")
90-
.unwrap()
91-
.parse()
92-
.expect("Invalid proxy gateway address");
93104

94105
println!("server_addr: {}", server_addr);
95106
println!("commander_server_addr: {}", commander_server_addr);
96-
println!("proxy_gateway_addr: {}", proxy_gateway_addr);
97107

98108
let (pproxy, pproxy_handle) = PProxy::new(key, server_addr, proxy_addr);
99109

@@ -109,11 +119,45 @@ async fn main() {
109119
.await
110120
.expect("Commander server failed")
111121
},
112-
async move {
113-
proxy_gateway(proxy_gateway_addr, commander_server_addr)
114-
.await
115-
.expect("Gateway server failed")
116-
},
117122
async move { pproxy.run().await }
118123
);
119124
}
125+
126+
async fn gateway(args: &ArgMatches) {
127+
let commander_server_addr = args
128+
.get_one::<String>("COMMANDER_SERVER_ADDR")
129+
.unwrap()
130+
.parse()
131+
.expect("Invalid command server address");
132+
let proxy_gateway_addr = args
133+
.get_one::<String>("PROXY_GATEWAY_ADDR")
134+
.unwrap()
135+
.parse()
136+
.expect("Invalid proxy gateway address");
137+
let peer_multiaddr = args
138+
.get_one::<String>("PEER_MULTIADDR")
139+
.unwrap()
140+
.parse()
141+
.expect("Missing peer multiaddr");
142+
println!("proxy_gateway_addr: {}", proxy_gateway_addr);
143+
proxy_gateway(proxy_gateway_addr, commander_server_addr, peer_multiaddr)
144+
.await
145+
.expect("Gateway server failed")
146+
}
147+
148+
#[tokio::main]
149+
async fn main() {
150+
let _ = tracing_subscriber::fmt()
151+
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
152+
.try_init();
153+
154+
let args = parse_args().get_matches();
155+
156+
if let Some(args) = args.subcommand_matches("serve") {
157+
serve(args).await;
158+
}
159+
160+
if let Some(args) = args.subcommand_matches("gateway") {
161+
gateway(args).await;
162+
}
163+
}

0 commit comments

Comments
 (0)