/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use hyper::header::Headers; use hyper::method::Method; use std::cell::{Cell, RefCell}; use url::Url; /// A [request context](https://fetch.spec.whatwg.org/#concept-request-context) #[derive(Copy, Clone, PartialEq)] pub enum Context { Audio, Beacon, CSPreport, Download, Embed, Eventsource, Favicon, Fetch, Font, Form, Frame, Hyperlink, IFrame, Image, ImageSet, Import, Internal, Location, Manifest, MetaRefresh, Object, Ping, Plugin, Prefetch, PreRender, Script, ServiceWorker, SharedWorker, Subresource, Style, Track, Video, Worker, XMLHttpRequest, XSLT } /// A [request context frame type](https://fetch.spec.whatwg.org/#concept-request-context-frame-type) #[derive(Copy, Clone, PartialEq)] pub enum ContextFrameType { Auxiliary, TopLevel, Nested, ContextNone } /// A [referer](https://fetch.spec.whatwg.org/#concept-request-referrer) #[derive(Clone, PartialEq)] pub enum Referer { NoReferer, Client, RefererUrl(Url) } /// A [request mode](https://fetch.spec.whatwg.org/#concept-request-mode) #[derive(Copy, Clone, PartialEq)] pub enum RequestMode { SameOrigin, NoCORS, CORSMode, ForcedPreflightMode } /// Request [credentials mode](https://fetch.spec.whatwg.org/#concept-request-credentials-mode) #[derive(Copy, Clone, PartialEq)] pub enum CredentialsMode { Omit, CredentialsSameOrigin, Include } /// [Cache mode](https://fetch.spec.whatwg.org/#concept-request-cache-mode) #[derive(Copy, Clone, PartialEq)] pub enum CacheMode { Default, NoStore, Reload, NoCache, ForceCache, OnlyIfCached } /// [Redirect mode](https://fetch.spec.whatwg.org/#concept-request-redirect-mode) #[derive(Copy, Clone, PartialEq)] pub enum RedirectMode { Follow, Error, Manual } /// [Response tainting](https://fetch.spec.whatwg.org/#concept-request-response-tainting) #[derive(Copy, Clone, PartialEq)] pub enum ResponseTainting { Basic, CORSTainting, Opaque } /// A [Request](https://fetch.spec.whatwg.org/#requests) as defined by the Fetch spec #[derive(Clone)] pub struct Request { pub method: RefCell, // Use the last method on url_list to act as spec url field pub url_list: RefCell>, pub headers: RefCell, pub unsafe_request: bool, pub body: Option>, pub preserve_content_codings: bool, // pub client: GlobalRef, // XXXManishearth copy over only the relevant fields of the global scope, // not the entire scope to avoid the libscript dependency pub is_service_worker_global_scope: bool, pub skip_service_worker: Cell, pub context: Context, pub context_frame_type: ContextFrameType, pub origin: Option, // FIXME: Use Url::Origin pub force_origin_header: bool, pub omit_origin_header: bool, pub same_origin_data: Cell, pub referer: Referer, pub authentication: bool, pub sync: bool, pub mode: RequestMode, pub credentials_mode: CredentialsMode, pub use_url_credentials: bool, pub cache_mode: Cell, pub redirect_mode: RedirectMode, pub redirect_count: Cell, pub response_tainting: ResponseTainting } impl Request { pub fn new(url: Url, context: Context, is_service_worker_global_scope: bool) -> Request { Request { method: RefCell::new(Method::Get), url_list: RefCell::new(vec![url]), headers: RefCell::new(Headers::new()), unsafe_request: false, body: None, preserve_content_codings: false, is_service_worker_global_scope: is_service_worker_global_scope, skip_service_worker: Cell::new(false), context: context, context_frame_type: ContextFrameType::ContextNone, origin: None, force_origin_header: false, omit_origin_header: false, same_origin_data: Cell::new(false), referer: Referer::Client, authentication: false, sync: false, mode: RequestMode::NoCORS, credentials_mode: CredentialsMode::Omit, use_url_credentials: false, cache_mode: Cell::new(CacheMode::Default), redirect_mode: RedirectMode::Follow, redirect_count: Cell::new(0), response_tainting: ResponseTainting::Basic, } } pub fn get_last_url_string(&self) -> String { self.url_list.borrow().last().unwrap().serialize() } pub fn current_url(&self) -> Url { self.url_list.borrow().last().unwrap().clone() } }