Skip to content

Commit 1006c1c

Browse files
authored
fix(core): HTTP headers being overwritten by reqwest, closes #2032 (#2036)
1 parent 285bf64 commit 1006c1c

3 files changed

Lines changed: 29 additions & 27 deletions

File tree

.changes/fix-reqwest-headers.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri": patch
3+
---
4+
5+
Fixes HTTP API headers being overwritten when using the `reqwest` client.

core/tauri/src/api/error.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ pub enum Error {
3838
/// HTTP method error.
3939
#[error("{0}")]
4040
HttpMethod(#[from] http::method::InvalidMethod),
41-
/// Invalid HTTO header.
41+
/// Invalid HTTP header value.
42+
#[cfg(feature = "reqwest-client")]
43+
#[error("{0}")]
44+
HttpHeaderValue(#[from] http::header::InvalidHeaderValue),
45+
/// Invalid HTTP header value.
4246
#[error("{0}")]
4347
HttpHeader(#[from] http::header::InvalidHeaderName),
4448
/// Failed to serialize header value as string.

core/tauri/src/api/http.rs

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -148,32 +148,15 @@ impl Client {
148148
request_builder = request_builder.query(&query);
149149
}
150150

151-
if let Some(headers) = request.headers {
152-
for (header, header_value) in headers.iter() {
153-
request_builder =
154-
request_builder.header(HeaderName::from_bytes(header.as_bytes())?, header_value);
155-
}
156-
}
157-
158151
if let Some(timeout) = request.timeout {
159152
request_builder = request_builder.timeout(Duration::from_secs(timeout));
160153
}
161154

162-
let response = if let Some(body) = request.body {
163-
match body {
164-
Body::Bytes(data) => {
165-
request_builder
166-
.body(bytes::Bytes::from(data))
167-
.send()
168-
.await?
169-
}
170-
Body::Text(text) => {
171-
request_builder
172-
.body(bytes::Bytes::from(text))
173-
.send()
174-
.await?
175-
}
176-
Body::Json(json) => request_builder.json(&json).send().await?,
155+
if let Some(body) = request.body {
156+
request_builder = match body {
157+
Body::Bytes(data) => request_builder.body(bytes::Bytes::from(data)),
158+
Body::Text(text) => request_builder.body(bytes::Bytes::from(text)),
159+
Body::Json(json) => request_builder.json(&json),
177160
Body::Form(form_body) => {
178161
let mut form = Vec::new();
179162
for (name, part) in form_body.0 {
@@ -183,12 +166,22 @@ impl Client {
183166
FormPart::Text(text) => form.push((name, text)),
184167
}
185168
}
186-
request_builder.form(&form).send().await?
169+
request_builder.form(&form)
187170
}
171+
};
172+
}
173+
174+
let mut http_request = request_builder.build()?;
175+
if let Some(headers) = request.headers {
176+
for (header, value) in headers.iter() {
177+
http_request.headers_mut().insert(
178+
HeaderName::from_bytes(header.as_bytes())?,
179+
http::header::HeaderValue::from_str(value)?,
180+
);
188181
}
189-
} else {
190-
request_builder.send().await?
191-
};
182+
}
183+
184+
let response = self.0.execute(http_request).await?;
192185

193186
if response.status().is_success() {
194187
Ok(Response(

0 commit comments

Comments
 (0)