From fa178b92be2637f51177747e50b391c02e614786 Mon Sep 17 00:00:00 2001 From: Antoine Gersant Date: Fri, 17 Jan 2020 21:51:28 -0800 Subject: [PATCH] Validate partial content support --- src/service/rocket/test.rs | 18 +++++++++++++++--- src/service/test.rs | 27 ++++++++++++--------------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/service/rocket/test.rs b/src/service/rocket/test.rs index b9d2cf4..18ff43a 100644 --- a/src/service/rocket/test.rs +++ b/src/service/rocket/test.rs @@ -1,4 +1,5 @@ use http::response::{Builder, Response}; +use http::{HeaderMap, HeaderValue}; use rocket; use rocket::local::Client; use serde::de::DeserializeOwned; @@ -19,7 +20,11 @@ pub struct RocketResponse<'r, 's> { impl<'r, 's> RocketResponse<'r, 's> { fn builder(&self) -> Builder { - Response::builder().status(self.response.status().code) + let mut builder = Response::builder().status(self.response.status().code); + for header in self.response.headers().iter() { + builder = builder.header(header.name(), header.value()); + } + builder } fn to_void(&self) -> Response<()> { @@ -93,8 +98,15 @@ impl TestService for RocketTestService { .to_void() } - fn get_bytes(&mut self, url: &str) -> Response> { - let mut response = self.client.get(url).dispatch(); + fn get_bytes(&mut self, url: &str, headers: &HeaderMap) -> Response> { + let mut request = self.client.get(url); + for (name, value) in headers.iter() { + request.add_header(rocket::http::Header::new( + name.as_str().to_owned(), + value.to_str().unwrap().to_owned(), + )) + } + let mut response = request.dispatch(); RocketResponse { response: response.deref_mut(), } diff --git a/src/service/test.rs b/src/service/test.rs index 6980d70..7c02333 100644 --- a/src/service/test.rs +++ b/src/service/test.rs @@ -1,5 +1,6 @@ use function_name::named; -use http::{Response, StatusCode}; +use http::header::*; +use http::{HeaderMap, HeaderValue, Response, StatusCode}; use percent_encoding::{percent_encode, NON_ALPHANUMERIC}; use serde::de::DeserializeOwned; use serde::Serialize; @@ -20,7 +21,7 @@ const TEST_MOUNT_SOURCE: &str = "test/collection"; pub trait TestService { fn new(db_name: &str) -> Self; fn get(&mut self, url: &str) -> Response<()>; - fn get_bytes(&mut self, url: &str) -> Response>; + fn get_bytes(&mut self, url: &str, headers: &HeaderMap) -> Response>; fn post(&mut self, url: &str) -> Response<()>; fn delete(&mut self, url: &str) -> Response<()>; fn get_json(&mut self, url: &str) -> Response; @@ -372,22 +373,18 @@ fn test_service_serve() { percent_encode(path.to_string_lossy().as_ref().as_bytes(), NON_ALPHANUMERIC) ); - let response = service.get_bytes(&uri); + let response = service.get_bytes(&uri, &HeaderMap::new()); assert_eq!(response.status(), StatusCode::OK); assert_eq!(response.body().len(), 24_142); - // TODO - // { - // let mut response = client - // .get("/api/serve/collection%2FKhemmis%2FHunted%2F02%20-%20Candlelight.mp3") - // .header(Range::bytes(100, 299)) - // .dispatch(); - // assert_eq!(response.status(), Status::PartialContent); - // let body = response.body().unwrap(); - // let body = body.into_bytes().unwrap(); - // assert_eq!(body.len(), 200); - // assert_eq!(response.headers().get_one("Content-Length").unwrap(), "200"); - // } + { + let mut headers = HeaderMap::new(); + headers.append(RANGE, HeaderValue::from_str("bytes=100-299").unwrap()); + let response = service.get_bytes(&uri, &headers); + assert_eq!(response.status(), StatusCode::PARTIAL_CONTENT); + assert_eq!(response.body().len(), 200); + assert_eq!(response.headers().get(CONTENT_LENGTH).unwrap(), "200"); + } } #[named]