1
0
mirror of https://github.com/fafhrd91/actix-web synced 2025-01-18 13:51:50 +01:00

Merge branch 'master' into master

This commit is contained in:
Darin 2019-06-24 18:41:48 -04:00 committed by GitHub
commit 93855b889a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 178 additions and 103 deletions

View File

@ -1,6 +1,21 @@
# Changes # Changes
## [1.0.1] - 2019-06-xx ## [1.0.3] - unreleased
### Changed
* Use `encoding_rs` crate instead of unmaintained `encoding` crate
## [1.0.2] - 2019-06-17
### Changed
* Move cors middleware to `actix-cors` crate.
* Move identity middleware to `actix-identity` crate.
## [1.0.1] - 2019-06-17
### Add ### Add
@ -8,7 +23,7 @@
* Add `middleware::identity::RequestIdentity` trait to `get_identity` from `HttpMessage`. * Add `middleware::identity::RequestIdentity` trait to `get_identity` from `HttpMessage`.
### Changes ### Changed
* Move cors middleware to `actix-cors` crate. * Move cors middleware to `actix-cors` crate.
@ -38,7 +53,7 @@
* Add macros for head, options, trace, connect and patch http methods * Add macros for head, options, trace, connect and patch http methods
### Changes ### Changed
* Drop an unnecessary `Option<_>` indirection around `ServerBuilder` from `HttpServer`. #863 * Drop an unnecessary `Option<_>` indirection around `ServerBuilder` from `HttpServer`. #863
@ -56,7 +71,7 @@
* Add `Query<T>::from_query()` to extract parameters from a query string. #846 * Add `Query<T>::from_query()` to extract parameters from a query string. #846
* `QueryConfig`, similar to `JsonConfig` for customizing error handling of query extractors. * `QueryConfig`, similar to `JsonConfig` for customizing error handling of query extractors.
### Changes ### Changed
* `JsonConfig` is now `Send + Sync`, this implies that `error_handler` must be `Send + Sync` too. * `JsonConfig` is now `Send + Sync`, this implies that `error_handler` must be `Send + Sync` too.
@ -71,7 +86,7 @@
* Allow to set/override app data on scope level * Allow to set/override app data on scope level
### Changes ### Changed
* `App::configure` take an `FnOnce` instead of `Fn` * `App::configure` take an `FnOnce` instead of `Fn`
* Upgrade actix-net crates * Upgrade actix-net crates

View File

