mirror of
https://github.com/actix/actix-web.git
synced 2024-12-21 07:36:43 +00:00
Make UrlencodedError::Overflow more informative (#1089)
This commit is contained in:
parent
7c9f9afc46
commit
32a1c36597
3 changed files with 21 additions and 9 deletions
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
* Allow to re-construct `ServiceRequest` from `HttpRequest` and `Payload`
|
* Allow to re-construct `ServiceRequest` from `HttpRequest` and `Payload`
|
||||||
|
|
||||||
|
* Make UrlEncodedError::Overflow more informativve
|
||||||
|
|
||||||
## [1.0.7] - 2019-08-29
|
## [1.0.7] - 2019-08-29
|
||||||
|
|
||||||
|
|
13
src/error.rs
13
src/error.rs
|
@ -32,8 +32,12 @@ pub enum UrlencodedError {
|
||||||
#[display(fmt = "Can not decode chunked transfer encoding")]
|
#[display(fmt = "Can not decode chunked transfer encoding")]
|
||||||
Chunked,
|
Chunked,
|
||||||
/// Payload size is bigger than allowed. (default: 256kB)
|
/// Payload size is bigger than allowed. (default: 256kB)
|
||||||
#[display(fmt = "Urlencoded payload size is bigger than allowed (default: 256kB)")]
|
#[display(
|
||||||
Overflow,
|
fmt = "Urlencoded payload size is bigger ({} bytes) than allowed (default: {} bytes)",
|
||||||
|
size,
|
||||||
|
limit
|
||||||
|
)]
|
||||||
|
Overflow { size: usize, limit: usize },
|
||||||
/// Payload size is now known
|
/// Payload size is now known
|
||||||
#[display(fmt = "Payload size is now known")]
|
#[display(fmt = "Payload size is now known")]
|
||||||
UnknownLength,
|
UnknownLength,
|
||||||
|
@ -52,7 +56,7 @@ pub enum UrlencodedError {
|
||||||
impl ResponseError for UrlencodedError {
|
impl ResponseError for UrlencodedError {
|
||||||
fn error_response(&self) -> HttpResponse {
|
fn error_response(&self) -> HttpResponse {
|
||||||
match *self {
|
match *self {
|
||||||
UrlencodedError::Overflow => {
|
UrlencodedError::Overflow { .. } => {
|
||||||
HttpResponse::new(StatusCode::PAYLOAD_TOO_LARGE)
|
HttpResponse::new(StatusCode::PAYLOAD_TOO_LARGE)
|
||||||
}
|
}
|
||||||
UrlencodedError::UnknownLength => {
|
UrlencodedError::UnknownLength => {
|
||||||
|
@ -164,7 +168,8 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_urlencoded_error() {
|
fn test_urlencoded_error() {
|
||||||
let resp: HttpResponse = UrlencodedError::Overflow.error_response();
|
let resp: HttpResponse =
|
||||||
|
UrlencodedError::Overflow { size: 0, limit: 0 }.error_response();
|
||||||
assert_eq!(resp.status(), StatusCode::PAYLOAD_TOO_LARGE);
|
assert_eq!(resp.status(), StatusCode::PAYLOAD_TOO_LARGE);
|
||||||
let resp: HttpResponse = UrlencodedError::UnknownLength.error_response();
|
let resp: HttpResponse = UrlencodedError::UnknownLength.error_response();
|
||||||
assert_eq!(resp.status(), StatusCode::LENGTH_REQUIRED);
|
assert_eq!(resp.status(), StatusCode::LENGTH_REQUIRED);
|
||||||
|
|
|
@ -318,7 +318,7 @@ where
|
||||||
let limit = self.limit;
|
let limit = self.limit;
|
||||||
if let Some(len) = self.length.take() {
|
if let Some(len) = self.length.take() {
|
||||||
if len > limit {
|
if len > limit {
|
||||||
return Err(UrlencodedError::Overflow);
|
return Err(UrlencodedError::Overflow { size: len, limit });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,7 +331,10 @@ where
|
||||||
.from_err()
|
.from_err()
|
||||||
.fold(BytesMut::with_capacity(8192), move |mut body, chunk| {
|
.fold(BytesMut::with_capacity(8192), move |mut body, chunk| {
|
||||||
if (body.len() + chunk.len()) > limit {
|
if (body.len() + chunk.len()) > limit {
|
||||||
Err(UrlencodedError::Overflow)
|
Err(UrlencodedError::Overflow {
|
||||||
|
size: body.len() + chunk.len(),
|
||||||
|
limit,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
body.extend_from_slice(&chunk);
|
body.extend_from_slice(&chunk);
|
||||||
Ok(body)
|
Ok(body)
|
||||||
|
@ -390,8 +393,8 @@ mod tests {
|
||||||
|
|
||||||
fn eq(err: UrlencodedError, other: UrlencodedError) -> bool {
|
fn eq(err: UrlencodedError, other: UrlencodedError) -> bool {
|
||||||
match err {
|
match err {
|
||||||
UrlencodedError::Overflow => match other {
|
UrlencodedError::Overflow { .. } => match other {
|
||||||
UrlencodedError::Overflow => true,
|
UrlencodedError::Overflow { .. } => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
},
|
},
|
||||||
UrlencodedError::UnknownLength => match other {
|
UrlencodedError::UnknownLength => match other {
|
||||||
|
@ -420,7 +423,10 @@ mod tests {
|
||||||
.header(CONTENT_LENGTH, "1000000")
|
.header(CONTENT_LENGTH, "1000000")
|
||||||
.to_http_parts();
|
.to_http_parts();
|
||||||
let info = block_on(UrlEncoded::<Info>::new(&req, &mut pl));
|
let info = block_on(UrlEncoded::<Info>::new(&req, &mut pl));
|
||||||
assert!(eq(info.err().unwrap(), UrlencodedError::Overflow));
|
assert!(eq(
|
||||||
|
info.err().unwrap(),
|
||||||
|
UrlencodedError::Overflow { size: 0, limit: 0 }
|
||||||
|
));
|
||||||
|
|
||||||
let (req, mut pl) = TestRequest::with_header(CONTENT_TYPE, "text/plain")
|
let (req, mut pl) = TestRequest::with_header(CONTENT_TYPE, "text/plain")
|
||||||
.header(CONTENT_LENGTH, "10")
|
.header(CONTENT_LENGTH, "10")
|
||||||
|
|
Loading…
Reference in a new issue