mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
added two fetch_async tests involving filtered responses
This commit is contained in:
parent
fee7cb179e
commit
cddc03be33
2 changed files with 80 additions and 4 deletions
|
@ -117,7 +117,14 @@ impl Response {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wait_until_done(&self) {
|
pub fn wait_until_done(&self) {
|
||||||
|
match self.response_type {
|
||||||
|
// since these response types can't hold a body, they should be considered done
|
||||||
|
ResponseType::Error | ResponseType::Opaque | ResponseType::OpaqueRedirect => {},
|
||||||
|
_ => {
|
||||||
while !self.body.lock().unwrap().is_done() && !self.is_network_error() {
|
while !self.body.lock().unwrap().is_done() && !self.is_network_error() {
|
||||||
|
// loop until done
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@ use net::fetch::response::ResponseMethods;
|
||||||
use net_traits::request::{Origin, RedirectMode, Referer, Request, RequestMode};
|
use net_traits::request::{Origin, RedirectMode, Referer, Request, RequestMode};
|
||||||
use net_traits::response::{CacheState, Response, ResponseBody, ResponseType};
|
use net_traits::response::{CacheState, Response, ResponseBody, ResponseType};
|
||||||
use net_traits::{AsyncFetchListener};
|
use net_traits::{AsyncFetchListener};
|
||||||
use std::cell::Cell;
|
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::mpsc::{Sender, channel};
|
use std::sync::mpsc::{Sender, channel};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
@ -248,7 +247,7 @@ fn test_fetch_response_is_opaque_redirect_filtered() {
|
||||||
let origin = Origin::Origin(url.origin());
|
let origin = Origin::Origin(url.origin());
|
||||||
let mut request = Request::new(url, Some(origin), false);
|
let mut request = Request::new(url, Some(origin), false);
|
||||||
request.referer = Referer::NoReferer;
|
request.referer = Referer::NoReferer;
|
||||||
request.redirect_mode = Cell::new(RedirectMode::Manual);
|
request.redirect_mode.set(RedirectMode::Manual);
|
||||||
let wrapped_request = Rc::new(request);
|
let wrapped_request = Rc::new(request);
|
||||||
|
|
||||||
let fetch_response = fetch(wrapped_request);
|
let fetch_response = fetch(wrapped_request);
|
||||||
|
@ -457,7 +456,7 @@ fn response_is_done(response: &Response) -> bool {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_fetch_async_returns_complete_response() {
|
fn test_fetch_async_returns_complete_response() {
|
||||||
|
|
||||||
static MESSAGE: &'static [u8] = b"";
|
static MESSAGE: &'static [u8] = b"this message should be retrieved in full";
|
||||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||||
response.send(MESSAGE).unwrap();
|
response.send(MESSAGE).unwrap();
|
||||||
};
|
};
|
||||||
|
@ -478,3 +477,73 @@ fn test_fetch_async_returns_complete_response() {
|
||||||
|
|
||||||
assert_eq!(response_is_done(&fetch_response), true);
|
assert_eq!(response_is_done(&fetch_response), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_opaque_filtered_fetch_async_returns_complete_response() {
|
||||||
|
|
||||||
|
static MESSAGE: &'static [u8] = b"";
|
||||||
|
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||||
|
response.send(MESSAGE).unwrap();
|
||||||
|
};
|
||||||
|
let (mut server, url) = make_server(handler);
|
||||||
|
|
||||||
|
// an origin mis-match will fall through to an Opaque filtered response
|
||||||
|
let origin = Origin::Origin(UrlOrigin::UID(OpaqueOrigin::new()));
|
||||||
|
let mut request = Request::new(url, Some(origin), false);
|
||||||
|
request.referer = Referer::NoReferer;
|
||||||
|
|
||||||
|
let (tx, rx) = channel();
|
||||||
|
let listener = Box::new(FetchResponseCollector {
|
||||||
|
sender: tx.clone()
|
||||||
|
});
|
||||||
|
|
||||||
|
fetch_async(request, listener);
|
||||||
|
let fetch_response = rx.recv().unwrap();
|
||||||
|
let _ = server.close();
|
||||||
|
|
||||||
|
assert_eq!(fetch_response.response_type, ResponseType::Opaque);
|
||||||
|
assert_eq!(response_is_done(&fetch_response), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_opaque_redirect_filtered_fetch_async_returns_complete_response() {
|
||||||
|
|
||||||
|
static MESSAGE: &'static [u8] = b"";
|
||||||
|
let handler = move |request: HyperRequest, mut response: HyperResponse| {
|
||||||
|
|
||||||
|
let redirects = match request.uri {
|
||||||
|
RequestUri::AbsolutePath(url) =>
|
||||||
|
url.split("/").collect::<String>().parse::<u32>().unwrap_or(0),
|
||||||
|
RequestUri::AbsoluteUri(url) =>
|
||||||
|
url.path().unwrap().last().unwrap().split("/").collect::<String>().parse::<u32>().unwrap_or(0),
|
||||||
|
_ => panic!()
|
||||||
|
};
|
||||||
|
|
||||||
|
if redirects == 1 {
|
||||||
|
response.send(MESSAGE).unwrap();
|
||||||
|
} else {
|
||||||
|
*response.status_mut() = StatusCode::Found;
|
||||||
|
let url = format!("{}", 1);
|
||||||
|
response.headers_mut().set(Location(url.to_owned()));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let (mut server, url) = make_server(handler);
|
||||||
|
|
||||||
|
let origin = Origin::Origin(url.origin());
|
||||||
|
let mut request = Request::new(url, Some(origin), false);
|
||||||
|
request.referer = Referer::NoReferer;
|
||||||
|
request.redirect_mode.set(RedirectMode::Manual);
|
||||||
|
|
||||||
|
let (tx, rx) = channel();
|
||||||
|
let listener = Box::new(FetchResponseCollector {
|
||||||
|
sender: tx.clone()
|
||||||
|
});
|
||||||
|
|
||||||
|
fetch_async(request, listener);
|
||||||
|
let fetch_response = rx.recv().unwrap();
|
||||||
|
let _ = server.close();
|
||||||
|
|
||||||
|
assert_eq!(fetch_response.response_type, ResponseType::OpaqueRedirect);
|
||||||
|
assert_eq!(response_is_done(&fetch_response), true);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue