mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Rustfmt net crate
This commit is contained in:
parent
ba1ed11ced
commit
2481ad25f8
30 changed files with 4957 additions and 2870 deletions
|
@ -51,20 +51,25 @@ impl<'a> Factory for Client<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
impl<'a> Handler for Client<'a> {
|
||||
fn build_request(&mut self, url: &Url) -> WebSocketResult<Request> {
|
||||
let mut req = Request::from_url(url)?;
|
||||
req.headers_mut().push(("Origin".to_string(), self.origin.as_bytes().to_owned()));
|
||||
req.headers_mut().push(("Host".to_string(), format!("{}", self.host).as_bytes().to_owned()));
|
||||
req.headers_mut()
|
||||
.push(("Origin".to_string(), self.origin.as_bytes().to_owned()));
|
||||
req.headers_mut().push((
|
||||
"Host".to_string(),
|
||||
format!("{}", self.host).as_bytes().to_owned(),
|
||||
));
|
||||
|
||||
for protocol in self.protocols {
|
||||
req.add_protocol(protocol);
|
||||
};
|
||||
}
|
||||
|
||||
let mut cookie_jar = self.http_state.cookie_jar.write().unwrap();
|
||||
if let Some(cookie_list) = cookie_jar.cookies_for_url(self.resource_url, CookieSource::HTTP) {
|
||||
req.headers_mut().push(("Cookie".into(), cookie_list.as_bytes().to_owned()))
|
||||
if let Some(cookie_list) = cookie_jar.cookies_for_url(self.resource_url, CookieSource::HTTP)
|
||||
{
|
||||
req.headers_mut()
|
||||
.push(("Cookie".into(), cookie_list.as_bytes().to_owned()))
|
||||
}
|
||||
|
||||
Ok(req)
|
||||
|
@ -83,41 +88,48 @@ impl<'a> Handler for Client<'a> {
|
|||
// TODO(eijebong): Replace thise once typed headers settled on a cookie impl
|
||||
for cookie in headers.get_all(header::SET_COOKIE) {
|
||||
if let Ok(s) = cookie.to_str() {
|
||||
if let Some(cookie) = Cookie::from_cookie_string(s.into(), self.resource_url, CookieSource::HTTP) {
|
||||
if let Some(cookie) =
|
||||
Cookie::from_cookie_string(s.into(), self.resource_url, CookieSource::HTTP)
|
||||
{
|
||||
jar.push(cookie, self.resource_url, CookieSource::HTTP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let _ = self.event_sender.send(
|
||||
WebSocketNetworkEvent::ConnectionEstablished { protocol_in_use: self.protocol_in_use.clone() });
|
||||
let _ = self
|
||||
.event_sender
|
||||
.send(WebSocketNetworkEvent::ConnectionEstablished {
|
||||
protocol_in_use: self.protocol_in_use.clone(),
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn on_message(&mut self, message: Message) -> WebSocketResult<()> {
|
||||
fn on_message(&mut self, message: Message) -> WebSocketResult<()> {
|
||||
let message = match message {
|
||||
Message::Text(message) => MessageData::Text(message),
|
||||
Message::Binary(message) => MessageData::Binary(message),
|
||||
};
|
||||
let _ = self.event_sender.send(WebSocketNetworkEvent::MessageReceived(message));
|
||||
let _ = self
|
||||
.event_sender
|
||||
.send(WebSocketNetworkEvent::MessageReceived(message));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
fn on_error(&mut self, err: WebSocketError) {
|
||||
debug!("Error in WebSocket communication: {:?}", err);
|
||||
let _ = self.event_sender.send(WebSocketNetworkEvent::Fail);
|
||||
}
|
||||
|
||||
|
||||
fn on_response(&mut self, res: &WsResponse) -> WebSocketResult<()> {
|
||||
let protocol_in_use = res.protocol()?;
|
||||
|
||||
if let Some(protocol_name) = protocol_in_use {
|
||||
if !self.protocols.is_empty() && !self.protocols.iter().any(|p| protocol_name == (*p)) {
|
||||
let error = WebSocketError::new(WebSocketErrorKind::Protocol,
|
||||
"Protocol in Use not in client-supplied protocol list");
|
||||
let error = WebSocketError::new(
|
||||
WebSocketErrorKind::Protocol,
|
||||
"Protocol in Use not in client-supplied protocol list",
|
||||
);
|
||||
return Err(error);
|
||||
}
|
||||
self.protocol_in_use = Some(protocol_name.into());
|
||||
|
@ -127,7 +139,10 @@ impl<'a> Handler for Client<'a> {
|
|||
|
||||
fn on_close(&mut self, code: CloseCode, reason: &str) {
|
||||
debug!("Connection closing due to ({:?}) {}", code, reason);
|
||||
let _ = self.event_sender.send(WebSocketNetworkEvent::Close(Some(code.into()), reason.to_owned()));
|
||||
let _ = self.event_sender.send(WebSocketNetworkEvent::Close(
|
||||
Some(code.into()),
|
||||
reason.to_owned(),
|
||||
));
|
||||
}
|
||||
|
||||
fn upgrade_ssl_client(
|
||||
|
@ -136,106 +151,120 @@ impl<'a> Handler for Client<'a> {
|
|||
url: &Url,
|
||||
) -> WebSocketResult<SslStream<TcpStream>> {
|
||||
let certs = match opts::get().certificate_path {
|
||||
Some(ref path) => {
|
||||
fs::read_to_string(path).expect("Couldn't not find certificate file")
|
||||
}
|
||||
None => {
|
||||
resources::read_string(Resource::SSLCertificates)
|
||||
},
|
||||
Some(ref path) => fs::read_to_string(path).expect("Couldn't not find certificate file"),
|
||||
None => resources::read_string(Resource::SSLCertificates),
|
||||
};
|
||||
|
||||
let domain = self.resource_url.as_url().domain().ok_or(WebSocketError::new(
|
||||
WebSocketErrorKind::Protocol,
|
||||
format!("Unable to parse domain from {}. Needed for SSL.", url),
|
||||
))?;
|
||||
let domain = self
|
||||
.resource_url
|
||||
.as_url()
|
||||
.domain()
|
||||
.ok_or(WebSocketError::new(
|
||||
WebSocketErrorKind::Protocol,
|
||||
format!("Unable to parse domain from {}. Needed for SSL.", url),
|
||||
))?;
|
||||
let connector = create_ssl_connector_builder(&certs).build();
|
||||
connector.connect(domain, stream).map_err(WebSocketError::from)
|
||||
connector
|
||||
.connect(domain, stream)
|
||||
.map_err(WebSocketError::from)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn init(
|
||||
req_init: RequestInit,
|
||||
resource_event_sender: IpcSender<WebSocketNetworkEvent>,
|
||||
dom_action_receiver: IpcReceiver<WebSocketDomAction>,
|
||||
http_state: Arc<HttpState>
|
||||
http_state: Arc<HttpState>,
|
||||
) {
|
||||
thread::Builder::new().name(format!("WebSocket connection to {}", req_init.url)).spawn(move || {
|
||||
let protocols = match req_init.mode {
|
||||
RequestMode::WebSocket { protocols } => protocols.clone(),
|
||||
_ => panic!("Received a RequestInit with a non-websocket mode in websocket_loader"),
|
||||
};
|
||||
thread::Builder::new()
|
||||
.name(format!("WebSocket connection to {}", req_init.url))
|
||||
.spawn(move || {
|
||||
let protocols = match req_init.mode {
|
||||
RequestMode::WebSocket { protocols } => protocols.clone(),
|
||||
_ => panic!("Received a RequestInit with a non-websocket mode in websocket_loader"),
|
||||
};
|
||||
|
||||
let scheme = req_init.url.scheme();
|
||||
let mut req_url = req_init.url.clone();
|
||||
if scheme == "ws" {
|
||||
req_url.as_mut_url().set_scheme("http").unwrap();
|
||||
} else if scheme == "wss" {
|
||||
req_url.as_mut_url().set_scheme("https").unwrap();
|
||||
}
|
||||
|
||||
if should_be_blocked_due_to_bad_port(&req_url) {
|
||||
debug!("Failed to establish a WebSocket connection: port blocked");
|
||||
let _ = resource_event_sender.send(WebSocketNetworkEvent::Fail);
|
||||
return;
|
||||
}
|
||||
|
||||
let host = replace_host(req_init.url.host_str().unwrap());
|
||||
let mut net_url = req_init.url.clone().into_url();
|
||||
net_url.set_host(Some(&host)).unwrap();
|
||||
|
||||
let host = Host::from(
|
||||
format!("{}{}", req_init.url.host_str().unwrap(),
|
||||
req_init.url.port_or_known_default().map(|v| format!(":{}", v)).unwrap_or("".into())
|
||||
).parse::<Authority>().unwrap()
|
||||
);
|
||||
|
||||
let client = Client {
|
||||
origin: &req_init.origin.ascii_serialization(),
|
||||
host: &host,
|
||||
protocols: &protocols,
|
||||
http_state: &http_state,
|
||||
resource_url: &req_init.url,
|
||||
event_sender: &resource_event_sender,
|
||||
protocol_in_use: None,
|
||||
};
|
||||
let mut ws = WebSocket::new(client).unwrap();
|
||||
|
||||
if let Err(e) = ws.connect(net_url) {
|
||||
debug!("Failed to establish a WebSocket connection: {:?}", e);
|
||||
return;
|
||||
};
|
||||
|
||||
let ws_sender = ws.broadcaster();
|
||||
let initiated_close = Arc::new(AtomicBool::new(false));
|
||||
|
||||
thread::spawn(move || {
|
||||
while let Ok(dom_action) = dom_action_receiver.recv() {
|
||||
match dom_action {
|
||||
WebSocketDomAction::SendMessage(MessageData::Text(data)) => {
|
||||
ws_sender.send(Message::text(data)).unwrap();
|
||||
},
|
||||
WebSocketDomAction::SendMessage(MessageData::Binary(data)) => {
|
||||
ws_sender.send(Message::binary(data)).unwrap();
|
||||
},
|
||||
WebSocketDomAction::Close(code, reason) => {
|
||||
if !initiated_close.fetch_or(true, Ordering::SeqCst) {
|
||||
match code {
|
||||
Some(code) => {
|
||||
ws_sender.close_with_reason(code.into(), reason.unwrap_or("".to_owned())).unwrap()
|
||||
},
|
||||
None => ws_sender.close(CloseCode::Status).unwrap(),
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
let scheme = req_init.url.scheme();
|
||||
let mut req_url = req_init.url.clone();
|
||||
if scheme == "ws" {
|
||||
req_url.as_mut_url().set_scheme("http").unwrap();
|
||||
} else if scheme == "wss" {
|
||||
req_url.as_mut_url().set_scheme("https").unwrap();
|
||||
}
|
||||
});
|
||||
|
||||
if let Err(e) = ws.run() {
|
||||
debug!("Failed to run WebSocket: {:?}", e);
|
||||
let _ = resource_event_sender.send(WebSocketNetworkEvent::Fail);
|
||||
};
|
||||
}).expect("Thread spawning failed");
|
||||
if should_be_blocked_due_to_bad_port(&req_url) {
|
||||
debug!("Failed to establish a WebSocket connection: port blocked");
|
||||
let _ = resource_event_sender.send(WebSocketNetworkEvent::Fail);
|
||||
return;
|
||||
}
|
||||
|
||||
let host = replace_host(req_init.url.host_str().unwrap());
|
||||
let mut net_url = req_init.url.clone().into_url();
|
||||
net_url.set_host(Some(&host)).unwrap();
|
||||
|
||||
let host = Host::from(
|
||||
format!(
|
||||
"{}{}",
|
||||
req_init.url.host_str().unwrap(),
|
||||
req_init
|
||||
.url
|
||||
.port_or_known_default()
|
||||
.map(|v| format!(":{}", v))
|
||||
.unwrap_or("".into())
|
||||
)
|
||||
.parse::<Authority>()
|
||||
.unwrap(),
|
||||
);
|
||||
|
||||
let client = Client {
|
||||
origin: &req_init.origin.ascii_serialization(),
|
||||
host: &host,
|
||||
protocols: &protocols,
|
||||
http_state: &http_state,
|
||||
resource_url: &req_init.url,
|
||||
event_sender: &resource_event_sender,
|
||||
protocol_in_use: None,
|
||||
};
|
||||
let mut ws = WebSocket::new(client).unwrap();
|
||||
|
||||
if let Err(e) = ws.connect(net_url) {
|
||||
debug!("Failed to establish a WebSocket connection: {:?}", e);
|
||||
return;
|
||||
};
|
||||
|
||||
let ws_sender = ws.broadcaster();
|
||||
let initiated_close = Arc::new(AtomicBool::new(false));
|
||||
|
||||
thread::spawn(move || {
|
||||
while let Ok(dom_action) = dom_action_receiver.recv() {
|
||||
match dom_action {
|
||||
WebSocketDomAction::SendMessage(MessageData::Text(data)) => {
|
||||
ws_sender.send(Message::text(data)).unwrap();
|
||||
},
|
||||
WebSocketDomAction::SendMessage(MessageData::Binary(data)) => {
|
||||
ws_sender.send(Message::binary(data)).unwrap();
|
||||
},
|
||||
WebSocketDomAction::Close(code, reason) => {
|
||||
if !initiated_close.fetch_or(true, Ordering::SeqCst) {
|
||||
match code {
|
||||
Some(code) => ws_sender
|
||||
.close_with_reason(
|
||||
code.into(),
|
||||
reason.unwrap_or("".to_owned()),
|
||||
)
|
||||
.unwrap(),
|
||||
None => ws_sender.close(CloseCode::Status).unwrap(),
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if let Err(e) = ws.run() {
|
||||
debug!("Failed to run WebSocket: {:?}", e);
|
||||
let _ = resource_event_sender.send(WebSocketNetworkEvent::Fail);
|
||||
};
|
||||
})
|
||||
.expect("Thread spawning failed");
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue