mirror of
https://github.com/fafhrd91/actix-web
synced 2024-11-24 00:21:08 +01:00
RC refinements (#2625)
This commit is contained in:
parent
b0a363a7ae
commit
1d1a65282f
@ -1,14 +1,17 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
### Added
|
||||||
|
- Implement `From<Vec<u8>>` for `Response<Vec<u8>>`. [#2625]
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- `error::DispatcherError` enum is now marked `#[non_exhaustive]`. [#2624]
|
- `error::DispatcherError` enum is now marked `#[non_exhaustive]`. [#2624]
|
||||||
|
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Issue where handlers that took payload but then dropped without reading it to EOF it would cause keep-alive connections to become stuck. [#2624]
|
- Issue where handlers that took payload but then dropped without reading it to EOF it would cause keep-alive connections to become stuck. [#2624]
|
||||||
|
|
||||||
[#2624]: https://github.com/actix/actix-web/pull/2624
|
[#2624]: https://github.com/actix/actix-web/pull/2624
|
||||||
|
[#2625]: https://github.com/actix/actix-web/pull/2625
|
||||||
|
|
||||||
|
|
||||||
## 3.0.0-rc.1 - 2022-01-31
|
## 3.0.0-rc.1 - 2022-01-31
|
||||||
|
@ -104,8 +104,13 @@ impl ServiceConfig {
|
|||||||
self.0.date_service.now()
|
self.0.date_service.now()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn write_date_header(&self, dst: &mut BytesMut, camel_case: bool) {
|
/// Writes date header to `dst` buffer.
|
||||||
let mut buf: [u8; 39] = [0; 39];
|
///
|
||||||
|
/// Low-level method that utilizes the built-in efficient date service, requiring fewer syscalls
|
||||||
|
/// than normal. Note that a CRLF (`\r\n`) is included in what is written.
|
||||||
|
#[doc(hidden)]
|
||||||
|
pub fn write_date_header(&self, dst: &mut BytesMut, camel_case: bool) {
|
||||||
|
let mut buf: [u8; 37] = [0; 37];
|
||||||
|
|
||||||
buf[..6].copy_from_slice(if camel_case { b"Date: " } else { b"date: " });
|
buf[..6].copy_from_slice(if camel_case { b"Date: " } else { b"date: " });
|
||||||
|
|
||||||
@ -113,7 +118,7 @@ impl ServiceConfig {
|
|||||||
.date_service
|
.date_service
|
||||||
.with_date(|date| buf[6..35].copy_from_slice(&date.bytes));
|
.with_date(|date| buf[6..35].copy_from_slice(&date.bytes));
|
||||||
|
|
||||||
buf[35..].copy_from_slice(b"\r\n\r\n");
|
buf[35..].copy_from_slice(b"\r\n");
|
||||||
dst.extend_from_slice(&buf);
|
dst.extend_from_slice(&buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,14 +210,14 @@ pub(crate) trait MessageType: Sized {
|
|||||||
dst.advance_mut(pos);
|
dst.advance_mut(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
// optimized date header, set_date writes \r\n
|
|
||||||
if !has_date {
|
if !has_date {
|
||||||
|
// optimized date header, write_date_header writes its own \r\n
|
||||||
config.write_date_header(dst, camel_case);
|
config.write_date_header(dst, camel_case);
|
||||||
} else {
|
|
||||||
// msg eof
|
|
||||||
dst.extend_from_slice(b"\r\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// end-of-headers marker
|
||||||
|
dst.extend_from_slice(b"\r\n");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,6 +285,24 @@ impl From<&'static [u8]> for Response<&'static [u8]> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<Vec<u8>> for Response<Vec<u8>> {
|
||||||
|
fn from(val: Vec<u8>) -> Self {
|
||||||
|
let mut res = Response::with_body(StatusCode::OK, val);
|
||||||
|
let mime = mime::APPLICATION_OCTET_STREAM.try_into_value().unwrap();
|
||||||
|
res.headers_mut().insert(header::CONTENT_TYPE, mime);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&Vec<u8>> for Response<Vec<u8>> {
|
||||||
|
fn from(val: &Vec<u8>) -> Self {
|
||||||
|
let mut res = Response::with_body(StatusCode::OK, val.clone());
|
||||||
|
let mime = mime::APPLICATION_OCTET_STREAM.try_into_value().unwrap();
|
||||||
|
res.headers_mut().insert(header::CONTENT_TYPE, mime);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<String> for Response<String> {
|
impl From<String> for Response<String> {
|
||||||
fn from(val: String) -> Self {
|
fn from(val: String) -> Self {
|
||||||
let mut res = Response::with_body(StatusCode::OK, val);
|
let mut res = Response::with_body(StatusCode::OK, val);
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
## Unreleased - 2021-xx-xx
|
## Unreleased - 2021-xx-xx
|
||||||
|
### Added
|
||||||
|
- Implement `Responder` for `Vec<u8>`. [#2625]
|
||||||
|
- Re-export `KeepAlive` in `http` mod. [#2625]
|
||||||
|
|
||||||
|
[#2625]: https://github.com/actix/actix-web/pull/2625
|
||||||
|
|
||||||
|
|
||||||
## 4.0.0-rc.2 - 2022-02-02
|
## 4.0.0-rc.2 - 2022-02-02
|
||||||
|
@ -3,4 +3,4 @@
|
|||||||
pub mod header;
|
pub mod header;
|
||||||
|
|
||||||
// TODO: figure out how best to expose http::Error vs actix_http::Error
|
// TODO: figure out how best to expose http::Error vs actix_http::Error
|
||||||
pub use actix_http::{uri, ConnectionType, Error, Method, StatusCode, Uri, Version};
|
pub use actix_http::{uri, ConnectionType, Error, KeepAlive, Method, StatusCode, Uri, Version};
|
||||||
|
@ -132,6 +132,7 @@ macro_rules! impl_responder_by_forward_into_base_response {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl_responder_by_forward_into_base_response!(&'static [u8]);
|
impl_responder_by_forward_into_base_response!(&'static [u8]);
|
||||||
|
impl_responder_by_forward_into_base_response!(Vec<u8>);
|
||||||
impl_responder_by_forward_into_base_response!(Bytes);
|
impl_responder_by_forward_into_base_response!(Bytes);
|
||||||
impl_responder_by_forward_into_base_response!(BytesMut);
|
impl_responder_by_forward_into_base_response!(BytesMut);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user