Returns LoadResponse struct instead of a tuple

Still boxes the reader, but at least is a step in the right direction
This commit is contained in:
Sam Gibson 2015-08-16 12:41:35 +10:00
parent 3c756d254b
commit 879b058be2
2 changed files with 19 additions and 8 deletions

View file

@ -128,8 +128,8 @@ fn load_for_consumer(load_data: LoadData,
file_loader::factory(load_data, start_chan, classifier) file_loader::factory(load_data, start_chan, classifier)
} }
Ok((mut response_reader, metadata)) => { Ok(mut load_response) => {
send_data(&mut response_reader, start_chan, metadata, classifier) send_data(&mut load_response.reader, start_chan, load_response.metadata, classifier)
} }
} }
} }
@ -351,11 +351,22 @@ fn update_sts_list_from_response(url: &Url, response: &HttpResponse, resource_mg
} }
} }
pub struct LoadResponse {
pub reader: Box<Read>,
pub metadata: Metadata
}
impl LoadResponse {
fn new(r: Box<Read>, m: Metadata) -> LoadResponse {
LoadResponse { reader: r, metadata: m }
}
}
pub fn load<A>(mut load_data: LoadData, pub fn load<A>(mut load_data: LoadData,
resource_mgr_chan: IpcSender<ControlMsg>, resource_mgr_chan: IpcSender<ControlMsg>,
devtools_chan: Option<Sender<DevtoolsControlMsg>>, devtools_chan: Option<Sender<DevtoolsControlMsg>>,
request_factory: &HttpRequestFactory<R=A>) request_factory: &HttpRequestFactory<R=A>)
-> Result<(Box<Read>, Metadata), LoadError> where A: HttpRequest + 'static { -> Result<LoadResponse, LoadError> where A: HttpRequest + 'static {
// FIXME: At the time of writing this FIXME, servo didn't have any central // FIXME: At the time of writing this FIXME, servo didn't have any central
// location for configuration. If you're reading this and such a // location for configuration. If you're reading this and such a
// repository DOES exist, please update this constant to use it. // repository DOES exist, please update this constant to use it.
@ -569,7 +580,7 @@ pub fn load<A>(mut load_data: LoadData,
let result = GzDecoder::new(response); let result = GzDecoder::new(response);
match result { match result {
Ok(response_decoding) => { Ok(response_decoding) => {
return Ok((Box::new(response_decoding), metadata)); return Ok(LoadResponse::new(Box::new(response_decoding), metadata));
} }
Err(err) => { Err(err) => {
return Err(LoadError::Decoding(metadata.final_url, err.to_string())); return Err(LoadError::Decoding(metadata.final_url, err.to_string()));
@ -578,10 +589,10 @@ pub fn load<A>(mut load_data: LoadData,
} }
Some(Encoding::Deflate) => { Some(Encoding::Deflate) => {
let response_decoding = DeflateDecoder::new(response); let response_decoding = DeflateDecoder::new(response);
return Ok((Box::new(response_decoding), metadata)); return Ok(LoadResponse::new(Box::new(response_decoding), metadata));
} }
None => { None => {
return Ok((Box::new(response), metadata)); return Ok(LoadResponse::new(Box::new(response), metadata));
} }
_ => return Err(LoadError::UnsupportedContentEncodings(url.clone())) _ => return Err(LoadError::UnsupportedContentEncodings(url.clone()))
} }

View file

@ -495,8 +495,8 @@ fn test_load_follows_a_redirect() {
match load::<MockRequest>(load_data, resource_mgr, None, &Factory) { match load::<MockRequest>(load_data, resource_mgr, None, &Factory) {
Err(_) => panic!("expected to follow a redirect"), Err(_) => panic!("expected to follow a redirect"),
Ok((mut r, _)) => { Ok(mut lr) => {
let response = read_response(&mut *r); let response = read_response(&mut *lr.reader);
assert_eq!(response, "Yay!".to_string()); assert_eq!(response, "Yay!".to_string());
} }
} }