@ -1,6 +1,6 @@
[package] [package]
name = "actix-web" name = "actix-web"
version = "1.0.0" version = "1.0.2"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"] authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix web is a simple, pragmatic and extremely fast web framework for Rust." description = "Actix web is a simple, pragmatic and extremely fast web framework for Rust."
readme = "README.md" readme = "README.md"
@ -43,7 +43,7 @@ members = [
] ]
[features] [features]
default = ["brotli", "flate2-zlib", "client", "fail", "depracated"] default = ["brotli", "flate2-zlib", "client", "fail"]
# http client # http client
client = ["awc"] client = ["awc"]
@ -68,31 +68,24 @@ ssl = ["openssl", "actix-server/ssl", "awc/ssl"]
# rustls # rustls
rust-tls = ["rustls", "actix-server/rust-tls"] rust-tls = ["rustls", "actix-server/rust-tls"]
# deprecated middlewares
depracated = ["actix-cors", "actix-identity"]
[dependencies] [dependencies]
actix-codec = "0.1.2" actix-codec = "0.1.2"
actix-service = "0.4.0" actix-service = "0.4.1"
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.2" actix-web-codegen = "0.1.2"
actix-http = "0.2.3" actix-http = "0.2.4"
actix-server = "0.5.1" actix-server = "0.5.1"
actix-server-config = "0.1.1" actix-server-config = "0.1.1"
actix-threadpool = "0.1.1" actix-threadpool = "0.1.1"
awc = { version = "0.2.1", optional = true } awc = { version = "0.2.1", optional = true }
# deprecated middlewares
actix-cors = { version = "0.1.0", optional = true }
actix-identity = { version = "0.1.0", optional = true }
bytes = "0.4" bytes = "0.4"
derive_more = "0.14" derive_more = "0.15.0"
encoding = "0.2" encoding_rs = "0.8"
futures = "0.1.25" futures = "0.1.25"
hashbrown = "0.3.1" hashbrown = "0.5.0"
log = "0.4" log = "0.4"
mime = "0.3" mime = "0.3"
net2 = "0.2.33" net2 = "0.2.33"
@ -110,8 +103,8 @@ rustls = { version = "0.15", optional = true }
[dev-dependencies] [dev-dependencies]
actix = { version = "0.8.3" } actix = { version = "0.8.3" }
actix-http = { version = "0.2.3", features=["ssl", "brotli", "flate2-zlib"] } actix-http = { version = "0.2.4", features=["ssl", "brotli", "flate2-zlib"] }
actix-http-test = { version = "0.2.0", features=["ssl"] } actix-http-test = { version = "0.2.2", features=["ssl"] }
rand = "0.6" rand = "0.6"
env_logger = "0.6" env_logger = "0.6"
serde_derive = "1.0" serde_derive = "1.0"
@ -125,7 +118,7 @@ opt-level = 3
codegen-units = 1 codegen-units = 1
[patch.crates-io] [patch.crates-io]
# actix-web = { path = "." } actix-web = { path = "." }
actix-http = { path = "actix-http" } actix-http = { path = "actix-http" }
actix-http-test = { path = "test-server" } actix-http-test = { path = "test-server" }
actix-web-codegen = { path = "actix-web-codegen" } actix-web-codegen = { path = "actix-web-codegen" }

View File

@ -31,6 +31,64 @@
## 1.0.0 ## 1.0.0
* Extractor configuration. In version 1.0 this is handled with the new `Data` mechanism for both setting and retrieving the configuration
instead of
```rust
#[derive(Default)]
struct ExtractorConfig {
config: String,
}
impl FromRequest for YourExtractor {
type Config = ExtractorConfig;
type Result = Result<YourExtractor, Error>;
fn from_request(req: &HttpRequest, cfg: &Self::Config) -> Self::Result {
println!("use the config: {:?}", cfg.config);
...
}
}
App::new().resource("/route_with_config", |r| {
r.post().with_config(handler_fn, |cfg| {
cfg.0.config = "test".to_string();
})
})
```
use the HttpRequest to get the configuration like any other `Data` with `req.app_data::<C>()` and set it with the `data()` method on the `resource`
```rust
#[derive(Default)]
struct ExtractorConfig {
config: String,
}
impl FromRequest for YourExtractor {
type Error = Error;
type Future = Result<Self, Self::Error>;
type Config = ExtractorConfig;
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
let cfg = req.app_data::<ExtractorConfig>();
println!("config data?: {:?}", cfg.unwrap().role);
...
}
}
App::new().service(
resource("/route_with_config")
.data(ExtractorConfig {
config: "test".to_string(),
})
.route(post().to(handler_fn)),
)
```
* Resource registration. 1.0 version uses generalized resource * Resource registration. 1.0 version uses generalized resource
registration via `.service()` method. registration via `.service()` method.

View File

@ -1,5 +1,9 @@
# Changes # Changes
## [0.1.1] - unreleased
* Bump `derive_more` crate version to 0.15.0
## [0.1.0] - 2019-06-15 ## [0.1.0] - 2019-06-15
* Move cors middleware to separate crate * Move cors middleware to separate crate

View File

@ -19,5 +19,5 @@ path = "src/lib.rs"
[dependencies] [dependencies]
actix-web = "1.0.0" actix-web = "1.0.0"
actix-service = "0.4.0" actix-service = "0.4.0"
derive_more = "0.14.1" derive_more = "0.15.0"
futures = "0.1.25" futures = "0.1.25"

View File

