mirror of https://github.com/fafhrd91/actix-web
Merge branch 'ranges-support' of github.com:qrvaelet/actix-web into ranges-support
This commit is contained in:
commit
8e61ceea97
29
src/fs.rs
29
src/fs.rs
|
@ -14,9 +14,15 @@ use param::FromParam;
|
||||||
use handler::{Handler, Responder};
|
use handler::{Handler, Responder};
|
||||||
use headers::{ContentEncoding, HttpRange};
|
use headers::{ContentEncoding, HttpRange};
|
||||||
use http::header;
|
use http::header;
|
||||||
|
<<<<<<< HEAD
|
||||||
use httpcodes::{HTTPBadRequest, HTTPOk, HTTPFound, HTTPPartialContent, HTTPRangeNotSatisfiable};
|
use httpcodes::{HTTPBadRequest, HTTPOk, HTTPFound, HTTPPartialContent, HTTPRangeNotSatisfiable};
|
||||||
use httprequest::HttpRequest;
|
use httprequest::HttpRequest;
|
||||||
use httpresponse::HttpResponse;
|
use httpresponse::HttpResponse;
|
||||||
|
=======
|
||||||
|
use httprequest::HttpRequest;
|
||||||
|
use httpresponse::HttpResponse;
|
||||||
|
use httpcodes::{HTTPOk, HTTPFound, HTTPPartialContent, HTTPRangeNotSatisfiable};
|
||||||
|
>>>>>>> 3ccfc10f0fd727b88c12cd95952158acba690e40
|
||||||
|
|
||||||
/// A file with an associated name; responds with the Content-Type based on the
|
/// A file with an associated name; responds with the Content-Type based on the
|
||||||
/// file extension.
|
/// file extension.
|
||||||
|
@ -87,6 +93,7 @@ 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)?;
|
||||||
|
<<<<<<< HEAD
|
||||||
if let Ok(rangeheaderstr) = rangeheader.to_str() {
|
if let Ok(rangeheaderstr) = rangeheader.to_str() {
|
||||||
if let Ok(ranges) = HttpRange::parse(rangeheaderstr, file_metadata.len()) {
|
if let Ok(ranges) = HttpRange::parse(rangeheaderstr, file_metadata.len()) {
|
||||||
let mut resp = HTTPPartialContent.build();
|
let mut resp = HTTPPartialContent.build();
|
||||||
|
@ -115,6 +122,28 @@ impl Responder for NamedFile {
|
||||||
} else {
|
} else {
|
||||||
Ok(HTTPBadRequest.build()
|
Ok(HTTPBadRequest.build()
|
||||||
.header(header::CONTENT_RANGE,
|
.header(header::CONTENT_RANGE,
|
||||||
|
=======
|
||||||
|
if let Ok(ranges) = HttpRange::parse(rangeheader.to_str().unwrap_or(""), file_metadata.len()) {
|
||||||
|
let mut resp = HTTPPartialContent.build();
|
||||||
|
let length: usize = ranges[0].length as usize;
|
||||||
|
let mut data: Vec<u8> = vec![0u8; length];
|
||||||
|
if let Some(ext) = self.path().extension() {
|
||||||
|
let mime = get_mime_type(&ext.to_string_lossy());
|
||||||
|
resp.content_type(format!("{}", mime).as_str());
|
||||||
|
}
|
||||||
|
let _ = &self.1.seek(SeekFrom::Start(ranges[0].start))?;
|
||||||
|
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())
|
||||||
|
.body(data).unwrap())
|
||||||
|
} else {
|
||||||
|
Ok(HTTPRangeNotSatisfiable.build()
|
||||||
|
.header(header::CONTENT_RANGE,
|
||||||
|
>>>>>>> 3ccfc10f0fd727b88c12cd95952158acba690e40
|
||||||
format!("bytes */{}", file_metadata.len()).as_str())
|
format!("bytes */{}", file_metadata.len()).as_str())
|
||||||
.header(header::ACCEPT_RANGES, "bytes")
|
.header(header::ACCEPT_RANGES, "bytes")
|
||||||
.finish().unwrap())
|
.finish().unwrap())
|
||||||
|
|
Loading…
Reference in New Issue