#60 Ranges Header support

This commit is contained in:
Your Name 2018-02-23 01:32:52 +01:00
parent 9e9ae13f25
commit ac573406df
1 changed files with 5 additions and 6 deletions

View File

@ -87,23 +87,22 @@ impl Responder for NamedFile {
fn respond_to(mut self, req: HttpRequest) -> Result<HttpResponse, io::Error> { fn respond_to(mut self, req: HttpRequest) -> Result<HttpResponse, io::Error> {
if let Some(rangeheader) = req.headers().get(header::RANGE) { if let Some(rangeheader) = req.headers().get(header::RANGE) {
let file_metadata = metadata(self.0)?; let file_metadata = metadata(self.0)?;
if let Ok(ranges) = HttpRange::parse(rangeheader.to_str().unwrap(), file_metadata.len()) { if let Ok(ranges) = HttpRange::parse(try!(rangeheader.to_str()), file_metadata.len()) {
let mut resp = HTTPPartialContent.build(); let mut resp = HTTPPartialContent.build();
let length: usize = ranges[0].length as usize; let length: usize = ranges[0].length as usize;
let mut data: Vec<u8> = vec![0u8; length]; let mut data: Vec<u8> = vec![0u8; length];
let _ = &self.1.seek(SeekFrom::Start(ranges[0].start))?; let _ = &self.1.seek(SeekFrom::Start(ranges[0].start))?;
let _ = self.1.read_exact(&mut data); let _ = self.1.read_exact(&mut data)?;
Ok(resp Ok(resp
.header(header::CONTENT_RANGE, format!("bytes {}-{}/{}", ranges[0].start, ranges[0].length, file_metadata.len()).as_str()) .header(header::CONTENT_RANGE, format!("bytes {}-{}/{}", ranges[0].start, ranges[0].start + ranges[0].length, file_metadata.len()).as_str())
.body(data).unwrap()) .body(data).unwrap())
} else { } else {
Ok(HTTPRangeNotSatisfiable.build() Ok(HTTPRangeNotSatisfiable.build()
.header(header::CONTENT_RANGE, format!("bytes */{}", file_metadata.len()).as_str()) .header(header::CONTENT_RANGE, format!("bytes */{}", file_metadata.len()).as_str())
.header(header::ACCEPT_RANGES, "bytes") .header(header::ACCEPT_RANGES, "bytes")
.body("").unwrap()) .finish().unwrap())
} }
} else { } else {
//let file_metadata = metadata(self.0)?;
let mut resp = HTTPOk.build(); let mut resp = HTTPOk.build();
resp.header(header::ACCEPT_RANGES, "bytes"); resp.header(header::ACCEPT_RANGES, "bytes");
resp.content_encoding(ContentEncoding::Identity); resp.content_encoding(ContentEncoding::Identity);