@ -19,12 +19,12 @@ path = "src/lib.rs"
[dependencies] [dependencies]
actix-web = { version = "1.0.0", default-features = false } actix-web = { version = "1.0.0", default-features = false }
actix-http = "0.2.3" actix-http = "0.2.4"
actix-service = "0.4.0" actix-service = "0.4.1"
bitflags = "1" bitflags = "1"
bytes = "0.4" bytes = "0.4"
futures = "0.1.25" futures = "0.1.25"
derive_more = "0.14" derive_more = "0.15.0"
log = "0.4" log = "0.4"
mime = "0.3" mime = "0.3"
mime_guess = "2.0.0-alpha" mime_guess = "2.0.0-alpha"

View File

@ -1,5 +1,18 @@
# Changes # Changes
## [0.2.5] - unreleased
### Changed
* Use `encoding_rs` crate instead of unmaintained `encoding` crate
## [0.2.4] - 2019-06-16
### Fixed
* Do not compress NoContent (204) responses #918
## [0.2.3] - 2019-06-02 ## [0.2.3] - 2019-06-02
### Added ### Added
@ -76,7 +89,7 @@
## [0.1.1] - 2019-04-19 ## [0.1.1] - 2019-04-19
### Changes ### Changed
* Cookie::max_age() accepts value in seconds * Cookie::max_age() accepts value in seconds

View File

@ -1,6 +1,6 @@
[package] [package]
name = "actix-http" name = "actix-http"
version = "0.2.3" version = "0.2.4"
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"
@ -56,11 +56,11 @@ bitflags = "1.0"
bytes = "0.4" bytes = "0.4"
byteorder = "1.2" byteorder = "1.2"
copyless = "0.1.2" copyless = "0.1.2"
derive_more = "0.14" derive_more = "0.15.0"
either = "1.5.2" either = "1.5.2"
encoding = "0.2" encoding_rs = "0.8"
futures = "0.1.25" futures = "0.1.25"
hashbrown = "0.3.0" hashbrown = "0.5.0"
h2 = "0.1.16" h2 = "0.1.16"
http = "0.1.17" http = "0.1.17"
httparse = "1.3" httparse = "1.3"

View File

