diff --git a/src/error.rs b/src/error.rs index 084249217..f9bbca241 100644 --- a/src/error.rs +++ b/src/error.rs @@ -627,6 +627,12 @@ pub fn ErrorPreconditionFailed(err: T) -> InternalError { InternalError::new(err, StatusCode::PRECONDITION_FAILED) } +/// Helper function that creates wrapper of any error and generate *RANGE NOT SATISFIABLE* response. +#[allow(non_snake_case)] +pub fn ErrorRangeNotSatisfiable(err: T) -> InternalError { + InternalError::new(err, StatusCode::RANGE_NOT_SATISFIABLE) +} + /// Helper function that creates wrapper of any error and generate *EXPECTATION FAILED* response. #[allow(non_snake_case)] pub fn ErrorExpectationFailed(err: T) -> InternalError { diff --git a/src/fs.rs b/src/fs.rs index d92ad1e73..2bd241f24 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -85,13 +85,20 @@ impl Responder for NamedFile { type Error = io::Error; fn respond_to(mut self, req: HttpRequest) -> Result { +<<<<<<< HEAD if let Some(rangeheader) = req.headers().get(header::RANGE) { let file_metadata = metadata(self.0)?; if let Ok(ranges) = HttpRange::parse(try!(rangeheader.to_str()), file_metadata.len()) { +======= + if let Ok(rangeheader) = req.headers().get("range").unwrap().to_str() { + let file_metadata = metadata(self.0)?; + if let Ok(ranges) = HttpRange::parse(rangeheader, file_metadata.len()) { +>>>>>>> de7c05c... #60: Basic Ranges header support let mut resp = HTTPPartialContent.build(); let length: usize = ranges[0].length as usize; let mut data: Vec = vec![0u8; length]; let _ = &self.1.seek(SeekFrom::Start(ranges[0].start))?; +<<<<<<< HEAD let _ = self.1.read_exact(&mut data)?; Ok(resp .header(header::CONTENT_RANGE, format!("bytes {}-{}/{}", ranges[0].start, ranges[0].start + ranges[0].length, file_metadata.len()).as_str()) @@ -108,6 +115,20 @@ impl Responder for NamedFile { resp.content_encoding(ContentEncoding::Identity); if let Some(ext) = self.path().extension() { let mime = get_mime_type(&ext.to_string_lossy()); +======= + let _ = self.1.read_exact(&mut data); + Ok(resp.body(data).unwrap()) + } else { + Ok(HTTPRangeNotSatisfiable.build() + .header(header::CONTENT_RANGE, format!("0-{}", file_metadata.len()).as_str()) + .body("").unwrap()) + } + } else { + let mut resp = HTTPOk.build(); + resp.content_encoding(ContentEncoding::Identity); + if let Some(ext) = self.path().extension() { + let mime = get_mime_type(&ext.to_string_lossy()); +>>>>>>> de7c05c... #60: Basic Ranges header support resp.content_type(format!("{}", mime).as_str()); } let mut data = Vec::new();