From 1006c1cf3be9be054d0650f0d9787b5aee045f5a Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Mon, 21 Jun 2021 13:47:21 -0300 Subject: [PATCH] fix(core): HTTP headers being overwritten by reqwest, closes #2032 (#2036) --- .changes/fix-reqwest-headers.md | 5 ++++ core/tauri/src/api/error.rs | 6 ++++- core/tauri/src/api/http.rs | 45 ++++++++++++++------------------- 3 files changed, 29 insertions(+), 27 deletions(-) create mode 100644 .changes/fix-reqwest-headers.md diff --git a/.changes/fix-reqwest-headers.md b/.changes/fix-reqwest-headers.md new file mode 100644 index 000000000..8bbe3bb76 --- /dev/null +++ b/.changes/fix-reqwest-headers.md @@ -0,0 +1,5 @@ +--- +"tauri": patch +--- + +Fixes HTTP API headers being overwritten when using the `reqwest` client. diff --git a/core/tauri/src/api/error.rs b/core/tauri/src/api/error.rs index f62cb9fa5..528f2fb5a 100644 --- a/core/tauri/src/api/error.rs +++ b/core/tauri/src/api/error.rs @@ -38,7 +38,11 @@ pub enum Error { /// HTTP method error. #[error("{0}")] HttpMethod(#[from] http::method::InvalidMethod), - /// Invalid HTTO header. + /// Invalid HTTP header value. + #[cfg(feature = "reqwest-client")] + #[error("{0}")] + HttpHeaderValue(#[from] http::header::InvalidHeaderValue), + /// Invalid HTTP header value. #[error("{0}")] HttpHeader(#[from] http::header::InvalidHeaderName), /// Failed to serialize header value as string. diff --git a/core/tauri/src/api/http.rs b/core/tauri/src/api/http.rs index d77a82ae9..cf6bc3556 100644 --- a/core/tauri/src/api/http.rs +++ b/core/tauri/src/api/http.rs @@ -148,32 +148,15 @@ impl Client { request_builder = request_builder.query(&query); } - if let Some(headers) = request.headers { - for (header, header_value) in headers.iter() { - request_builder = - request_builder.header(HeaderName::from_bytes(header.as_bytes())?, header_value); - } - } - if let Some(timeout) = request.timeout { request_builder = request_builder.timeout(Duration::from_secs(timeout)); } - let response = if let Some(body) = request.body { - match body { - Body::Bytes(data) => { - request_builder - .body(bytes::Bytes::from(data)) - .send() - .await? - } - Body::Text(text) => { - request_builder - .body(bytes::Bytes::from(text)) - .send() - .await? - } - Body::Json(json) => request_builder.json(&json).send().await?, + if let Some(body) = request.body { + request_builder = match body { + Body::Bytes(data) => request_builder.body(bytes::Bytes::from(data)), + Body::Text(text) => request_builder.body(bytes::Bytes::from(text)), + Body::Json(json) => request_builder.json(&json), Body::Form(form_body) => { let mut form = Vec::new(); for (name, part) in form_body.0 { @@ -183,12 +166,22 @@ impl Client { FormPart::Text(text) => form.push((name, text)), } } - request_builder.form(&form).send().await? + request_builder.form(&form) } + }; + } + + let mut http_request = request_builder.build()?; + if let Some(headers) = request.headers { + for (header, value) in headers.iter() { + http_request.headers_mut().insert( + HeaderName::from_bytes(header.as_bytes())?, + http::header::HeaderValue::from_str(value)?, + ); } - } else { - request_builder.send().await? - }; + } + + let response = self.0.execute(http_request).await?; if response.status().is_success() { Ok(Response(