Skip to content

Commit 185235b

Browse files
committed
Add a simplified reverse proxy example
1 parent f208fd7 commit 185235b

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Run the example with:
2+
// cargo build --example http_server_proxy_simple --target=wasm32-wasip2
3+
// wasmtime serve -Scli -Shttp --env TARGET_URL=https://example.com target/wasm32-wasip2/debug/examples/http_server_proxy_simple.wasm
4+
// Test with `curl -v 127.0.0.1:8080`
5+
use wstd::http::body::IncomingBody;
6+
use wstd::http::server::{Finished, Responder};
7+
use wstd::http::{Client, Request, Response, Uri};
8+
9+
#[wstd::http_server]
10+
async fn main(server_req: Request<IncomingBody>, responder: Responder) -> Finished {
11+
let api_prefixed_path = server_req.uri().path_and_query().unwrap().as_str();
12+
let target_url = std::env::var("TARGET_URL").expect("missing environment variable TARGET_URL");
13+
let target_url: Uri = format!("{target_url}{}", api_prefixed_path)
14+
.parse()
15+
.expect("final target url should be parseable");
16+
println!("Proxying to {target_url}");
17+
18+
let client = Client::new();
19+
let mut client_req = Request::builder();
20+
client_req = client_req.uri(target_url).method(server_req.method());
21+
22+
// Copy headers from server request to the client request.
23+
let (server_req_parts, server_req_body) = server_req.into_parts();
24+
*client_req.headers_mut().unwrap() = server_req_parts.headers;
25+
// Send the whole request.
26+
let client_req = client_req
27+
.body(server_req_body)
28+
.expect("client_req.body failed");
29+
30+
let client_resp: Response<IncomingBody> =
31+
client.send(client_req).await.expect("client.send failed");
32+
let mut server_resp = Response::builder();
33+
let (client_resp_parts, client_resp_body) = client_resp.into_parts();
34+
*server_resp.headers_mut().unwrap() = client_resp_parts.headers;
35+
// Send the response.
36+
let server_resp = server_resp
37+
.body(client_resp_body)
38+
.expect("server_resp.body failed");
39+
responder.respond(server_resp).await
40+
}

0 commit comments

Comments
 (0)