mirror of
https://github.com/fafhrd91/actix-web
synced 2025-07-04 18:06:23 +02:00
Compare commits
6 Commits
codegen-v0
...
files-v0.1
Author | SHA1 | Date | |
---|---|---|---|
6d2e190c8e | |||
b1cfbdcf7a | |||
24180f9014 | |||
15cdc680f6 | |||
666756bfbe | |||
a1b40f4314 |
@ -72,7 +72,7 @@ actix-service = "0.4.0"
|
|||||||
actix-utils = "0.4.1"
|
actix-utils = "0.4.1"
|
||||||
actix-router = "0.1.5"
|
actix-router = "0.1.5"
|
||||||
actix-rt = "0.2.2"
|
actix-rt = "0.2.2"
|
||||||
actix-web-codegen = "0.1.0"
|
actix-web-codegen = "0.1.1"
|
||||||
actix-http = "0.2.2"
|
actix-http = "0.2.2"
|
||||||
actix-server = "0.5.1"
|
actix-server = "0.5.1"
|
||||||
actix-server-config = "0.1.1"
|
actix-server-config = "0.1.1"
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
## [0.1.1] - 2019-06-01
|
||||||
|
|
||||||
|
* Static files are incorrectly served as both chunked and with length #812
|
||||||
|
|
||||||
## [0.1.0] - 2019-05-25
|
## [0.1.0] - 2019-05-25
|
||||||
|
|
||||||
* NamedFile last-modified check always fails due to nano-seconds
|
* NamedFile last-modified check always fails due to nano-seconds
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-files"
|
name = "actix-files"
|
||||||
version = "0.1.0"
|
version = "0.1.1"
|
||||||
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
||||||
description = "Static files support for actix web."
|
description = "Static files support for actix web."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
@ -19,6 +19,7 @@ path = "src/lib.rs"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-web = "1.0.0-rc"
|
actix-web = "1.0.0-rc"
|
||||||
|
actix-http = "0.2.3"
|
||||||
actix-service = "0.4.0"
|
actix-service = "0.4.0"
|
||||||
bitflags = "1"
|
bitflags = "1"
|
||||||
bytes = "0.4"
|
bytes = "0.4"
|
||||||
|
1
actix-files/LICENSE-APACHE
Symbolic link
1
actix-files/LICENSE-APACHE
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-APACHE
|
1
actix-files/LICENSE-MIT
Symbolic link
1
actix-files/LICENSE-MIT
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-MIT
|
@ -11,6 +11,7 @@ use bitflags::bitflags;
|
|||||||
use mime;
|
use mime;
|
||||||
use mime_guess::guess_mime_type;
|
use mime_guess::guess_mime_type;
|
||||||
|
|
||||||
|
use actix_http::body::SizedStream;
|
||||||
use actix_web::http::header::{
|
use actix_web::http::header::{
|
||||||
self, ContentDisposition, DispositionParam, DispositionType,
|
self, ContentDisposition, DispositionParam, DispositionType,
|
||||||
};
|
};
|
||||||
@ -434,7 +435,7 @@ impl Responder for NamedFile {
|
|||||||
if offset != 0 || length != self.md.len() {
|
if offset != 0 || length != self.md.len() {
|
||||||
return Ok(resp.status(StatusCode::PARTIAL_CONTENT).streaming(reader));
|
return Ok(resp.status(StatusCode::PARTIAL_CONTENT).streaming(reader));
|
||||||
};
|
};
|
||||||
Ok(resp.streaming(reader))
|
Ok(resp.body(SizedStream::new(length, reader)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,18 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
## [0.2.3] - 2019-06-02
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
* Debug impl for ResponseBuilder
|
||||||
|
|
||||||
|
* From SizedStream and BodyStream for Body
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* SizedStream uses u64
|
||||||
|
|
||||||
|
|
||||||
## [0.2.2] - 2019-05-29
|
## [0.2.2] - 2019-05-29
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-http"
|
name = "actix-http"
|
||||||
version = "0.2.2"
|
version = "0.2.3"
|
||||||
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
||||||
description = "Actix http primitives"
|
description = "Actix http primitives"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
@ -234,6 +234,25 @@ impl From<BytesMut> for Body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<S> From<SizedStream<S>> for Body
|
||||||
|
where
|
||||||
|
S: Stream<Item = Bytes, Error = Error> + 'static,
|
||||||
|
{
|
||||||
|
fn from(s: SizedStream<S>) -> Body {
|
||||||
|
Body::from_message(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<S, E> From<BodyStream<S, E>> for Body
|
||||||
|
where
|
||||||
|
S: Stream<Item = Bytes, Error = E> + 'static,
|
||||||
|
E: Into<Error> + 'static,
|
||||||
|
{
|
||||||
|
fn from(s: BodyStream<S, E>) -> Body {
|
||||||
|
Body::from_message(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl MessageBody for Bytes {
|
impl MessageBody for Bytes {
|
||||||
fn size(&self) -> BodySize {
|
fn size(&self) -> BodySize {
|
||||||
BodySize::Sized(self.len())
|
BodySize::Sized(self.len())
|
||||||
@ -366,7 +385,7 @@ where
|
|||||||
/// Type represent streaming body. This body implementation should be used
|
/// Type represent streaming body. This body implementation should be used
|
||||||
/// if total size of stream is known. Data get sent as is without using transfer encoding.
|
/// if total size of stream is known. Data get sent as is without using transfer encoding.
|
||||||
pub struct SizedStream<S> {
|
pub struct SizedStream<S> {
|
||||||
size: usize,
|
size: u64,
|
||||||
stream: S,
|
stream: S,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,7 +393,7 @@ impl<S> SizedStream<S>
|
|||||||
where
|
where
|
||||||
S: Stream<Item = Bytes, Error = Error>,
|
S: Stream<Item = Bytes, Error = Error>,
|
||||||
{
|
{
|
||||||
pub fn new(size: usize, stream: S) -> Self {
|
pub fn new(size: u64, stream: S) -> Self {
|
||||||
SizedStream { size, stream }
|
SizedStream { size, stream }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -384,7 +403,7 @@ where
|
|||||||
S: Stream<Item = Bytes, Error = Error>,
|
S: Stream<Item = Bytes, Error = Error>,
|
||||||
{
|
{
|
||||||
fn size(&self) -> BodySize {
|
fn size(&self) -> BodySize {
|
||||||
BodySize::Sized(self.size)
|
BodySize::Sized64(self.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn poll_next(&mut self) -> Poll<Option<Bytes>, Error> {
|
fn poll_next(&mut self) -> Poll<Option<Bytes>, Error> {
|
||||||
|
@ -764,6 +764,25 @@ impl IntoFuture for ResponseBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for ResponseBuilder {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
let head = self.head.as_ref().unwrap();
|
||||||
|
|
||||||
|
let res = writeln!(
|
||||||
|
f,
|
||||||
|
"\nResponseBuilder {:?} {}{}",
|
||||||
|
head.version,
|
||||||
|
head.status,
|
||||||
|
head.reason.unwrap_or(""),
|
||||||
|
);
|
||||||
|
let _ = writeln!(f, " headers:");
|
||||||
|
for (key, val) in head.headers.iter() {
|
||||||
|
let _ = writeln!(f, " {:?}: {:?}", key, val);
|
||||||
|
}
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Helper converters
|
/// Helper converters
|
||||||
impl<I: Into<Response>, E: Into<Error>> From<Result<I, E>> for Response {
|
impl<I: Into<Response>, E: Into<Error>> From<Result<I, E>> for Response {
|
||||||
fn from(res: Result<I, E>) -> Self {
|
fn from(res: Result<I, E>) -> Self {
|
||||||
|
@ -12,7 +12,6 @@ use futures::stream::{once, Stream};
|
|||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use tokio_timer::sleep;
|
use tokio_timer::sleep;
|
||||||
|
|
||||||
use actix_http::body::Body;
|
|
||||||
use actix_http::error::PayloadError;
|
use actix_http::error::PayloadError;
|
||||||
use actix_http::{
|
use actix_http::{
|
||||||
body, error, http, http::header, Error, HttpService, KeepAlive, Request, Response,
|
body, error, http, http::header, Error, HttpService, KeepAlive, Request, Response,
|
||||||
@ -218,30 +217,28 @@ fn test_expect_continue_h1() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_chunked_payload() {
|
fn test_chunked_payload() {
|
||||||
let chunk_sizes = vec![ 32768, 32, 32768 ];
|
let chunk_sizes = vec![32768, 32, 32768];
|
||||||
let total_size: usize = chunk_sizes.iter().sum();
|
let total_size: usize = chunk_sizes.iter().sum();
|
||||||
|
|
||||||
let srv = TestServer::new(|| {
|
let srv = TestServer::new(|| {
|
||||||
HttpService::build()
|
HttpService::build().h1(|mut request: Request| {
|
||||||
.h1(|mut request: Request| {
|
request
|
||||||
request.take_payload()
|
.take_payload()
|
||||||
.map_err(|e| panic!(format!("Error reading payload: {}", e)))
|
.map_err(|e| panic!(format!("Error reading payload: {}", e)))
|
||||||
.fold(0usize, |acc, chunk| {
|
.fold(0usize, |acc, chunk| future::ok::<_, ()>(acc + chunk.len()))
|
||||||
future::ok::<_, ()>(acc + chunk.len())
|
.map(|req_size| Response::Ok().body(format!("size={}", req_size)))
|
||||||
})
|
})
|
||||||
.map(|req_size| {
|
|
||||||
Response::Ok().body(format!("size={}", req_size))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let returned_size = {
|
let returned_size = {
|
||||||
let mut stream = net::TcpStream::connect(srv.addr()).unwrap();
|
let mut stream = net::TcpStream::connect(srv.addr()).unwrap();
|
||||||
let _ = stream.write_all(b"POST /test HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n");
|
let _ = stream
|
||||||
|
.write_all(b"POST /test HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n");
|
||||||
|
|
||||||
for chunk_size in chunk_sizes.iter() {
|
for chunk_size in chunk_sizes.iter() {
|
||||||
let mut bytes = Vec::new();
|
let mut bytes = Vec::new();
|
||||||
let random_bytes: Vec<u8> = (0..*chunk_size).map(|_| rand::random::<u8>()).collect();
|
let random_bytes: Vec<u8> =
|
||||||
|
(0..*chunk_size).map(|_| rand::random::<u8>()).collect();
|
||||||
|
|
||||||
bytes.extend(format!("{:X}\r\n", chunk_size).as_bytes());
|
bytes.extend(format!("{:X}\r\n", chunk_size).as_bytes());
|
||||||
bytes.extend(&random_bytes[..]);
|
bytes.extend(&random_bytes[..]);
|
||||||
@ -826,8 +823,7 @@ fn test_h1_body_length() {
|
|||||||
HttpService::build().h1(|_| {
|
HttpService::build().h1(|_| {
|
||||||
let body = once(Ok(Bytes::from_static(STR.as_ref())));
|
let body = once(Ok(Bytes::from_static(STR.as_ref())));
|
||||||
ok::<_, ()>(
|
ok::<_, ()>(
|
||||||
Response::Ok()
|
Response::Ok().body(body::SizedStream::new(STR.len() as u64, body)),
|
||||||
.body(Body::from_message(body::SizedStream::new(STR.len(), body))),
|
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@ -852,9 +848,10 @@ fn test_h2_body_length() {
|
|||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h2(|_| {
|
.h2(|_| {
|
||||||
let body = once(Ok(Bytes::from_static(STR.as_ref())));
|
let body = once(Ok(Bytes::from_static(STR.as_ref())));
|
||||||
ok::<_, ()>(Response::Ok().body(Body::from_message(
|
ok::<_, ()>(
|
||||||
body::SizedStream::new(STR.len(), body),
|
Response::Ok()
|
||||||
)))
|
.body(body::SizedStream::new(STR.len() as u64, body)),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
.map_err(|_| ()),
|
.map_err(|_| ()),
|
||||||
)
|
)
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
## [0.1.2] - 2019-06-02
|
||||||
|
|
||||||
|
* Fix boundary parsing #876
|
||||||
|
|
||||||
## [0.1.1] - 2019-05-25
|
## [0.1.1] - 2019-05-25
|
||||||
|
|
||||||
* Fix disconnect handling #834
|
* Fix disconnect handling #834
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-multipart"
|
name = "actix-multipart"
|
||||||
version = "0.1.1"
|
version = "0.1.2"
|
||||||
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
||||||
description = "Multipart support for actix web framework."
|
description = "Multipart support for actix web framework."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
@ -31,4 +31,4 @@ twoway = "0.2"
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-rt = "0.2.2"
|
actix-rt = "0.2.2"
|
||||||
actix-http = "0.2.0"
|
actix-http = "0.2.2"
|
1
actix-multipart/LICENSE-APACHE
Symbolic link
1
actix-multipart/LICENSE-APACHE
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-APACHE
|
1
actix-multipart/LICENSE-MIT
Symbolic link
1
actix-multipart/LICENSE-MIT
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-MIT
|
@ -537,8 +537,6 @@ impl InnerField {
|
|||||||
if &payload.buf[b_len..b_size] == boundary.as_bytes() {
|
if &payload.buf[b_len..b_size] == boundary.as_bytes() {
|
||||||
// found boundary
|
// found boundary
|
||||||
return Ok(Async::Ready(None));
|
return Ok(Async::Ready(None));
|
||||||
} else {
|
|
||||||
pos = b_size;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -576,7 +574,7 @@ impl InnerField {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return Ok(Async::Ready(Some(payload.buf.take().freeze())));
|
Ok(Async::Ready(Some(payload.buf.take().freeze())))
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1
actix-session/LICENSE-APACHE
Symbolic link
1
actix-session/LICENSE-APACHE
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-APACHE
|
1
actix-session/LICENSE-MIT
Symbolic link
1
actix-session/LICENSE-MIT
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-MIT
|
1
actix-web-actors/LICENSE-APACHE
Symbolic link
1
actix-web-actors/LICENSE-APACHE
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-APACHE
|
1
actix-web-actors/LICENSE-MIT
Symbolic link
1
actix-web-actors/LICENSE-MIT
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-MIT
|
1
awc/LICENSE-APACHE
Symbolic link
1
awc/LICENSE-APACHE
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-APACHE
|
1
awc/LICENSE-MIT
Symbolic link
1
awc/LICENSE-MIT
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-MIT
|
@ -111,7 +111,7 @@ pub use actix_web_codegen::*;
|
|||||||
|
|
||||||
// re-export for convenience
|
// re-export for convenience
|
||||||
pub use actix_http::Response as HttpResponse;
|
pub use actix_http::Response as HttpResponse;
|
||||||
pub use actix_http::{cookie, http, Error, HttpMessage, ResponseError, Result};
|
pub use actix_http::{body, cookie, http, Error, HttpMessage, ResponseError, Result};
|
||||||
|
|
||||||
pub use crate::app::App;
|
pub use crate::app::App;
|
||||||
pub use crate::extract::FromRequest;
|
pub use crate::extract::FromRequest;
|
||||||
@ -143,7 +143,7 @@ pub mod dev {
|
|||||||
pub use crate::types::json::JsonBody;
|
pub use crate::types::json::JsonBody;
|
||||||
pub use crate::types::readlines::Readlines;
|
pub use crate::types::readlines::Readlines;
|
||||||
|
|
||||||
pub use actix_http::body::{Body, BodySize, MessageBody, ResponseBody};
|
pub use actix_http::body::{Body, BodySize, MessageBody, ResponseBody, SizedStream};
|
||||||
pub use actix_http::encoding::Decoder as Decompress;
|
pub use actix_http::encoding::Decoder as Decompress;
|
||||||
pub use actix_http::ResponseBuilder as HttpResponseBuilder;
|
pub use actix_http::ResponseBuilder as HttpResponseBuilder;
|
||||||
pub use actix_http::{
|
pub use actix_http::{
|
||||||
|
1
test-server/LICENSE-APACHE
Symbolic link
1
test-server/LICENSE-APACHE
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-APACHE
|
1
test-server/LICENSE-MIT
Symbolic link
1
test-server/LICENSE-MIT
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../LICENSE-MIT
|
Reference in New Issue
Block a user