mirror of
https://github.com/fafhrd91/actix-web
synced 2024-11-27 17:52:56 +01:00
Ensure that Content-Length zero is specified in empty request
This commit is contained in:
parent
6d11ee683f
commit
42f030d3f4
@ -12,6 +12,8 @@
|
|||||||
|
|
||||||
* Ignored the `If-Modified-Since` if `If-None-Match` is specified. #680
|
* Ignored the `If-Modified-Since` if `If-None-Match` is specified. #680
|
||||||
|
|
||||||
|
* Do not remove `Content-Length` on `Body::Empty` and insert zero value if it is missing for `POST` and `PUT` methods.
|
||||||
|
|
||||||
## [0.7.18] - 2019-01-10
|
## [0.7.18] - 2019-01-10
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
@ -16,9 +16,9 @@ use flate2::write::{GzEncoder, ZlibEncoder};
|
|||||||
use flate2::Compression;
|
use flate2::Compression;
|
||||||
use futures::{Async, Poll};
|
use futures::{Async, Poll};
|
||||||
use http::header::{
|
use http::header::{
|
||||||
HeaderValue, CONNECTION, CONTENT_ENCODING, CONTENT_LENGTH, DATE, TRANSFER_ENCODING,
|
self, HeaderValue, CONNECTION, CONTENT_ENCODING, CONTENT_LENGTH, DATE, TRANSFER_ENCODING,
|
||||||
};
|
};
|
||||||
use http::{HttpTryFrom, Version};
|
use http::{Method, HttpTryFrom, Version};
|
||||||
use time::{self, Duration};
|
use time::{self, Duration};
|
||||||
use tokio_io::AsyncWrite;
|
use tokio_io::AsyncWrite;
|
||||||
|
|
||||||
@ -223,7 +223,19 @@ fn content_encoder(buf: BytesMut, req: &mut ClientRequest) -> Output {
|
|||||||
|
|
||||||
let transfer = match body {
|
let transfer = match body {
|
||||||
Body::Empty => {
|
Body::Empty => {
|
||||||
req.headers_mut().remove(CONTENT_LENGTH);
|
match req.method() {
|
||||||
|
//Insert zero content-length only if user hasn't added it.
|
||||||
|
//We don't really need it for other methods as they are not supposed to carry payload
|
||||||
|
&Method::POST | &Method::PUT | &Method::PATCH => {
|
||||||
|
req.headers_mut()
|
||||||
|
.entry(CONTENT_LENGTH)
|
||||||
|
.expect("CONTENT_LENGTH to be valid header name")
|
||||||
|
.or_insert(header::HeaderValue::from_static("0"));
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
req.headers_mut().remove(CONTENT_LENGTH);
|
||||||
|
}
|
||||||
|
}
|
||||||
return Output::Empty(buf);
|
return Output::Empty(buf);
|
||||||
}
|
}
|
||||||
Body::Binary(ref mut bytes) => {
|
Body::Binary(ref mut bytes) => {
|
||||||
@ -410,3 +422,76 @@ impl CachedDate {
|
|||||||
self.next_update.nsec = 0;
|
self.next_update.nsec = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_content_encoder_empty_body() {
|
||||||
|
let mut req = ClientRequest::post("http://google.com").finish().expect("Create request");
|
||||||
|
|
||||||
|
let result = content_encoder(BytesMut::new(), &mut req);
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Output::Empty(buf) => {
|
||||||
|
assert_eq!(buf.len(), 0);
|
||||||
|
let content_len = req.headers().get(CONTENT_LENGTH).expect("To set Content-Length for empty POST");
|
||||||
|
assert_eq!(content_len, "0");
|
||||||
|
},
|
||||||
|
_ => panic!("Unexpected result, should be Output::Empty"),
|
||||||
|
}
|
||||||
|
|
||||||
|
req.set_method(Method::GET);
|
||||||
|
|
||||||
|
let result = content_encoder(BytesMut::new(), &mut req);
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Output::Empty(buf) => {
|
||||||
|
assert_eq!(buf.len(), 0);
|
||||||
|
assert!(!req.headers().contains_key(CONTENT_LENGTH));
|
||||||
|
},
|
||||||
|
_ => panic!("Unexpected result, should be Output::Empty"),
|
||||||
|
}
|
||||||
|
|
||||||
|
req.set_method(Method::PUT);
|
||||||
|
|
||||||
|
let result = content_encoder(BytesMut::new(), &mut req);
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Output::Empty(buf) => {
|
||||||
|
assert_eq!(buf.len(), 0);
|
||||||
|
let content_len = req.headers().get(CONTENT_LENGTH).expect("To set Content-Length for empty PUT");
|
||||||
|
assert_eq!(content_len, "0");
|
||||||
|
},
|
||||||
|
_ => panic!("Unexpected result, should be Output::Empty"),
|
||||||
|
}
|
||||||
|
|
||||||
|
req.set_method(Method::DELETE);
|
||||||
|
|
||||||
|
let result = content_encoder(BytesMut::new(), &mut req);
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Output::Empty(buf) => {
|
||||||
|
assert_eq!(buf.len(), 0);
|
||||||
|
assert!(!req.headers().contains_key(CONTENT_LENGTH));
|
||||||
|
},
|
||||||
|
_ => panic!("Unexpected result, should be Output::Empty"),
|
||||||
|
}
|
||||||
|
|
||||||
|
req.set_method(Method::PATCH);
|
||||||
|
|
||||||
|
let result = content_encoder(BytesMut::new(), &mut req);
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Output::Empty(buf) => {
|
||||||
|
assert_eq!(buf.len(), 0);
|
||||||
|
let content_len = req.headers().get(CONTENT_LENGTH).expect("To set Content-Length for empty PATCH");
|
||||||
|
assert_eq!(content_len, "0");
|
||||||
|
},
|
||||||
|
_ => panic!("Unexpected result, should be Output::Empty"),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user