1use std::rc::Rc;
6use std::str::FromStr;
7
8use cssparser::match_ignore_ascii_case;
9use dom_struct::dom_struct;
10use http::Method as HttpMethod;
11use http::header::{HeaderName, HeaderValue};
12use http::method::InvalidMethod;
13use js::rust::HandleObject;
14use net_traits::ReferrerPolicy as MsgReferrerPolicy;
15use net_traits::fetch::headers::is_forbidden_method;
16use net_traits::request::{
17 CacheMode as NetTraitsRequestCache, CredentialsMode as NetTraitsRequestCredentials,
18 Destination as NetTraitsRequestDestination, Origin, RedirectMode as NetTraitsRequestRedirect,
19 Referrer as NetTraitsRequestReferrer, Request as NetTraitsRequest, RequestBuilder,
20 RequestMode as NetTraitsRequestMode, TraversableForUserPrompts,
21};
22use servo_url::ServoUrl;
23
24use crate::body::{BodyMixin, BodyType, Extractable, consume_body};
25use crate::conversions::Convert;
26use crate::dom::abortsignal::AbortSignal;
27use crate::dom::bindings::cell::DomRefCell;
28use crate::dom::bindings::codegen::Bindings::HeadersBinding::{HeadersInit, HeadersMethods};
29use crate::dom::bindings::codegen::Bindings::RequestBinding::{
30 ReferrerPolicy, RequestCache, RequestCredentials, RequestDestination, RequestInfo, RequestInit,
31 RequestMethods, RequestMode, RequestRedirect,
32};
33use crate::dom::bindings::error::{Error, Fallible};
34use crate::dom::bindings::reflector::{DomGlobal, Reflector, reflect_dom_object_with_proto};
35use crate::dom::bindings::root::{DomRoot, MutNullableDom};
36use crate::dom::bindings::str::{ByteString, DOMString, USVString};
37use crate::dom::bindings::trace::RootedTraceableBox;
38use crate::dom::globalscope::GlobalScope;
39use crate::dom::headers::{Guard, Headers};
40use crate::dom::promise::Promise;
41use crate::dom::readablestream::ReadableStream;
42use crate::script_runtime::CanGc;
43
44#[dom_struct]
45pub(crate) struct Request {
46 reflector_: Reflector,
47 #[no_trace]
48 request: DomRefCell<NetTraitsRequest>,
50 body_stream: MutNullableDom<ReadableStream>,
52 headers: MutNullableDom<Headers>,
54 signal: MutNullableDom<AbortSignal>,
56}
57
58impl Request {
59 fn new_inherited(global: &GlobalScope, url: ServoUrl) -> Request {
60 Request {
61 reflector_: Reflector::new(),
62 request: DomRefCell::new(net_request_from_global(global, url)),
63 body_stream: MutNullableDom::new(None),
64 headers: Default::default(),
65 signal: MutNullableDom::new(None),
66 }
67 }
68
69 fn new(
70 global: &GlobalScope,
71 proto: Option<HandleObject>,
72 url: ServoUrl,
73 can_gc: CanGc,
74 ) -> DomRoot<Request> {
75 reflect_dom_object_with_proto(
76 Box::new(Request::new_inherited(global, url)),
77 global,
78 proto,
79 can_gc,
80 )
81 }
82
83 fn from_net_request(
84 global: &GlobalScope,
85 proto: Option<HandleObject>,
86 net_request: NetTraitsRequest,
87 can_gc: CanGc,
88 ) -> DomRoot<Request> {
89 let r = Request::new(global, proto, net_request.current_url(), can_gc);
90 *r.request.borrow_mut() = net_request;
91 r
92 }
93
94 pub(crate) fn constructor(
96 global: &GlobalScope,
97 proto: Option<HandleObject>,
98 can_gc: CanGc,
99 mut input: RequestInfo,
100 init: &RequestInit,
101 ) -> Fallible<DomRoot<Request>> {
102 let temporary_request: NetTraitsRequest;
104
105 let mut fallback_mode: Option<NetTraitsRequestMode> = None;
107
108 let base_url = global.api_base_url();
110
111 let mut signal: Option<DomRoot<AbortSignal>> = None;
113
114 let mut input_body_is_unusable = false;
116
117 match input {
118 RequestInfo::USVString(USVString(ref usv_string)) => {
120 let parsed_url = base_url.join(usv_string);
122 if parsed_url.is_err() {
124 return Err(Error::Type("Url could not be parsed".to_string()));
125 }
126 let url = parsed_url.unwrap();
128 if includes_credentials(&url) {
129 return Err(Error::Type("Url includes credentials".to_string()));
130 }
131 temporary_request = net_request_from_global(global, url);
133 fallback_mode = Some(NetTraitsRequestMode::CorsMode);
135 },
136 RequestInfo::Request(ref input_request) => {
139 input_body_is_unusable = input_request.is_unusable();
141 temporary_request = input_request.request.borrow().clone();
143 signal = Some(input_request.Signal());
145 },
146 }
147
148 let origin = base_url.origin();
151
152 let mut traversable_for_user_prompts = TraversableForUserPrompts::Client;
154
155 if !init.window.handle().is_null_or_undefined() {
162 return Err(Error::Type("Window is present and is not null".to_string()));
163 }
164
165 if !init.window.handle().is_undefined() {
167 traversable_for_user_prompts = TraversableForUserPrompts::NoTraversable;
168 }
169
170 let mut request: NetTraitsRequest;
172 request = net_request_from_global(global, temporary_request.current_url());
173 request.method = temporary_request.method;
174 request.headers = temporary_request.headers.clone();
175 request.unsafe_request = true;
176 request.traversable_for_user_prompts = traversable_for_user_prompts;
177 request.origin = Origin::Client;
179 request.referrer = temporary_request.referrer;
180 request.referrer_policy = temporary_request.referrer_policy;
181 request.mode = temporary_request.mode;
182 request.credentials_mode = temporary_request.credentials_mode;
183 request.cache_mode = temporary_request.cache_mode;
184 request.redirect_mode = temporary_request.redirect_mode;
185 request.integrity_metadata = temporary_request.integrity_metadata;
186
187 if init.body.is_some() ||
189 init.cache.is_some() ||
190 init.credentials.is_some() ||
191 init.integrity.is_some() ||
192 init.headers.is_some() ||
193 init.method.is_some() ||
194 init.mode.is_some() ||
195 init.redirect.is_some() ||
196 init.referrer.is_some() ||
197 init.referrerPolicy.is_some() ||
198 !init.window.handle().is_undefined()
199 {
200 if request.mode == NetTraitsRequestMode::Navigate {
202 request.mode = NetTraitsRequestMode::SameOrigin;
203 }
204 request.referrer = global.get_referrer();
212 request.referrer_policy = MsgReferrerPolicy::EmptyString;
214 }
219
220 if let Some(init_referrer) = init.referrer.as_ref() {
222 let referrer = &init_referrer.0;
224 if referrer.is_empty() {
226 request.referrer = NetTraitsRequestReferrer::NoReferrer;
227 } else {
229 let parsed_referrer = base_url.join(referrer);
231 if parsed_referrer.is_err() {
233 return Err(Error::Type("Failed to parse referrer url".to_string()));
234 }
235 if let Ok(parsed_referrer) = parsed_referrer {
239 if (parsed_referrer.cannot_be_a_base() &&
240 parsed_referrer.scheme() == "about" &&
241 parsed_referrer.path() == "client") ||
242 parsed_referrer.origin() != origin
243 {
244 request.referrer = global.get_referrer();
246 } else {
247 request.referrer = NetTraitsRequestReferrer::ReferrerUrl(parsed_referrer);
249 }
250 }
251 }
252 }
253
254 if let Some(init_referrerpolicy) = init.referrerPolicy.as_ref() {
256 let init_referrer_policy = (*init_referrerpolicy).convert();
257 request.referrer_policy = init_referrer_policy;
258 }
259
260 let mode = init.mode.as_ref().map(|m| (*m).convert()).or(fallback_mode);
262
263 if let Some(NetTraitsRequestMode::Navigate) = mode {
265 return Err(Error::Type("Request mode is Navigate".to_string()));
266 }
267
268 if let Some(m) = mode {
270 request.mode = m;
271 }
272
273 if let Some(init_credentials) = init.credentials.as_ref() {
275 let credentials = (*init_credentials).convert();
276 request.credentials_mode = credentials;
277 }
278
279 if let Some(init_cache) = init.cache.as_ref() {
281 let cache = (*init_cache).convert();
282 request.cache_mode = cache;
283 }
284
285 if request.cache_mode == NetTraitsRequestCache::OnlyIfCached &&
288 request.mode != NetTraitsRequestMode::SameOrigin
289 {
290 return Err(Error::Type(
291 "Cache is 'only-if-cached' and mode is not 'same-origin'".to_string(),
292 ));
293 }
294
295 if let Some(init_redirect) = init.redirect.as_ref() {
297 let redirect = (*init_redirect).convert();
298 request.redirect_mode = redirect;
299 }
300
301 if let Some(init_integrity) = init.integrity.as_ref() {
303 let integrity = init_integrity.clone().to_string();
304 request.integrity_metadata = integrity;
305 }
306
307 if let Some(init_method) = init.method.as_ref() {
313 if !is_method(init_method) {
315 return Err(Error::Type("Method is not a method".to_string()));
316 }
317 if is_forbidden_method(init_method) {
318 return Err(Error::Type("Method is forbidden".to_string()));
319 }
320 let method = match init_method.as_str() {
322 Some(s) => normalize_method(s)
323 .map_err(|e| Error::Type(format!("Method is not valid: {:?}", e)))?,
324 None => return Err(Error::Type("Method is not a valid UTF8".to_string())),
325 };
326 request.method = method;
328 }
329
330 if let Some(init_signal) = init.signal.as_ref() {
332 signal = init_signal.clone();
333 }
334 let r = Request::from_net_request(global, proto, request, can_gc);
344
345 let signals = signal.map_or(vec![], |s| vec![s]);
347 r.signal
350 .set(Some(&AbortSignal::create_dependent_abort_signal(
351 signals, global, can_gc,
352 )));
353
354 r.headers
360 .or_init(|| Headers::for_request(&r.global(), can_gc));
361
362 let headers_copy = init
366 .headers
367 .as_ref()
368 .map(|possible_header| match possible_header {
369 HeadersInit::ByteStringSequenceSequence(init_sequence) => {
370 HeadersInit::ByteStringSequenceSequence(init_sequence.clone())
371 },
372 HeadersInit::ByteStringByteStringRecord(init_map) => {
373 HeadersInit::ByteStringByteStringRecord(init_map.clone())
374 },
375 });
376
377 if r.request.borrow().mode == NetTraitsRequestMode::NoCors {
388 let borrowed_request = r.request.borrow();
389 if !is_cors_safelisted_method(&borrowed_request.method) {
391 return Err(Error::Type(
392 "The mode is 'no-cors' but the method is not a cors-safelisted method"
393 .to_string(),
394 ));
395 }
396 r.Headers(can_gc).set_guard(Guard::RequestNoCors);
398 }
399
400 match headers_copy {
401 None => {
402 if let RequestInfo::Request(ref input_request) = input {
409 r.Headers(can_gc)
410 .copy_from_headers(input_request.Headers(can_gc))?;
411 }
412 },
413 Some(headers_copy) => r.Headers(can_gc).fill(Some(headers_copy))?,
415 }
416
417 r.request.borrow_mut().headers = r.Headers(can_gc).get_headers_list();
420
421 let input_body = if let RequestInfo::Request(ref mut input_request) = input {
423 let mut input_request_request = input_request.request.borrow_mut();
424 r.body_stream.set(input_request.body().as_deref());
425 input_request_request.body.take()
426 } else {
427 None
428 };
429
430 if init.body.as_ref().is_some_and(|body| body.is_some()) || input_body.is_some() {
433 let req = r.request.borrow();
434 let req_method = &req.method;
435 match *req_method {
436 HttpMethod::GET => {
437 return Err(Error::Type(
438 "Init's body is non-null, and request method is GET".to_string(),
439 ));
440 },
441 HttpMethod::HEAD => {
442 return Err(Error::Type(
443 "Init's body is non-null, and request method is HEAD".to_string(),
444 ));
445 },
446 _ => {},
447 }
448 }
449
450 let mut init_body = None;
452 if let Some(Some(ref input_init_body)) = init.body {
454 let mut body_with_type = input_init_body.extract(global, can_gc)?;
456
457 if let Some(contents) = body_with_type.content_type.take() {
459 let ct_header_name = b"Content-Type";
460 if !r
463 .Headers(can_gc)
464 .Has(ByteString::new(ct_header_name.to_vec()))
465 .unwrap()
466 {
467 let ct_header_val = contents.as_bytes();
468 r.Headers(can_gc).Append(
469 ByteString::new(ct_header_name.to_vec()),
470 ByteString::new(ct_header_val.to_vec()),
471 )?;
472
473 if let Ok(v) = HeaderValue::from_bytes(&ct_header_val) {
477 r.request
478 .borrow_mut()
479 .headers
480 .insert(HeaderName::from_bytes(ct_header_name).unwrap(), v);
481 }
482 }
483 }
484
485 let (net_body, stream) = body_with_type.into_net_request_body();
487 r.body_stream.set(Some(&*stream));
488 init_body = Some(net_body);
489 }
490
491 let final_body = init_body.or(input_body);
498
499 if final_body
501 .as_ref()
502 .is_some_and(|body| body.source_is_null())
503 {
504 let request_mode = &r.request.borrow().mode;
508 if *request_mode != NetTraitsRequestMode::CorsMode &&
509 *request_mode != NetTraitsRequestMode::SameOrigin
510 {
511 return Err(Error::Type(
512 "Request mode must be Cors or SameOrigin".to_string(),
513 ));
514 }
515 }
518
519 if input_body_is_unusable {
526 return Err(Error::Type("Input body is unusable".to_string()));
527 }
528
529 r.request.borrow_mut().body = final_body;
531
532 Ok(r)
533 }
534
535 fn clone_from(r: &Request, can_gc: CanGc) -> Fallible<DomRoot<Request>> {
537 let req = r.request.borrow();
539 let url = req.url();
540 let headers_guard = r.Headers(can_gc).get_guard();
541 let r_clone = Request::new(&r.global(), None, url, can_gc);
542 r_clone.request.borrow_mut().pipeline_id = req.pipeline_id;
543 {
544 let mut borrowed_r_request = r_clone.request.borrow_mut();
545 borrowed_r_request.origin = req.origin.clone();
546 }
547 *r_clone.request.borrow_mut() = req.clone();
548 r_clone
549 .Headers(can_gc)
550 .copy_from_headers(r.Headers(can_gc))?;
551 r_clone.Headers(can_gc).set_guard(headers_guard);
552 Ok(r_clone)
556 }
557
558 pub(crate) fn get_request(&self) -> NetTraitsRequest {
559 self.request.borrow().clone()
560 }
561}
562
563fn net_request_from_global(global: &GlobalScope, url: ServoUrl) -> NetTraitsRequest {
564 RequestBuilder::new(global.webview_id(), url, global.get_referrer())
565 .origin(global.get_url().origin())
566 .pipeline_id(Some(global.pipeline_id()))
567 .https_state(global.get_https_state())
568 .insecure_requests_policy(global.insecure_requests_policy())
569 .has_trustworthy_ancestor_origin(global.has_trustworthy_ancestor_or_current_origin())
570 .policy_container(global.policy_container())
571 .build()
572}
573
574fn normalize_method(m: &str) -> Result<HttpMethod, InvalidMethod> {
576 match_ignore_ascii_case! { m,
577 "delete" => return Ok(HttpMethod::DELETE),
578 "get" => return Ok(HttpMethod::GET),
579 "head" => return Ok(HttpMethod::HEAD),
580 "options" => return Ok(HttpMethod::OPTIONS),
581 "post" => return Ok(HttpMethod::POST),
582 "put" => return Ok(HttpMethod::PUT),
583 _ => (),
584 }
585 debug!("Method: {:?}", m);
586 HttpMethod::from_str(m)
587}
588
589fn is_method(m: &ByteString) -> bool {
591 m.as_str().is_some()
592}
593
594fn is_cors_safelisted_method(m: &HttpMethod) -> bool {
596 m == HttpMethod::GET || m == HttpMethod::HEAD || m == HttpMethod::POST
597}
598
599fn includes_credentials(input: &ServoUrl) -> bool {
601 !input.username().is_empty() || input.password().is_some()
602}
603
604impl RequestMethods<crate::DomTypeHolder> for Request {
605 fn Constructor(
607 global: &GlobalScope,
608 proto: Option<HandleObject>,
609 can_gc: CanGc,
610 input: RequestInfo,
611 init: RootedTraceableBox<RequestInit>,
612 ) -> Fallible<DomRoot<Request>> {
613 Self::constructor(global, proto, can_gc, input, &init)
614 }
615
616 fn Method(&self) -> ByteString {
618 let r = self.request.borrow();
619 ByteString::new(r.method.as_ref().as_bytes().into())
620 }
621
622 fn Url(&self) -> USVString {
624 let r = self.request.borrow();
625 USVString(r.url_list.first().map_or("", |u| u.as_str()).into())
626 }
627
628 fn Headers(&self, can_gc: CanGc) -> DomRoot<Headers> {
630 self.headers
631 .or_init(|| Headers::new(&self.global(), can_gc))
632 }
633
634 fn Destination(&self) -> RequestDestination {
636 self.request.borrow().destination.convert()
637 }
638
639 fn Referrer(&self) -> USVString {
641 let r = self.request.borrow();
642 USVString(match r.referrer {
643 NetTraitsRequestReferrer::NoReferrer => String::from(""),
644 NetTraitsRequestReferrer::Client(_) => String::from("about:client"),
645 NetTraitsRequestReferrer::ReferrerUrl(ref u) => {
646 let u_c = u.clone();
647 u_c.into_string()
648 },
649 })
650 }
651
652 fn ReferrerPolicy(&self) -> ReferrerPolicy {
654 self.request.borrow().referrer_policy.convert()
655 }
656
657 fn Mode(&self) -> RequestMode {
659 self.request.borrow().mode.clone().convert()
660 }
661
662 fn Credentials(&self) -> RequestCredentials {
664 let r = self.request.borrow().clone();
665 r.credentials_mode.convert()
666 }
667
668 fn Cache(&self) -> RequestCache {
670 let r = self.request.borrow().clone();
671 r.cache_mode.convert()
672 }
673
674 fn Redirect(&self) -> RequestRedirect {
676 let r = self.request.borrow().clone();
677 r.redirect_mode.convert()
678 }
679
680 fn Integrity(&self) -> DOMString {
682 let r = self.request.borrow();
683 DOMString::from_string(r.integrity_metadata.clone())
684 }
685
686 fn GetBody(&self) -> Option<DomRoot<ReadableStream>> {
688 self.body()
689 }
690
691 fn BodyUsed(&self) -> bool {
693 self.is_body_used()
694 }
695
696 fn Signal(&self) -> DomRoot<AbortSignal> {
698 self.signal
699 .get()
700 .expect("Should always be initialized in constructor and clone")
701 }
702
703 fn Clone(&self, can_gc: CanGc) -> Fallible<DomRoot<Request>> {
705 if self.is_unusable() {
707 return Err(Error::Type("Request is unusable".to_string()));
708 }
709
710 let cloned_request = Request::clone_from(self, can_gc)?;
712 let signal = self.signal.get().expect("Should always be initialized");
714 let cloned_signal =
717 AbortSignal::create_dependent_abort_signal(vec![signal], &self.global(), can_gc);
718 cloned_request.signal.set(Some(&cloned_signal));
723 Ok(cloned_request)
725 }
726
727 fn Text(&self, can_gc: CanGc) -> Rc<Promise> {
729 consume_body(self, BodyType::Text, can_gc)
730 }
731
732 fn Blob(&self, can_gc: CanGc) -> Rc<Promise> {
734 consume_body(self, BodyType::Blob, can_gc)
735 }
736
737 fn FormData(&self, can_gc: CanGc) -> Rc<Promise> {
739 consume_body(self, BodyType::FormData, can_gc)
740 }
741
742 fn Json(&self, can_gc: CanGc) -> Rc<Promise> {
744 consume_body(self, BodyType::Json, can_gc)
745 }
746
747 fn ArrayBuffer(&self, can_gc: CanGc) -> Rc<Promise> {
749 consume_body(self, BodyType::ArrayBuffer, can_gc)
750 }
751
752 fn Bytes(&self, can_gc: CanGc) -> std::rc::Rc<Promise> {
754 consume_body(self, BodyType::Bytes, can_gc)
755 }
756}
757
758impl BodyMixin for Request {
759 fn is_body_used(&self) -> bool {
760 let body_stream = self.body_stream.get();
761 body_stream
762 .as_ref()
763 .is_some_and(|stream| stream.is_disturbed())
764 }
765
766 fn is_unusable(&self) -> bool {
767 let body_stream = self.body_stream.get();
768 body_stream
769 .as_ref()
770 .is_some_and(|stream| stream.is_disturbed() || stream.is_locked())
771 }
772
773 fn body(&self) -> Option<DomRoot<ReadableStream>> {
774 self.body_stream.get()
775 }
776
777 fn get_mime_type(&self, can_gc: CanGc) -> Vec<u8> {
778 let headers = self.Headers(can_gc);
779 headers.extract_mime_type()
780 }
781}
782
783impl Convert<NetTraitsRequestCache> for RequestCache {
784 fn convert(self) -> NetTraitsRequestCache {
785 match self {
786 RequestCache::Default => NetTraitsRequestCache::Default,
787 RequestCache::No_store => NetTraitsRequestCache::NoStore,
788 RequestCache::Reload => NetTraitsRequestCache::Reload,
789 RequestCache::No_cache => NetTraitsRequestCache::NoCache,
790 RequestCache::Force_cache => NetTraitsRequestCache::ForceCache,
791 RequestCache::Only_if_cached => NetTraitsRequestCache::OnlyIfCached,
792 }
793 }
794}
795
796impl Convert<RequestCache> for NetTraitsRequestCache {
797 fn convert(self) -> RequestCache {
798 match self {
799 NetTraitsRequestCache::Default => RequestCache::Default,
800 NetTraitsRequestCache::NoStore => RequestCache::No_store,
801 NetTraitsRequestCache::Reload => RequestCache::Reload,
802 NetTraitsRequestCache::NoCache => RequestCache::No_cache,
803 NetTraitsRequestCache::ForceCache => RequestCache::Force_cache,
804 NetTraitsRequestCache::OnlyIfCached => RequestCache::Only_if_cached,
805 }
806 }
807}
808
809impl Convert<NetTraitsRequestCredentials> for RequestCredentials {
810 fn convert(self) -> NetTraitsRequestCredentials {
811 match self {
812 RequestCredentials::Omit => NetTraitsRequestCredentials::Omit,
813 RequestCredentials::Same_origin => NetTraitsRequestCredentials::CredentialsSameOrigin,
814 RequestCredentials::Include => NetTraitsRequestCredentials::Include,
815 }
816 }
817}
818
819impl Convert<RequestCredentials> for NetTraitsRequestCredentials {
820 fn convert(self) -> RequestCredentials {
821 match self {
822 NetTraitsRequestCredentials::Omit => RequestCredentials::Omit,
823 NetTraitsRequestCredentials::CredentialsSameOrigin => RequestCredentials::Same_origin,
824 NetTraitsRequestCredentials::Include => RequestCredentials::Include,
825 }
826 }
827}
828
829impl Convert<NetTraitsRequestDestination> for RequestDestination {
830 fn convert(self) -> NetTraitsRequestDestination {
831 match self {
832 RequestDestination::_empty => NetTraitsRequestDestination::None,
833 RequestDestination::Audio => NetTraitsRequestDestination::Audio,
834 RequestDestination::Document => NetTraitsRequestDestination::Document,
835 RequestDestination::Embed => NetTraitsRequestDestination::Embed,
836 RequestDestination::Font => NetTraitsRequestDestination::Font,
837 RequestDestination::Frame => NetTraitsRequestDestination::Frame,
838 RequestDestination::Iframe => NetTraitsRequestDestination::IFrame,
839 RequestDestination::Image => NetTraitsRequestDestination::Image,
840 RequestDestination::Manifest => NetTraitsRequestDestination::Manifest,
841 RequestDestination::Json => NetTraitsRequestDestination::Json,
842 RequestDestination::Object => NetTraitsRequestDestination::Object,
843 RequestDestination::Report => NetTraitsRequestDestination::Report,
844 RequestDestination::Script => NetTraitsRequestDestination::Script,
845 RequestDestination::Sharedworker => NetTraitsRequestDestination::SharedWorker,
846 RequestDestination::Style => NetTraitsRequestDestination::Style,
847 RequestDestination::Track => NetTraitsRequestDestination::Track,
848 RequestDestination::Video => NetTraitsRequestDestination::Video,
849 RequestDestination::Worker => NetTraitsRequestDestination::Worker,
850 RequestDestination::Xslt => NetTraitsRequestDestination::Xslt,
851 }
852 }
853}
854
855impl Convert<RequestDestination> for NetTraitsRequestDestination {
856 fn convert(self) -> RequestDestination {
857 match self {
858 NetTraitsRequestDestination::None => RequestDestination::_empty,
859 NetTraitsRequestDestination::Audio => RequestDestination::Audio,
860 NetTraitsRequestDestination::Document => RequestDestination::Document,
861 NetTraitsRequestDestination::Embed => RequestDestination::Embed,
862 NetTraitsRequestDestination::Font => RequestDestination::Font,
863 NetTraitsRequestDestination::Frame => RequestDestination::Frame,
864 NetTraitsRequestDestination::IFrame => RequestDestination::Iframe,
865 NetTraitsRequestDestination::Image => RequestDestination::Image,
866 NetTraitsRequestDestination::Manifest => RequestDestination::Manifest,
867 NetTraitsRequestDestination::Json => RequestDestination::Json,
868 NetTraitsRequestDestination::Object => RequestDestination::Object,
869 NetTraitsRequestDestination::Report => RequestDestination::Report,
870 NetTraitsRequestDestination::Script => RequestDestination::Script,
871 NetTraitsRequestDestination::ServiceWorker |
872 NetTraitsRequestDestination::AudioWorklet |
873 NetTraitsRequestDestination::PaintWorklet => {
874 panic!("ServiceWorker request destination should not be exposed to DOM")
875 },
876 NetTraitsRequestDestination::SharedWorker => RequestDestination::Sharedworker,
877 NetTraitsRequestDestination::Style => RequestDestination::Style,
878 NetTraitsRequestDestination::Track => RequestDestination::Track,
879 NetTraitsRequestDestination::Video => RequestDestination::Video,
880 NetTraitsRequestDestination::Worker => RequestDestination::Worker,
881 NetTraitsRequestDestination::Xslt => RequestDestination::Xslt,
882 NetTraitsRequestDestination::WebIdentity => RequestDestination::_empty,
883 }
884 }
885}
886
887impl Convert<NetTraitsRequestMode> for RequestMode {
888 fn convert(self) -> NetTraitsRequestMode {
889 match self {
890 RequestMode::Navigate => NetTraitsRequestMode::Navigate,
891 RequestMode::Same_origin => NetTraitsRequestMode::SameOrigin,
892 RequestMode::No_cors => NetTraitsRequestMode::NoCors,
893 RequestMode::Cors => NetTraitsRequestMode::CorsMode,
894 }
895 }
896}
897
898impl Convert<RequestMode> for NetTraitsRequestMode {
899 fn convert(self) -> RequestMode {
900 match self {
901 NetTraitsRequestMode::Navigate => RequestMode::Navigate,
902 NetTraitsRequestMode::SameOrigin => RequestMode::Same_origin,
903 NetTraitsRequestMode::NoCors => RequestMode::No_cors,
904 NetTraitsRequestMode::CorsMode => RequestMode::Cors,
905 NetTraitsRequestMode::WebSocket { .. } => {
906 unreachable!("Websocket request mode should never be exposed to Dom")
907 },
908 }
909 }
910}
911
912impl Convert<MsgReferrerPolicy> for ReferrerPolicy {
913 fn convert(self) -> MsgReferrerPolicy {
914 match self {
915 ReferrerPolicy::_empty => MsgReferrerPolicy::EmptyString,
916 ReferrerPolicy::No_referrer => MsgReferrerPolicy::NoReferrer,
917 ReferrerPolicy::No_referrer_when_downgrade => {
918 MsgReferrerPolicy::NoReferrerWhenDowngrade
919 },
920 ReferrerPolicy::Origin => MsgReferrerPolicy::Origin,
921 ReferrerPolicy::Origin_when_cross_origin => MsgReferrerPolicy::OriginWhenCrossOrigin,
922 ReferrerPolicy::Unsafe_url => MsgReferrerPolicy::UnsafeUrl,
923 ReferrerPolicy::Same_origin => MsgReferrerPolicy::SameOrigin,
924 ReferrerPolicy::Strict_origin => MsgReferrerPolicy::StrictOrigin,
925 ReferrerPolicy::Strict_origin_when_cross_origin => {
926 MsgReferrerPolicy::StrictOriginWhenCrossOrigin
927 },
928 }
929 }
930}
931
932impl Convert<ReferrerPolicy> for MsgReferrerPolicy {
933 fn convert(self) -> ReferrerPolicy {
934 match self {
935 MsgReferrerPolicy::EmptyString => ReferrerPolicy::_empty,
936 MsgReferrerPolicy::NoReferrer => ReferrerPolicy::No_referrer,
937 MsgReferrerPolicy::NoReferrerWhenDowngrade => {
938 ReferrerPolicy::No_referrer_when_downgrade
939 },
940 MsgReferrerPolicy::Origin => ReferrerPolicy::Origin,
941 MsgReferrerPolicy::OriginWhenCrossOrigin => ReferrerPolicy::Origin_when_cross_origin,
942 MsgReferrerPolicy::UnsafeUrl => ReferrerPolicy::Unsafe_url,
943 MsgReferrerPolicy::SameOrigin => ReferrerPolicy::Same_origin,
944 MsgReferrerPolicy::StrictOrigin => ReferrerPolicy::Strict_origin,
945 MsgReferrerPolicy::StrictOriginWhenCrossOrigin => {
946 ReferrerPolicy::Strict_origin_when_cross_origin
947 },
948 }
949 }
950}
951
952impl Convert<NetTraitsRequestRedirect> for RequestRedirect {
953 fn convert(self) -> NetTraitsRequestRedirect {
954 match self {
955 RequestRedirect::Follow => NetTraitsRequestRedirect::Follow,
956 RequestRedirect::Error => NetTraitsRequestRedirect::Error,
957 RequestRedirect::Manual => NetTraitsRequestRedirect::Manual,
958 }
959 }
960}
961
962impl Convert<RequestRedirect> for NetTraitsRequestRedirect {
963 fn convert(self) -> RequestRedirect {
964 match self {
965 NetTraitsRequestRedirect::Follow => RequestRedirect::Follow,
966 NetTraitsRequestRedirect::Error => RequestRedirect::Error,
967 NetTraitsRequestRedirect::Manual => RequestRedirect::Manual,
968 }
969 }
970}