mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +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(
|
||||
self.req_init.clone(),
|
||||
res_init_.clone(),
|
||||
ipc_sender),
|
||||
ipc_sender, None),
|
||||
None => {
|
||||
set_default_accept(Destination::Document, &mut listener.req_init.headers);
|
||||
set_default_accept_language(&mut listener.req_init.headers);
|
||||
|
||||
CoreResourceMsg::Fetch(
|
||||
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::mime::{Mime, SubLevel, TopLevel};
|
||||
use hyper::status::StatusCode;
|
||||
use ipc_channel::ipc::IpcReceiver;
|
||||
use mime_guess::guess_mime_type;
|
||||
use net_traits::{FetchTaskTarget, NetworkError, ReferrerPolicy};
|
||||
use net_traits::request::{CredentialsMode, Destination, Referrer, Request, RequestMode};
|
||||
|
@ -43,6 +44,7 @@ pub struct FetchContext {
|
|||
pub user_agent: Cow<'static, str>,
|
||||
pub devtools_chan: Option<Sender<DevtoolsControlMsg>>,
|
||||
pub filemanager: FileManager,
|
||||
pub cancel_chan: Option<IpcReceiver<()>>,
|
||||
}
|
||||
|
||||
pub type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>;
|
||||
|
|
|
@ -157,14 +157,14 @@ impl ResourceChannelManager {
|
|||
match msg {
|
||||
CoreResourceMsg::Fetch(req_init, channels) => {
|
||||
match channels {
|
||||
FetchChannels::ResponseMsg(sender) =>
|
||||
self.resource_manager.fetch(req_init, None, sender, http_state),
|
||||
FetchChannels::ResponseMsg(sender, cancel_chan) =>
|
||||
self.resource_manager.fetch(req_init, None, sender, http_state, cancel_chan),
|
||||
FetchChannels::WebSocket { event_sender, action_receiver } =>
|
||||
self.resource_manager.websocket_connect(req_init, event_sender, action_receiver, http_state),
|
||||
}
|
||||
}
|
||||
CoreResourceMsg::FetchRedirect(req_init, res_init, sender) =>
|
||||
self.resource_manager.fetch(req_init, Some(res_init), sender, http_state),
|
||||
CoreResourceMsg::FetchRedirect(req_init, res_init, sender, cancel_chan) =>
|
||||
self.resource_manager.fetch(req_init, Some(res_init), sender, http_state, cancel_chan),
|
||||
CoreResourceMsg::SetCookieForUrl(request, cookie, source) =>
|
||||
self.resource_manager.set_cookie_for_url(&request, cookie.into_inner(), source, http_state),
|
||||
CoreResourceMsg::SetCookiesForUrl(request, cookies, source) => {
|
||||
|
@ -329,7 +329,8 @@ impl CoreResourceManager {
|
|||
req_init: RequestInit,
|
||||
res_init_: Option<ResponseInit>,
|
||||
mut sender: IpcSender<FetchResponseMsg>,
|
||||
http_state: &Arc<HttpState>) {
|
||||
http_state: &Arc<HttpState>,
|
||||
cancel_chan: Option<IpcReceiver<()>>) {
|
||||
let http_state = http_state.clone();
|
||||
let ua = self.user_agent.clone();
|
||||
let dc = self.devtools_chan.clone();
|
||||
|
@ -346,6 +347,7 @@ impl CoreResourceManager {
|
|||
user_agent: ua,
|
||||
devtools_chan: dc,
|
||||
filemanager: filemanager,
|
||||
cancel_chan: cancel_chan,
|
||||
};
|
||||
|
||||
match res_init_ {
|
||||
|
|
|
@ -342,7 +342,7 @@ pub enum WebSocketNetworkEvent {
|
|||
#[derive(Deserialize, Serialize)]
|
||||
/// IPC channels to communicate with the script thread about network or DOM events.
|
||||
pub enum FetchChannels {
|
||||
ResponseMsg(IpcSender<FetchResponseMsg>),
|
||||
ResponseMsg(IpcSender<FetchResponseMsg>, /* cancel_chan */ Option<IpcReceiver<()>>),
|
||||
WebSocket {
|
||||
event_sender: IpcSender<WebSocketNetworkEvent>,
|
||||
action_receiver: IpcReceiver<WebSocketDomAction>,
|
||||
|
@ -353,7 +353,7 @@ pub enum FetchChannels {
|
|||
pub enum CoreResourceMsg {
|
||||
Fetch(RequestInit, FetchChannels),
|
||||
/// 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
|
||||
SetCookieForUrl(ServoUrl, Serde<Cookie<'static>>, CookieSource),
|
||||
/// 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(),
|
||||
Box::new(move |message| f(message.to().unwrap())));
|
||||
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)]
|
||||
|
@ -478,7 +478,7 @@ pub fn load_whole_resource(request: RequestInit,
|
|||
-> Result<(Metadata, Vec<u8>), NetworkError> {
|
||||
let (action_sender, action_receiver) = ipc::channel().unwrap();
|
||||
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 metadata = None;
|
||||
|
|
|
@ -126,7 +126,7 @@ impl DocumentLoader {
|
|||
request: RequestInit,
|
||||
fetch_target: IpcSender<FetchResponseMsg>) {
|
||||
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.
|
||||
|
|
|
@ -491,7 +491,7 @@ impl EventSource {
|
|||
listener.notify_fetch(message.to().unwrap());
|
||||
}));
|
||||
global.core_resource_thread().send(
|
||||
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender))).unwrap();
|
||||
CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender, None))).unwrap();
|
||||
// Step 13
|
||||
Ok(ev)
|
||||
}
|
||||
|
@ -555,6 +555,6 @@ impl EventSourceTimeoutCallback {
|
|||
}
|
||||
// Step 5.4
|
||||
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());
|
||||
}));
|
||||
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());
|
||||
}));
|
||||
core_resource_thread.send(
|
||||
NetTraitsFetch(request_init, FetchChannels::ResponseMsg(action_sender))).unwrap();
|
||||
NetTraitsFetch(request_init, FetchChannels::ResponseMsg(action_sender, None))).unwrap();
|
||||
|
||||
promise
|
||||
}
|
||||
|
|
|
@ -538,6 +538,7 @@ fn test_fetch_with_hsts() {
|
|||
user_agent: DEFAULT_USER_AGENT.into(),
|
||||
devtools_chan: None,
|
||||
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(),
|
||||
devtools_chan: dc,
|
||||
filemanager: FileManager::new(),
|
||||
cancel_chan: None,
|
||||
}
|
||||
}
|
||||
impl FetchTaskTarget for FetchResponseCollector {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue