mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Fetch cancellation: Add cancel_chan to FetchContext
This commit is contained in:
parent
b5a205d92e
commit
1dfb125cc9
10 changed files with 22 additions and 16 deletions
|
@ -57,14 +57,14 @@ impl NetworkListener {
|
||||||
Some(ref res_init_) => CoreResourceMsg::FetchRedirect(
|
Some(ref res_init_) => CoreResourceMsg::FetchRedirect(
|
||||||
self.req_init.clone(),
|
self.req_init.clone(),
|
||||||
res_init_.clone(),
|
res_init_.clone(),
|
||||||
ipc_sender),
|
ipc_sender, None),
|
||||||
None => {
|
None => {
|
||||||
set_default_accept(Destination::Document, &mut listener.req_init.headers);
|
set_default_accept(Destination::Document, &mut listener.req_init.headers);
|
||||||
set_default_accept_language(&mut listener.req_init.headers);
|
set_default_accept_language(&mut listener.req_init.headers);
|
||||||
|
|
||||||
CoreResourceMsg::Fetch(
|
CoreResourceMsg::Fetch(
|
||||||
listener.req_init.clone(),
|
listener.req_init.clone(),
|
||||||
FetchChannels::ResponseMsg(ipc_sender))
|
FetchChannels::ResponseMsg(ipc_sender, None))
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ use hyper::header::{Header, HeaderFormat, HeaderView, Headers, Referer as Refere
|
||||||
use hyper::method::Method;
|
use hyper::method::Method;
|
||||||
use hyper::mime::{Mime, SubLevel, TopLevel};
|
use hyper::mime::{Mime, SubLevel, TopLevel};
|
||||||
use hyper::status::StatusCode;
|
use hyper::status::StatusCode;
|
||||||
|
use ipc_channel::ipc::IpcReceiver;
|
||||||
use mime_guess::guess_mime_type;
|
use mime_guess::guess_mime_type;
|
||||||
use net_traits::{FetchTaskTarget, NetworkError, ReferrerPolicy};
|
use net_traits::{FetchTaskTarget, NetworkError, ReferrerPolicy};
|
||||||
use net_traits::request::{CredentialsMode, Destination, Referrer, Request, RequestMode};
|
use net_traits::request::{CredentialsMode, Destination, Referrer, Request, RequestMode};
|
||||||
|
@ -43,6 +44,7 @@ pub struct FetchContext {
|
||||||
pub user_agent: Cow<'static, str>,
|
pub user_agent: Cow<'static, str>,
|
||||||
pub devtools_chan: Option<Sender<DevtoolsControlMsg>>,
|
pub devtools_chan: Option<Sender<DevtoolsControlMsg>>,
|
||||||
pub filemanager: FileManager,
|
pub filemanager: FileManager,
|
||||||
|
pub cancel_chan: Option<IpcReceiver<()>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>;
|
pub type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>;
|
||||||
|
|
|
@ -157,14 +157,14 @@ impl ResourceChannelManager {
|
||||||
match msg {
|
match msg {
|
||||||
CoreResourceMsg::Fetch(req_init, channels) => {
|
CoreResourceMsg::Fetch(req_init, channels) => {
|
||||||
match channels {
|
match channels {
|
||||||
FetchChannels::ResponseMsg(sender) =>
|
FetchChannels::ResponseMsg(sender, cancel_chan) =>
|
||||||
self.resource_manager.fetch(req_init, None, sender, http_state),
|
self.resource_manager.fetch(req_init, None, sender, http_state, cancel_chan),
|
||||||
FetchChannels::WebSocket { event_sender, action_receiver } =>
|
FetchChannels::WebSocket { event_sender, action_receiver } =>
|
||||||
self.resource_manager.websocket_connect(req_init, event_sender, action_receiver, http_state),
|
self.resource_manager.websocket_connect(req_init, event_sender, action_receiver, http_state),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CoreResourceMsg::FetchRedirect(req_init, res_init, sender) =>
|
CoreResourceMsg::FetchRedirect(req_init, res_init, sender, cancel_chan) =>
|
||||||
self.resource_manager.fetch(req_init, Some(res_init), sender, http_state),
|
self.resource_manager.fetch(req_init, Some(res_init), sender, http_state, cancel_chan),
|
||||||
CoreResourceMsg::SetCookieForUrl(request, cookie, source) =>
|
CoreResourceMsg::SetCookieForUrl(request, cookie, source) =>
|
||||||
self.resource_manager.set_cookie_for_url(&request, cookie.into_inner(), source, http_state),
|
self.resource_manager.set_cookie_for_url(&request, cookie.into_inner(), source, http_state),
|
||||||
CoreResourceMsg::SetCookiesForUrl(request, cookies, source) => {
|
CoreResourceMsg::SetCookiesForUrl(request, cookies, source) => {
|
||||||
|
@ -329,7 +329,8 @@ impl CoreResourceManager {
|
||||||
req_init: RequestInit,
|
req_init: RequestInit,
|
||||||
res_init_: Option<ResponseInit>,
|
res_init_: Option<ResponseInit>,
|
||||||
mut sender: IpcSender<FetchResponseMsg>,
|
mut sender: IpcSender<FetchResponseMsg>,
|
||||||
http_state: &Arc<HttpState>) {
|
http_state: &Arc<HttpState>,
|
||||||
|
cancel_chan: Option<IpcReceiver<()>>) {
|
||||||
let http_state = http_state.clone();
|
let http_state = http_state.clone();
|
||||||
let ua = self.user_agent.clone();
|
let ua = self.user_agent.clone();
|
||||||
let dc = self.devtools_chan.clone();
|
let dc = self.devtools_chan.clone();
|
||||||
|
@ -346,6 +347,7 @@ impl CoreResourceManager {
|
||||||
user_agent: ua,
|
user_agent: ua,
|
||||||
devtools_chan: dc,
|
devtools_chan: dc,
|
||||||
filemanager: filemanager,
|
filemanager: filemanager,
|
||||||
|
cancel_chan: cancel_chan,
|
||||||
};
|
};
|
||||||
|
|
||||||
match res_init_ {
|
match res_init_ {
|
||||||
|
|
|
@ -342,7 +342,7 @@ pub enum WebSocketNetworkEvent {
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize)]
|
||||||
/// IPC channels to communicate with the script thread about network or DOM events.
|
/// IPC channels to communicate with the script thread about network or DOM events.
|
||||||
pub enum FetchChannels {
|
pub enum FetchChannels {
|
||||||
ResponseMsg(IpcSender<FetchResponseMsg>),
|
ResponseMsg(IpcSender<FetchResponseMsg>, /* cancel_chan */ Option<IpcReceiver<()>>),
|
||||||
WebSocket {
|
WebSocket {
|
||||||
event_sender: IpcSender<WebSocketNetworkEvent>,
|
event_sender: IpcSender<WebSocketNetworkEvent>,
|
||||||
action_receiver: IpcReceiver<WebSocketDomAction>,
|
action_receiver: IpcReceiver<WebSocketDomAction>,
|
||||||
|
@ -353,7 +353,7 @@ pub enum FetchChannels {
|
||||||
pub enum CoreResourceMsg {
|
pub enum CoreResourceMsg {
|
||||||
Fetch(RequestInit, FetchChannels),
|
Fetch(RequestInit, FetchChannels),
|
||||||
/// Initiate a fetch in response to processing a redirection
|
/// Initiate a fetch in response to processing a redirection
|
||||||
FetchRedirect(RequestInit, ResponseInit, IpcSender<FetchResponseMsg>),
|
FetchRedirect(RequestInit, ResponseInit, IpcSender<FetchResponseMsg>, /* cancel_chan */ Option<IpcReceiver<()>>),
|
||||||
/// Store a cookie for a given originating URL
|
/// Store a cookie for a given originating URL
|
||||||
SetCookieForUrl(ServoUrl, Serde<Cookie<'static>>, CookieSource),
|
SetCookieForUrl(ServoUrl, Serde<Cookie<'static>>, CookieSource),
|
||||||
/// Store a set of cookies for a given originating URL
|
/// Store a set of cookies for a given originating URL
|
||||||
|
@ -383,7 +383,7 @@ pub fn fetch_async<F>(request: RequestInit, core_resource_thread: &CoreResourceT
|
||||||
ROUTER.add_route(action_receiver.to_opaque(),
|
ROUTER.add_route(action_receiver.to_opaque(),
|
||||||
Box::new(move |message| f(message.to().unwrap())));
|
Box::new(move |message| f(message.to().unwrap())));
|
||||||
core_resource_thread.send(
|
core_resource_thread.send(
|
||||||
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender))).unwrap();
|
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender, None))).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Deserialize, MallocSizeOf, Serialize)]
|
#[derive(Clone, Deserialize, MallocSizeOf, Serialize)]
|
||||||
|
@ -478,7 +478,7 @@ pub fn load_whole_resource(request: RequestInit,
|
||||||
-> Result<(Metadata, Vec<u8>), NetworkError> {
|
-> Result<(Metadata, Vec<u8>), NetworkError> {
|
||||||
let (action_sender, action_receiver) = ipc::channel().unwrap();
|
let (action_sender, action_receiver) = ipc::channel().unwrap();
|
||||||
core_resource_thread.send(
|
core_resource_thread.send(
|
||||||
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender))).unwrap();
|
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender, None))).unwrap();
|
||||||
|
|
||||||
let mut buf = vec![];
|
let mut buf = vec![];
|
||||||
let mut metadata = None;
|
let mut metadata = None;
|
||||||
|
|
|
@ -126,7 +126,7 @@ impl DocumentLoader {
|
||||||
request: RequestInit,
|
request: RequestInit,
|
||||||
fetch_target: IpcSender<FetchResponseMsg>) {
|
fetch_target: IpcSender<FetchResponseMsg>) {
|
||||||
self.resource_threads.sender().send(
|
self.resource_threads.sender().send(
|
||||||
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(fetch_target))).unwrap();
|
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(fetch_target, None))).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Mark an in-progress network request complete.
|
/// Mark an in-progress network request complete.
|
||||||
|
|
|
@ -491,7 +491,7 @@ impl EventSource {
|
||||||
listener.notify_fetch(message.to().unwrap());
|
listener.notify_fetch(message.to().unwrap());
|
||||||
}));
|
}));
|
||||||
global.core_resource_thread().send(
|
global.core_resource_thread().send(
|
||||||
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender))).unwrap();
|
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender, None))).unwrap();
|
||||||
// Step 13
|
// Step 13
|
||||||
Ok(ev)
|
Ok(ev)
|
||||||
}
|
}
|
||||||
|
@ -555,6 +555,6 @@ impl EventSourceTimeoutCallback {
|
||||||
}
|
}
|
||||||
// Step 5.4
|
// Step 5.4
|
||||||
global.core_resource_thread().send(
|
global.core_resource_thread().send(
|
||||||
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(self.action_sender))).unwrap();
|
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(self.action_sender, None))).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -264,7 +264,7 @@ impl XMLHttpRequest {
|
||||||
listener.notify_fetch(message.to().unwrap());
|
listener.notify_fetch(message.to().unwrap());
|
||||||
}));
|
}));
|
||||||
global.core_resource_thread().send(
|
global.core_resource_thread().send(
|
||||||
Fetch(init, FetchChannels::ResponseMsg(action_sender))).unwrap();
|
Fetch(init, FetchChannels::ResponseMsg(action_sender, None))).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ pub fn Fetch(global: &GlobalScope, input: RequestInfo, init: RootedTraceableBox<
|
||||||
listener.notify_fetch(message.to().unwrap());
|
listener.notify_fetch(message.to().unwrap());
|
||||||
}));
|
}));
|
||||||
core_resource_thread.send(
|
core_resource_thread.send(
|
||||||
NetTraitsFetch(request_init, FetchChannels::ResponseMsg(action_sender))).unwrap();
|
NetTraitsFetch(request_init, FetchChannels::ResponseMsg(action_sender, None))).unwrap();
|
||||||
|
|
||||||
promise
|
promise
|
||||||
}
|
}
|
||||||
|
|
|
@ -538,6 +538,7 @@ fn test_fetch_with_hsts() {
|
||||||
user_agent: DEFAULT_USER_AGENT.into(),
|
user_agent: DEFAULT_USER_AGENT.into(),
|
||||||
devtools_chan: None,
|
devtools_chan: None,
|
||||||
filemanager: FileManager::new(),
|
filemanager: FileManager::new(),
|
||||||
|
cancel_chan: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -61,6 +61,7 @@ fn new_fetch_context(dc: Option<Sender<DevtoolsControlMsg>>) -> FetchContext {
|
||||||
user_agent: DEFAULT_USER_AGENT.into(),
|
user_agent: DEFAULT_USER_AGENT.into(),
|
||||||
devtools_chan: dc,
|
devtools_chan: dc,
|
||||||
filemanager: FileManager::new(),
|
filemanager: FileManager::new(),
|
||||||
|
cancel_chan: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl FetchTaskTarget for FetchResponseCollector {
|
impl FetchTaskTarget for FetchResponseCollector {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue