|
| 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