@ -33,6 +33,7 @@ impl<B: MessageBody> Encoder<B> {
) -> ResponseBody<Encoder<B>> { ) -> ResponseBody<Encoder<B>> {
let can_encode = !(head.headers().contains_key(&CONTENT_ENCODING) let can_encode = !(head.headers().contains_key(&CONTENT_ENCODING)
|| head.status == StatusCode::SWITCHING_PROTOCOLS || head.status == StatusCode::SWITCHING_PROTOCOLS
|| head.status == StatusCode::NO_CONTENT
|| encoding == ContentEncoding::Identity || encoding == ContentEncoding::Identity
|| encoding == ContentEncoding::Auto); || encoding == ContentEncoding::Auto);

View File

@ -61,6 +61,7 @@ impl Response {
STATIC_RESP!(RangeNotSatisfiable, StatusCode::RANGE_NOT_SATISFIABLE); STATIC_RESP!(RangeNotSatisfiable, StatusCode::RANGE_NOT_SATISFIABLE);
STATIC_RESP!(ExpectationFailed, StatusCode::EXPECTATION_FAILED); STATIC_RESP!(ExpectationFailed, StatusCode::EXPECTATION_FAILED);
STATIC_RESP!(UnprocessableEntity, StatusCode::UNPROCESSABLE_ENTITY); STATIC_RESP!(UnprocessableEntity, StatusCode::UNPROCESSABLE_ENTITY);
STATIC_RESP!(TooManyRequests, StatusCode::TOO_MANY_REQUESTS);
STATIC_RESP!(InternalServerError, StatusCode::INTERNAL_SERVER_ERROR); STATIC_RESP!(InternalServerError, StatusCode::INTERNAL_SERVER_ERROR);
STATIC_RESP!(NotImplemented, StatusCode::NOT_IMPLEMENTED); STATIC_RESP!(NotImplemented, StatusCode::NOT_IMPLEMENTED);

View File

@ -1,9 +1,7 @@
use std::cell::{Ref, RefMut}; use std::cell::{Ref, RefMut};
use std::str; use std::str;
use encoding::all::UTF_8; use encoding_rs::{Encoding, UTF_8};
use encoding::label::encoding_from_whatwg_label;
use encoding::EncodingRef;
use http::header; use http::header;
use mime::Mime; use mime::Mime;
@ -59,10 +57,12 @@ pub trait HttpMessage: Sized {
/// Get content type encoding /// Get content type encoding
/// ///
/// UTF-8 is used by default, If request charset is not set. /// UTF-8 is used by default, If request charset is not set.
fn encoding(&self) -> Result<EncodingRef, ContentTypeError> { fn encoding(&self) -> Result<&'static Encoding, ContentTypeError> {
if let Some(mime_type) = self.mime_type()? { if let Some(mime_type) = self.mime_type()? {
if let Some(charset) = mime_type.get_param("charset") { if let Some(charset) = mime_type.get_param("charset") {
if let Some(enc) = encoding_from_whatwg_label(charset.as_str()) { if let Some(enc) =
Encoding::for_label_no_replacement(charset.as_str().as_bytes())
{
Ok(enc) Ok(enc)
} else { } else {
Err(ContentTypeError::UnknownEncoding) Err(ContentTypeError::UnknownEncoding)
@ -166,8 +166,7 @@ where
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use bytes::Bytes; use bytes::Bytes;
use encoding::all::ISO_8859_2; use encoding_rs::ISO_8859_2;
use encoding::Encoding;
use mime; use mime;
use super::*; use super::*;
@ -223,7 +222,7 @@ mod tests {
"application/json; charset=ISO-8859-2", "application/json; charset=ISO-8859-2",
) )
.finish(); .finish();
assert_eq!(ISO_8859_2.name(), req.encoding().unwrap().name()); assert_eq!(ISO_8859_2, req.encoding().unwrap());
} }
#[test] #[test]

View File

@ -19,9 +19,9 @@ path = "src/lib.rs"
[dependencies] [dependencies]
actix-web = { version = "1.0.0", default-features = false } actix-web = { version = "1.0.0", default-features = false }
actix-service = "0.4.0" actix-service = "0.4.1"
bytes = "0.4" bytes = "0.4"
derive_more = "0.14" derive_more = "0.15.0"
httparse = "1.3" httparse = "1.3"
futures = "0.1.25" futures = "0.1.25"
log = "0.4" log = "0.4"
@ -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.2" actix-http = "0.2.4"

View File

@ -24,12 +24,12 @@ default = ["cookie-session"]
cookie-session = ["actix-web/secure-cookies"] cookie-session = ["actix-web/secure-cookies"]
[dependencies] [dependencies]
actix-web = "1.0.0-rc" actix-web = "1.0.0"
actix-service = "0.4.0" actix-service = "0.4.1"
bytes = "0.4" bytes = "0.4"
derive_more = "0.14" derive_more = "0.15.0"
futures = "0.1.25" futures = "0.1.25"
hashbrown = "0.3.0" hashbrown = "0.5.0"
serde = "1.0" serde = "1.0"
serde_json = "1.0" serde_json = "1.0"
time = "0.1.42" time = "0.1.42"

View File

@ -19,8 +19,8 @@ path = "src/lib.rs"
[dependencies] [dependencies]
actix = "0.8.3" actix = "0.8.3"
actix-web = "1.0.0-rc" actix-web = "1.0.0"
actix-http = "0.2.2" actix-http = "0.2.4"
actix-codec = "0.1.2" actix-codec = "0.1.2"
bytes = "0.4" bytes = "0.4"
futures = "0.1.25" futures = "0.1.25"

View File

@ -16,7 +16,7 @@ quote = "0.6.12"
syn = { version = "0.15.34", features = ["full", "parsing", "extra-traits"] } syn = { version = "0.15.34", features = ["full", "parsing", "extra-traits"] }
[dev-dependencies] [dev-dependencies]
actix-web = { version = "1.0.0-rc" } actix-web = { version = "1.0.0" }
actix-http = { version = "0.2.2", features=["ssl"] } actix-http = { version = "0.2.4", features=["ssl"] }
actix-http-test = { version = "0.2.0", features=["ssl"] } actix-http-test = { version = "0.2.0", features=["ssl"] }
futures = { version = "0.1" } futures = { version = "0.1" }

View File

@ -40,11 +40,11 @@ flate2-rust = ["actix-http/flate2-rust"]
[dependencies] [dependencies]
actix-codec = "0.1.2" actix-codec = "0.1.2"
actix-service = "0.4.0" actix-service = "0.4.1"
actix-http = "0.2.3" actix-http = "0.2.4"
base64 = "0.10.1" base64 = "0.10.1"
bytes = "0.4" bytes = "0.4"
derive_more = "0.14" derive_more = "0.15.0"
futures = "0.1.25" futures = "0.1.25"
log =" 0.4" log =" 0.4"
mime = "0.3" mime = "0.3"
@ -58,8 +58,8 @@ openssl = { version="0.10", optional = true }
[dev-dependencies] [dev-dependencies]
actix-rt = "0.2.2" actix-rt = "0.2.2"
actix-web = { version = "1.0.0-rc", features=["ssl"] } actix-web = { version = "1.0.0", features=["ssl"] }
actix-http = { version = "0.2.3", features=["ssl"] } actix-http = { version = "0.2.4", features=["ssl"] }
actix-http-test = { version = "0.2.0", features=["ssl"] } actix-http-test = { version = "0.2.0", features=["ssl"] }
actix-utils = "0.4.1" actix-utils = "0.4.1"
actix-server = { version = "0.5.1", features=["ssl"] } actix-server = { version = "0.5.1", features=["ssl"] }

View File

@ -73,7 +73,7 @@ impl<T> Data<T> {
Data(Arc::new(state)) Data(Arc::new(state))
} }
/// Get referecnce to inner app data. /// Get reference to inner app data.
pub fn get_ref(&self) -> &T { pub fn get_ref(&self) -> &T {
self.0.as_ref() self.0.as_ref()
} }

View File

@ -10,17 +10,3 @@ mod normalize;
pub use self::defaultheaders::DefaultHeaders; pub use self::defaultheaders::DefaultHeaders;
pub use self::logger::Logger; pub use self::logger::Logger;
pub use self::normalize::NormalizePath; pub use self::normalize::NormalizePath;
#[cfg(feature = "deprecated")]
#[deprecated(
since = "1.0.1",
note = "please use `actix_cors` instead. support will be removed in actix-web 1.0.2"
)]
pub use actix_cors as cors;
#[cfg(feature = "deprecated")]
#[deprecated(
since = "1.0.1",
note = "please use `actix_identity` instead. support will be removed in actix-web 1.0.2"
)]
pub use actix_identity as identity;

View File

@ -5,9 +5,7 @@ use std::{fmt, ops};
use actix_http::{Error, HttpMessage, Payload}; use actix_http::{Error, HttpMessage, Payload};
use bytes::BytesMut; use bytes::BytesMut;
use encoding::all::UTF_8; use encoding_rs::{Encoding, UTF_8};
use encoding::types::{DecoderTrap, Encoding};
use encoding::EncodingRef;
use futures::{Future, Poll, Stream}; use futures::{Future, Poll, Stream};
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
@ -187,7 +185,7 @@ pub struct UrlEncoded<U> {
stream: Option<Decompress<Payload>>, stream: Option<Decompress<Payload>>,
limit: usize, limit: usize,
length: Option<usize>, length: Option<usize>,
encoding: EncodingRef, encoding: &'static Encoding,
err: Option<UrlencodedError>, err: Option<UrlencodedError>,
fut: Option<Box<Future<Item = U, Error = UrlencodedError>>>, fut: Option<Box<Future<Item = U, Error = UrlencodedError>>>,
} }
@ -286,13 +284,14 @@ where
} }
}) })
.and_then(move |body| { .and_then(move |body| {
if (encoding as *const Encoding) == UTF_8 { if encoding == UTF_8 {
serde_urlencoded::from_bytes::<U>(&body) serde_urlencoded::from_bytes::<U>(&body)
.map_err(|_| UrlencodedError::Parse) .map_err(|_| UrlencodedError::Parse)
} else { } else {
let body = encoding let body = encoding
.decode(&body, DecoderTrap::Strict) .decode_without_bom_handling_and_without_replacement(&body)
.map_err(|_| UrlencodedError::Parse)?; .map(|s| s.into_owned())
.ok_or(UrlencodedError::Parse)?;
serde_urlencoded::from_str::<U>(&body) serde_urlencoded::from_str::<U>(&body)
.map_err(|_| UrlencodedError::Parse) .map_err(|_| UrlencodedError::Parse)
} }

View File

@ -4,8 +4,7 @@ use std::str;
use actix_http::error::{Error, ErrorBadRequest, PayloadError}; use actix_http::error::{Error, ErrorBadRequest, PayloadError};
use actix_http::HttpMessage; use actix_http::HttpMessage;
use bytes::{Bytes, BytesMut}; use bytes::{Bytes, BytesMut};
use encoding::all::UTF_8; use encoding_rs::UTF_8;
use encoding::types::{DecoderTrap, Encoding};
use futures::future::{err, Either, FutureResult}; use futures::future::{err, Either, FutureResult};
use futures::{Future, Poll, Stream}; use futures::{Future, Poll, Stream};
use mime::Mime; use mime::Mime;
@ -208,15 +207,15 @@ impl FromRequest for String {
.limit(limit) .limit(limit)
.from_err() .from_err()
.and_then(move |body| { .and_then(move |body| {
let enc: *const Encoding = encoding as *const Encoding; if encoding == UTF_8 {
if enc == UTF_8 {
Ok(str::from_utf8(body.as_ref()) Ok(str::from_utf8(body.as_ref())
.map_err(|_| ErrorBadRequest("Can not decode body"))? .map_err(|_| ErrorBadRequest("Can not decode body"))?
.to_owned()) .to_owned())
} else { } else {
Ok(encoding Ok(encoding
.decode(&body, DecoderTrap::Strict) .decode_without_bom_handling_and_without_replacement(&body)
.map_err(|_| ErrorBadRequest("Can not decode body"))?) .map(|s| s.into_owned())
.ok_or_else(|| ErrorBadRequest("Can not decode body"))?)
} }
}), }),
)) ))

View File

@ -1,9 +1,8 @@
use std::borrow::Cow;
use std::str; use std::str;
use bytes::{Bytes, BytesMut}; use bytes::{Bytes, BytesMut};
use encoding::all::UTF_8; use encoding_rs::{Encoding, UTF_8};
use encoding::types::{DecoderTrap, Encoding};
use encoding::EncodingRef;
use futures::{Async, Poll, Stream}; use futures::{Async, Poll, Stream};
use crate::dev::Payload; use crate::dev::Payload;
@ -16,7 +15,7 @@ pub struct Readlines<T: HttpMessage> {
buff: BytesMut, buff: BytesMut,
limit: usize, limit: usize,
checked_buff: bool, checked_buff: bool,
encoding: EncodingRef, encoding: &'static Encoding,
err: Option<ReadlinesError>, err: Option<ReadlinesError>,
} }
@ -87,15 +86,17 @@ where
if ind + 1 > self.limit { if ind + 1 > self.limit {
return Err(ReadlinesError::LimitOverflow); return Err(ReadlinesError::LimitOverflow);
} }
let enc: *const Encoding = self.encoding as *const Encoding; let line = if self.encoding == UTF_8 {
let line = if enc == UTF_8 {
str::from_utf8(&self.buff.split_to(ind + 1)) str::from_utf8(&self.buff.split_to(ind + 1))
.map_err(|_| ReadlinesError::EncodingError)? .map_err(|_| ReadlinesError::EncodingError)?
.to_owned() .to_owned()
} else { } else {
self.encoding self.encoding
.decode(&self.buff.split_to(ind + 1), DecoderTrap::Strict) .decode_without_bom_handling_and_without_replacement(
.map_err(|_| ReadlinesError::EncodingError)? &self.buff.split_to(ind + 1),
)
.map(Cow::into_owned)
.ok_or(ReadlinesError::EncodingError)?
}; };
return Ok(Async::Ready(Some(line))); return Ok(Async::Ready(Some(line)));
} }
@ -117,15 +118,17 @@ where
if ind + 1 > self.limit { if ind + 1 > self.limit {
return Err(ReadlinesError::LimitOverflow); return Err(ReadlinesError::LimitOverflow);
} }
let enc: *const Encoding = self.encoding as *const Encoding; let line = if self.encoding == UTF_8 {
let line = if enc == UTF_8 {
str::from_utf8(&bytes.split_to(ind + 1)) str::from_utf8(&bytes.split_to(ind + 1))
.map_err(|_| ReadlinesError::EncodingError)? .map_err(|_| ReadlinesError::EncodingError)?
.to_owned() .to_owned()
} else { } else {
self.encoding self.encoding
.decode(&bytes.split_to(ind + 1), DecoderTrap::Strict) .decode_without_bom_handling_and_without_replacement(
.map_err(|_| ReadlinesError::EncodingError)? &bytes.split_to(ind + 1),
)
.map(Cow::into_owned)
.ok_or(ReadlinesError::EncodingError)?
}; };
// extend buffer with rest of the bytes; // extend buffer with rest of the bytes;
self.buff.extend_from_slice(&bytes); self.buff.extend_from_slice(&bytes);
@ -143,15 +146,15 @@ where
if self.buff.len() > self.limit { if self.buff.len() > self.limit {
return Err(ReadlinesError::LimitOverflow); return Err(ReadlinesError::LimitOverflow);
} }
let enc: *const Encoding = self.encoding as *const Encoding; let line = if self.encoding == UTF_8 {
let line = if enc == UTF_8 {
str::from_utf8(&self.buff) str::from_utf8(&self.buff)
.map_err(|_| ReadlinesError::EncodingError)? .map_err(|_| ReadlinesError::EncodingError)?
.to_owned() .to_owned()
} else { } else {
self.encoding self.encoding
.decode(&self.buff, DecoderTrap::Strict) .decode_without_bom_handling_and_without_replacement(&self.buff)
.map_err(|_| ReadlinesError::EncodingError)? .map(Cow::into_owned)
.ok_or(ReadlinesError::EncodingError)?
}; };
self.buff.clear(); self.buff.clear();
Ok(Async::Ready(Some(line))) Ok(Async::Ready(Some(line)))

