mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Rename net/fetch/request.rs to net/fetch/methods.rs and move Request to net_traits
This commit is contained in:
parent
eb7b9309dd
commit
a53661f6c8
5 changed files with 157 additions and 147 deletions
|
@ -15,159 +15,18 @@ use hyper::header::{QualityItem, q, qitem, Referer as RefererHeader, UserAgent};
|
||||||
use hyper::method::Method;
|
use hyper::method::Method;
|
||||||
use hyper::mime::{Attr, Mime, SubLevel, TopLevel, Value};
|
use hyper::mime::{Attr, Mime, SubLevel, TopLevel, Value};
|
||||||
use hyper::status::StatusCode;
|
use hyper::status::StatusCode;
|
||||||
|
use net_traits::request::{CacheMode, Context, ContextFrameType, CredentialsMode};
|
||||||
|
use net_traits::request::{RedirectMode, Referer, Request, RequestMode, ResponseTainting};
|
||||||
use net_traits::response::{CacheState, HttpsState, Response, ResponseType, TerminationReason};
|
use net_traits::response::{CacheState, HttpsState, Response, ResponseType, TerminationReason};
|
||||||
use net_traits::{AsyncFetchListener, Metadata};
|
use net_traits::{AsyncFetchListener, Metadata};
|
||||||
use resource_thread::CancellationListener;
|
use resource_thread::CancellationListener;
|
||||||
use std::ascii::AsciiExt;
|
use std::ascii::AsciiExt;
|
||||||
use std::cell::{Cell, RefCell};
|
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use url::{Origin, Url, UrlParser};
|
use url::{Origin, Url, UrlParser};
|
||||||
use util::thread::spawn_named;
|
use util::thread::spawn_named;
|
||||||
|
|
||||||
/// 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<Method>,
|
|
||||||
// Use the last method on url_list to act as spec url field
|
|
||||||
pub url_list: RefCell<Vec<Url>>,
|
|
||||||
pub headers: RefCell<Headers>,
|
|
||||||
pub unsafe_request: bool,
|
|
||||||
pub body: Option<Vec<u8>>,
|
|
||||||
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<bool>,
|
|
||||||
pub context: Context,
|
|
||||||
pub context_frame_type: ContextFrameType,
|
|
||||||
pub origin: Option<Url>, // FIXME: Use Url::Origin
|
|
||||||
pub force_origin_header: bool,
|
|
||||||
pub omit_origin_header: bool,
|
|
||||||
pub same_origin_data: Cell<bool>,
|
|
||||||
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<CacheMode>,
|
|
||||||
pub redirect_mode: RedirectMode,
|
|
||||||
pub redirect_count: Cell<u32>,
|
|
||||||
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,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_last_url_string(&self) -> String {
|
|
||||||
self.url_list.borrow().last().unwrap().serialize()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn current_url(&self) -> Url {
|
|
||||||
self.url_list.borrow().last().unwrap().clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn fetch_async(request: Request, cors_flag: bool, listener: Box<AsyncFetchListener + Send>) {
|
pub fn fetch_async(request: Request, cors_flag: bool, listener: Box<AsyncFetchListener + Send>) {
|
||||||
spawn_named(format!("fetch for {:?}", request.get_last_url_string()), move || {
|
spawn_named(format!("fetch for {:?}", request.get_last_url_string()), move || {
|
||||||
let request = Rc::new(request);
|
let request = Rc::new(request);
|
|
@ -46,6 +46,6 @@ pub mod websocket_loader;
|
||||||
pub mod fetch {
|
pub mod fetch {
|
||||||
#![allow(dead_code, unused)] // XXXManishearth this is only temporary until the Fetch mod starts being used
|
#![allow(dead_code, unused)] // XXXManishearth this is only temporary until the Fetch mod starts being used
|
||||||
pub mod cors_cache;
|
pub mod cors_cache;
|
||||||
pub mod request;
|
pub mod methods;
|
||||||
pub mod response;
|
pub mod response;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ use websocket::header;
|
||||||
pub mod hosts;
|
pub mod hosts;
|
||||||
pub mod image_cache_thread;
|
pub mod image_cache_thread;
|
||||||
pub mod net_error_list;
|
pub mod net_error_list;
|
||||||
|
pub mod request;
|
||||||
pub mod response;
|
pub mod response;
|
||||||
pub mod storage_thread;
|
pub mod storage_thread;
|
||||||
|
|
||||||
|
|
150
components/net_traits/request.rs
Normal file
150
components/net_traits/request.rs
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
/* 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<Method>,
|
||||||
|
// Use the last method on url_list to act as spec url field
|
||||||
|
pub url_list: RefCell<Vec<Url>>,
|
||||||
|
pub headers: RefCell<Headers>,
|
||||||
|
pub unsafe_request: bool,
|
||||||
|
pub body: Option<Vec<u8>>,
|
||||||
|
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<bool>,
|
||||||
|
pub context: Context,
|
||||||
|
pub context_frame_type: ContextFrameType,
|
||||||
|
pub origin: Option<Url>, // FIXME: Use Url::Origin
|
||||||
|
pub force_origin_header: bool,
|
||||||
|
pub omit_origin_header: bool,
|
||||||
|
pub same_origin_data: Cell<bool>,
|
||||||
|
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<CacheMode>,
|
||||||
|
pub redirect_mode: RedirectMode,
|
||||||
|
pub redirect_count: Cell<u32>,
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,8 +4,9 @@
|
||||||
|
|
||||||
use hyper::server::{Listening, Server};
|
use hyper::server::{Listening, Server};
|
||||||
use hyper::server::{Request as HyperRequest, Response as HyperResponse};
|
use hyper::server::{Request as HyperRequest, Response as HyperResponse};
|
||||||
use net::fetch::request::{Context, fetch, Referer, Request};
|
use net::fetch::methods::fetch;
|
||||||
use net_traits::response::{Response};
|
use net_traits::request::{Context, Referer, Request};
|
||||||
|
use net_traits::response::Response;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
|
@ -24,7 +25,6 @@ fn make_server(message: &'static [u8]) -> (Listening, Url) {
|
||||||
(server, url)
|
(server, url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_fetch_response_is_not_network_error() {
|
fn test_fetch_response_is_not_network_error() {
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue