Validate partial content support

This commit is contained in:
Antoine Gersant 2020-01-17 21:51:28 -08:00
parent 5ccc006515
commit fa178b92be
2 changed files with 27 additions and 18 deletions

View file

@ -1,4 +1,5 @@
use http::response::{Builder, Response}; use http::response::{Builder, Response};
use http::{HeaderMap, HeaderValue};
use rocket; use rocket;
use rocket::local::Client; use rocket::local::Client;
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
@ -19,7 +20,11 @@ pub struct RocketResponse<'r, 's> {
impl<'r, 's> RocketResponse<'r, 's> { impl<'r, 's> RocketResponse<'r, 's> {
fn builder(&self) -> Builder { 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<()> { fn to_void(&self) -> Response<()> {
@ -93,8 +98,15 @@ impl TestService for RocketTestService {
.to_void() .to_void()
} }
fn get_bytes(&mut self, url: &str) -> Response<Vec<u8>> { fn get_bytes(&mut self, url: &str, headers: &HeaderMap<HeaderValue>) -> Response<Vec<u8>> {
let mut response = self.client.get(url).dispatch(); 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 { RocketResponse {
response: response.deref_mut(), response: response.deref_mut(),
} }

View file

@ -1,5 +1,6 @@
use function_name::named; 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 percent_encoding::{percent_encode, NON_ALPHANUMERIC};
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use serde::Serialize; use serde::Serialize;
@ -20,7 +21,7 @@ const TEST_MOUNT_SOURCE: &str = "test/collection";
pub trait TestService { pub trait TestService {
fn new(db_name: &str) -> Self; fn new(db_name: &str) -> Self;
fn get(&mut self, url: &str) -> Response<()>; fn get(&mut self, url: &str) -> Response<()>;
fn get_bytes(&mut self, url: &str) -> Response<Vec<u8>>; fn get_bytes(&mut self, url: &str, headers: &HeaderMap<HeaderValue>) -> Response<Vec<u8>>;
fn post(&mut self, url: &str) -> Response<()>; fn post(&mut self, url: &str) -> Response<()>;
fn delete(&mut self, url: &str) -> Response<()>; fn delete(&mut self, url: &str) -> Response<()>;
fn get_json<T: DeserializeOwned>(&mut self, url: &str) -> Response<T>; fn get_json<T: DeserializeOwned>(&mut self, url: &str) -> Response<T>;
@ -372,22 +373,18 @@ fn test_service_serve() {
percent_encode(path.to_string_lossy().as_ref().as_bytes(), NON_ALPHANUMERIC) 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.status(), StatusCode::OK);
assert_eq!(response.body().len(), 24_142); assert_eq!(response.body().len(), 24_142);
// TODO {
// { let mut headers = HeaderMap::new();
// let mut response = client headers.append(RANGE, HeaderValue::from_str("bytes=100-299").unwrap());
// .get("/api/serve/collection%2FKhemmis%2FHunted%2F02%20-%20Candlelight.mp3") let response = service.get_bytes(&uri, &headers);
// .header(Range::bytes(100, 299)) assert_eq!(response.status(), StatusCode::PARTIAL_CONTENT);
// .dispatch(); assert_eq!(response.body().len(), 200);
// assert_eq!(response.status(), Status::PartialContent); assert_eq!(response.headers().get(CONTENT_LENGTH).unwrap(), "200");
// 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");
// }
} }
#[named] #[named]