View File

@ -1,5 +1,9 @@
# Changes # Changes
## [0.2.2] - 2019-06-16
* Add .put() and .sput() methods
## [0.2.1] - 2019-06-05 ## [0.2.1] - 2019-06-05
* Add license files * Add license files

View File

@ -1,6 +1,6 @@
[package] [package]
name = "actix-http-test" name = "actix-http-test"
version = "0.2.1" version = "0.2.2"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"] authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix http test server" description = "Actix http test server"
readme = "README.md" readme = "README.md"
@ -32,7 +32,7 @@ ssl = ["openssl", "actix-server/ssl", "awc/ssl"]
[dependencies] [dependencies]
actix-codec = "0.1.2" actix-codec = "0.1.2"
actix-rt = "0.2.2" actix-rt = "0.2.2"
actix-service = "0.4.0" actix-service = "0.4.1"
actix-server = "0.5.1" actix-server = "0.5.1"
actix-utils = "0.4.1" actix-utils = "0.4.1"
awc = "0.2.1" awc = "0.2.1"
@ -55,5 +55,5 @@ tokio-timer = "0.2"
openssl = { version="0.10", optional = true } openssl = { version="0.10", optional = true }
[dev-dependencies] [dev-dependencies]
actix-web = "1.0.0-rc" actix-web = "1.0.0"
actix-http = "0.2.3" actix-http = "0.2.4"