@@ -201,29 +201,7 @@ pub async fn fetch<R: Runtime>(
201
201
for ( name, value) in & headers {
202
202
let name = HeaderName :: from_bytes ( name. as_bytes ( ) ) ?;
203
203
#[ 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) {
227
205
continue ;
228
206
}
229
207
@@ -246,7 +224,14 @@ pub async fn fetch<R: Runtime>(
246
224
request = request. header ( header:: USER_AGENT , "tauri-plugin-http" ) ;
247
225
}
248
226
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
+ }
250
235
251
236
if let Some ( data) = data {
252
237
request = request. body ( data) ;
@@ -343,3 +328,33 @@ pub(crate) async fn fetch_read_body<R: Runtime>(
343
328
let res = Arc :: into_inner ( res) . unwrap ( ) . 0 ;
344
329
Ok ( tauri:: ipc:: Response :: new ( res. bytes ( ) . await ?. to_vec ( ) ) )
345
330
}
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