Allow extensions to control the redirect policy for the HTTP client (#16162)

This PR extends the extension API with support for controlling the
redirect policy used by the HTTP client.

Release Notes:

- N/A
This commit is contained in:
Marshall Bowers 2024-08-13 10:40:21 -04:00 committed by GitHub
parent 98a2ab0686
commit 4450ebff6b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 42 additions and 14 deletions

View file

@ -136,7 +136,7 @@ impl http_client::Host for WasmState {
) -> wasmtime::Result<Result<http_client::HttpResponse, String>> {
maybe!(async {
let url = &request.url;
let request = convert_request(&request, true)?;
let request = convert_request(&request)?;
let mut response = self.host.http_client.send(request).await?;
if response.status().is_client_error() || response.status().is_server_error() {
@ -152,7 +152,7 @@ impl http_client::Host for WasmState {
&mut self,
request: http_client::HttpRequest,
) -> wasmtime::Result<Result<Resource<ExtensionHttpResponseStream>, String>> {
let request = convert_request(&request, true)?;
let request = convert_request(&request)?;
let response = self.host.http_client.send(request);
maybe!(async {
let response = response.await?;
@ -208,15 +208,14 @@ impl From<http_client::HttpMethod> for ::http_client::Method {
fn convert_request(
extension_request: &http_client::HttpRequest,
follow_redirects: bool,
) -> Result<::http_client::Request<AsyncBody>, anyhow::Error> {
let mut request = ::http_client::Request::builder()
.method(::http_client::Method::from(extension_request.method))
.uri(&extension_request.url)
.redirect_policy(if follow_redirects {
RedirectPolicy::Follow
} else {
RedirectPolicy::None
.redirect_policy(match extension_request.redirect_policy {
http_client::RedirectPolicy::NoFollow => RedirectPolicy::None,
http_client::RedirectPolicy::FollowLimit(limit) => RedirectPolicy::Limit(limit),
http_client::RedirectPolicy::FollowAll => RedirectPolicy::Follow,
});
for (key, value) in &extension_request.headers {
request = request.header(key, value);