@@ -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