@@ -13,24 +13,25 @@ This was offered to upstream via:
1313https://github.com/openai/codex/issues/4242
1414
1515diff --git a/codex-rs/exec-server/src/client/reqwest_http_client.rs b/codex-rs/exec-server/src/client/reqwest_http_client.rs
16- index 9e22fc0..1862197 100644
16+ index d0cffa6..dd849de 100644
1717--- a/codex-rs/exec-server/src/client/reqwest_http_client.rs
1818+++ b/codex-rs/exec-server/src/client/reqwest_http_client.rs
19- @@ -46,17 +46,23 @@ pub(crate) struct PendingReqwestHttpBodyStream {
19+ @@ -49,20 +49,25 @@ pub(crate) struct PendingReqwestHttpBodyStream {
2020 /// Validates `http/request` parameters and runs the actual `reqwest` call used
2121 /// by the exec-server route and the local [`HttpClient`] backend.
2222 pub(crate) struct ReqwestHttpRequestRunner {
2323- client: reqwest::Client,
2424+ timeout_ms: Option<u64>,
25+ + redirect_policy: HttpRedirectPolicy,
2526 }
2627
2728 impl ReqwestHttpClient {
28- - fn build_client(timeout_ms: Option<u64>) -> Result<reqwest::Client, ExecServerError> {
29- - let builder = match timeout_ms {
30- + fn build_client(
31- + timeout_ms: Option<u64>,
29+ fn build_client(
30+ timeout_ms: Option<u64>,
31+ redirect_policy: HttpRedirectPolicy,
3232+ url: &Url,
33- + ) -> Result<reqwest::Client, ExecServerError> {
33+ ) -> Result<reqwest::Client, ExecServerError> {
34+ - let builder = match timeout_ms {
3435+ let mut builder = match timeout_ms {
3536 None => reqwest::Client::builder(),
3637 Some(timeout_ms) => {
@@ -40,32 +41,35 @@ index 9e22fc0..1862197 100644
4041+ if request_matches_no_proxy(url) {
4142+ builder = builder.no_proxy();
4243+ }
43- build_reqwest_client_with_custom_ca( builder)
44- .map_err(|error| ExecServerError::HttpRequest(error.to_string()))
45- }
46- @@ -112 ,9 +118,7 @@ impl HttpClient for ReqwestHttpClient {
47-
48- impl ReqwestHttpRequestRunner {
49- pub(crate) fn new(timeout_ms: Option<u64> ) -> Result<Self, JSONRPCErrorError> {
50- - let client = ReqwestHttpClient::build_client(timeout_ms)
44+ let builder = match redirect_policy {
45+ HttpRedirectPolicy::Follow => builder,
46+ HttpRedirectPolicy::Stop => builder.redirect(reqwest::redirect::Policy::none()),
47+ @@ -125 ,9 +130,10 @@ impl ReqwestHttpRequestRunner {
48+ timeout_ms: Option<u64>,
49+ redirect_policy: HttpRedirectPolicy,
50+ ) -> Result<Self, JSONRPCErrorError> {
51+ - let client = ReqwestHttpClient::build_client(timeout_ms, redirect_policy )
5152- .map_err(|error| internal_error(error.to_string()))?;
5253- Ok(Self { client })
53- + Ok(Self { timeout_ms })
54+ + Ok(Self {
55+ + timeout_ms,
56+ + redirect_policy,
57+ + })
5458 }
5559
5660 pub(crate) async fn run(
57- @@ -136 ,7 +140 ,9 @@ impl ReqwestHttpRequestRunner {
58- }
59-
60- let headers = Self::build_headers(params. headers)? ;
61+ @@ -159 ,7 +165 ,9 @@ impl ReqwestHttpRequestRunner {
62+ );
63+ let mut headers = Self::build_headers(params.headers)?;
64+ codex_otel::inject_span_w3c_trace_headers(&request_span, &mut headers);
6165- let mut request = self.client.request(method.clone(), url).headers(headers);
62- + let client = ReqwestHttpClient::build_client(self.timeout_ms, &url)
66+ + let client = ReqwestHttpClient::build_client(self.timeout_ms, self.redirect_policy, &url)
6367+ .map_err(|error| internal_error(error.to_string()))?;
6468+ let mut request = client.request(method.clone(), url).headers(headers);
6569 if let Some(body) = params.body {
6670 request = request.body(body.into_inner());
6771 }
68- @@ -295 ,3 +301 ,98 @@ fn error_source_chain(error: &reqwest::Error) -> Option<String> {
72+ @@ -320 ,3 +328 ,98 @@ fn error_source_chain(error: &reqwest::Error) -> Option<String> {
6973 }
7074 (!sources.is_empty()).then(|| sources.join(": "))
7175 }
0 commit comments