Skip to content

Commit 0f739db

Browse files
feat(http): allow setting origin for unsafe headers (#1392)
* feat(http): allow setting `origin` for unsafe headers closes #1389 * clippy * Update .changes/http-origin-unsafe.md Co-authored-by: Lucas Fernandes Nogueira <[email protected]> * Update commands.rs * set origin not full url --------- Co-authored-by: Lucas Fernandes Nogueira <[email protected]>
1 parent 554cb90 commit 0f739db

File tree

2 files changed

+45
-24
lines changed

2 files changed

+45
-24
lines changed

.changes/http-origin-unsafe.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"http": "patch"
3+
"http-js": "patch"
4+
---
5+
6+
Allow setting `Origin` header when `unsafe-headers` feature flag is active.

plugins/http/src/commands.rs

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -201,29 +201,7 @@ pub async fn fetch<R: Runtime>(
201201
for (name, value) in &headers {
202202
let name = HeaderName::from_bytes(name.as_bytes())?;
203203
#[cfg(not(feature = "unsafe-headers"))]
204-
if matches!(
205-
name,
206-
// forbidden headers per fetch spec https://fetch.spec.whatwg.org/#terminology-headers
207-
header::ACCEPT_CHARSET
208-
| header::ACCEPT_ENCODING
209-
| header::ACCESS_CONTROL_REQUEST_HEADERS
210-
| header::ACCESS_CONTROL_REQUEST_METHOD
211-
| header::CONNECTION
212-
| header::CONTENT_LENGTH
213-
| header::COOKIE
214-
| header::DATE
215-
| header::DNT
216-
| header::EXPECT
217-
| header::HOST
218-
| header::ORIGIN
219-
| header::REFERER
220-
| header::SET_COOKIE
221-
| header::TE
222-
| header::TRAILER
223-
| header::TRANSFER_ENCODING
224-
| header::UPGRADE
225-
| header::VIA
226-
) {
204+
if is_unsafe_header(&name) {
227205
continue;
228206
}
229207

@@ -246,7 +224,14 @@ pub async fn fetch<R: Runtime>(
246224
request = request.header(header::USER_AGENT, "tauri-plugin-http");
247225
}
248226

249-
request = request.header(header::ORIGIN, webview.url()?.as_str());
227+
if !(cfg!(feature = "unsafe-headers")
228+
&& headers.contains_key(header::ORIGIN.as_str()))
229+
{
230+
if let Ok(url) = webview.url() {
231+
request =
232+
request.header(header::ORIGIN, url.origin().ascii_serialization());
233+
}
234+
}
250235

251236
if let Some(data) = data {
252237
request = request.body(data);
@@ -343,3 +328,33 @@ pub(crate) async fn fetch_read_body<R: Runtime>(
343328
let res = Arc::into_inner(res).unwrap().0;
344329
Ok(tauri::ipc::Response::new(res.bytes().await?.to_vec()))
345330
}
331+
332+
// forbidden headers per fetch spec https://fetch.spec.whatwg.org/#terminology-headers
333+
#[cfg(not(feature = "unsafe-headers"))]
334+
fn is_unsafe_header(header: &HeaderName) -> bool {
335+
matches!(
336+
*header,
337+
header::ACCEPT_CHARSET
338+
| header::ACCEPT_ENCODING
339+
| header::ACCESS_CONTROL_REQUEST_HEADERS
340+
| header::ACCESS_CONTROL_REQUEST_METHOD
341+
| header::CONNECTION
342+
| header::CONTENT_LENGTH
343+
| header::COOKIE
344+
| header::DATE
345+
| header::DNT
346+
| header::EXPECT
347+
| header::HOST
348+
| header::ORIGIN
349+
| header::REFERER
350+
| header::SET_COOKIE
351+
| header::TE
352+
| header::TRAILER
353+
| header::TRANSFER_ENCODING
354+
| header::UPGRADE
355+
| header::VIA
356+
) || {
357+
let lower = header.as_str().to_lowercase();
358+
lower.starts_with("proxy-") || lower.starts_with("sec-")
359+
}
360+
}

0 commit comments

Comments
 (0)