Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wasi-http: add the port to authority when opening a TCP connection #8671

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions crates/test-programs/src/bin/api_proxy_forward_request.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
use test_programs::wasi::http::types::{
Headers, IncomingRequest, OutgoingBody, OutgoingResponse, ResponseOutparam,
};

struct T;

test_programs::proxy::export!(T);

impl test_programs::proxy::exports::wasi::http::incoming_handler::Guest for T {
fn handle(request: IncomingRequest, outparam: ResponseOutparam) {
let res = test_programs::http::request(
request.method(),
request.scheme().unwrap(),
request.authority().unwrap().as_str(),
request.path_with_query().unwrap().as_str(),
None,
None,
None,
None,
None,
)
.unwrap();

let hdrs = Headers::from_list(&res.headers).unwrap();
let resp = OutgoingResponse::new(hdrs);
resp.set_status_code(res.status).expect("status code");
let body = resp.body().expect("outgoing response");

ResponseOutparam::set(outparam, Ok(resp));

let out = body.write().expect("outgoing stream");
out.blocking_write_and_flush(res.body.as_ref())
.expect("writing response");

drop(out);
OutgoingBody::finish(body, None).expect("outgoing-body.finish");
}
}

// Technically this should not be here for a proxy, but given the current
// framework for tests it's required since this file is built as a `bin`
fn main() {}
9 changes: 8 additions & 1 deletion crates/wasi-http/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,14 @@ pub async fn default_send_request_handler(
between_bytes_timeout,
}: OutgoingRequestConfig,
) -> Result<IncomingResponse, types::ErrorCode> {
let Some(authority) = request.uri().authority().map(ToString::to_string) else {
let authority = if let Some(authority) = request.uri().authority() {
if authority.port().is_some() {
authority.to_string()
} else {
let port = if use_tls { 443 } else { 80 };
format!("{}:{port}", authority.to_string())
}
} else {
return Err(types::ErrorCode::HttpRequestUriInvalid);
};
let tcp_stream = timeout(connect_timeout, TcpStream::connect(&authority))
Expand Down
21 changes: 21 additions & 0 deletions crates/wasi-http/tests/all/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,27 @@ async fn do_wasi_http_echo(uri: &str, url_header: Option<&str>) -> Result<()> {
Ok(())
}

#[test_log::test(tokio::test)]
// test uses TLS but riscv/s390x don't support that yet
#[cfg_attr(any(target_arch = "riscv64", target_arch = "s390x"), ignore)]
async fn wasi_http_without_port() -> Result<()> {
let req = hyper::Request::builder()
.method(http::Method::GET)
.uri("https://httpbin.org/get");

let response = run_wasi_http(
test_programs_artifacts::API_PROXY_FORWARD_REQUEST_COMPONENT,
req.body(body::empty())?,
None,
None,
)
.await??;

assert_eq!(response.status(), StatusCode::OK);

Ok(())
}

mod body {
use http_body_util::{combinators::BoxBody, BodyExt, Empty, Full};
use hyper::body::Bytes;
Expand Down
5 changes: 5 additions & 0 deletions crates/wasi/tests/all/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ fn api_proxy() {}
#[allow(dead_code)]
fn api_proxy_streaming() {}

// This is tested in the wasi-http crate, but need to satisfy the `foreach_api!`
// macro above.
#[allow(dead_code)]
fn api_proxy_forward_request() {}

wasmtime::component::bindgen!({
world: "test-reactor",
async: true,
Expand Down