1
0
mirror of https://github.com/actix/actix-extras.git synced 2024-11-27 17:22:57 +01:00

rename PathPayloadError and test for path config

This commit is contained in:
Nikolay Kim 2019-06-12 17:02:45 +06:00
parent 13e618b128
commit e7ba67e1a8
3 changed files with 59 additions and 41 deletions

View File

@ -4,6 +4,8 @@
### Add ### Add
* Add support for PathConfig #903
* Add `middleware::identity::RequestIdentity` trait to `get_identity` from `HttpMessage`. * Add `middleware::identity::RequestIdentity` trait to `get_identity` from `HttpMessage`.
### Changes ### Changes

View File

@ -94,19 +94,17 @@ impl ResponseError for JsonPayloadError {
/// A set of errors that can occur during parsing request paths /// A set of errors that can occur during parsing request paths
#[derive(Debug, Display, From)] #[derive(Debug, Display, From)]
pub enum PathPayloadError { pub enum PathError {
/// Deserialize error /// Deserialize error
#[display(fmt = "Path deserialize error: {}", _0)] #[display(fmt = "Path deserialize error: {}", _0)]
Deserialize(de::Error), Deserialize(de::Error),
} }
/// Return `BadRequest` for `PathPayloadError` /// Return `BadRequest` for `PathError`
impl ResponseError for PathPayloadError { impl ResponseError for PathError {
fn error_response(&self) -> HttpResponse { fn error_response(&self) -> HttpResponse {
match *self { match *self {
PathPayloadError::Deserialize(_) => { PathError::Deserialize(_) => HttpResponse::new(StatusCode::BAD_REQUEST),
HttpResponse::new(StatusCode::BAD_REQUEST)
}
} }
} }
} }

View File

@ -8,7 +8,7 @@ use actix_router::PathDeserializer;
use serde::de; use serde::de;
use crate::dev::Payload; use crate::dev::Payload;
use crate::error::PathPayloadError; use crate::error::PathError;
use crate::request::HttpRequest; use crate::request::HttpRequest;
use crate::FromRequest; use crate::FromRequest;
@ -178,7 +178,7 @@ where
req.path() req.path()
); );
if let Some(error_handler) = error_handler { if let Some(error_handler) = error_handler {
let e = PathPayloadError::Deserialize(e); let e = PathError::Deserialize(e);
(error_handler)(e, req) (error_handler)(e, req)
} else { } else {
ErrorNotFound(e) ErrorNotFound(e)
@ -190,48 +190,48 @@ where
/// Path extractor configuration /// Path extractor configuration
/// ///
/// ```rust /// ```rust
// #[macro_use] /// # #[macro_use]
// extern crate serde_derive; /// # extern crate serde_derive;
// use actix_web::web::PathConfig; /// use actix_web::web::PathConfig;
// use actix_web::{error, web, App, FromRequest, HttpResponse}; /// use actix_web::{error, web, App, FromRequest, HttpResponse};
///
// #[derive(Deserialize, Debug)] /// #[derive(Deserialize, Debug)]
// enum Folder { /// enum Folder {
// #[serde(rename = "inbox")] /// #[serde(rename = "inbox")]
// Inbox, /// Inbox,
// #[serde(rename = "outbox")] /// #[serde(rename = "outbox")]
// Outbox, /// Outbox,
// } /// }
///
/// // deserialize `Info` from request's path /// // deserialize `Info` from request's path
// fn index(folder: web::Path<Folder>) -> String { /// fn index(folder: web::Path<Folder>) -> String {
// format!("Selected folder: {}!", folder) /// format!("Selected folder: {}!", folder)
// } /// }
///
// fn main() { /// fn main() {
// let app = App::new().service( /// let app = App::new().service(
// web::resource("messages/{folder}") /// web::resource("/messages/{folder}")
// .data(PathConfig::default().error_handler(|err, req| { /// .data(PathConfig::default().error_handler(|err, req| {
// error::InternalError::from_response( /// error::InternalError::from_response(
// err, /// err,
// HttpResponse::Conflict().finish(), /// HttpResponse::Conflict().finish(),
// ) /// )
// .into() /// .into()
// })) /// }))
// .route(web::post().to(index)), /// .route(web::post().to(index)),
// ); /// );
// } /// }
/// ``` /// ```
#[derive(Clone)] #[derive(Clone)]
pub struct PathConfig { pub struct PathConfig {
ehandler: Option<Arc<Fn(PathPayloadError, &HttpRequest) -> Error + Send + Sync>>, ehandler: Option<Arc<Fn(PathError, &HttpRequest) -> Error + Send + Sync>>,
} }
impl PathConfig { impl PathConfig {
/// Set custom error handler /// Set custom error handler
pub fn error_handler<F>(mut self, f: F) -> Self pub fn error_handler<F>(mut self, f: F) -> Self
where where
F: Fn(PathPayloadError, &HttpRequest) -> Error + Send + Sync + 'static, F: Fn(PathError, &HttpRequest) -> Error + Send + Sync + 'static,
{ {
self.ehandler = Some(Arc::new(f)); self.ehandler = Some(Arc::new(f));
self self
@ -252,6 +252,7 @@ mod tests {
use super::*; use super::*;
use crate::test::{block_on, TestRequest}; use crate::test::{block_on, TestRequest};
use crate::{error, http, HttpResponse};
#[derive(Deserialize, Debug, Display)] #[derive(Deserialize, Debug, Display)]
#[display(fmt = "MyStruct({}, {})", key, value)] #[display(fmt = "MyStruct({}, {})", key, value)]
@ -347,4 +348,21 @@ mod tests {
assert_eq!(res[1], "32".to_owned()); assert_eq!(res[1], "32".to_owned());
} }
#[test]
fn test_custom_err_handler() {
let (req, mut pl) = TestRequest::with_uri("/name/user1/")
.data(PathConfig::default().error_handler(|err, _| {
error::InternalError::from_response(
err,
HttpResponse::Conflict().finish(),
)
.into()
}))
.to_http_parts();
let s = block_on(Path::<(usize,)>::from_request(&req, &mut pl)).unwrap_err();
let res: HttpResponse = s.into();
assert_eq!(res.status(), http::StatusCode::CONFLICT);
}
} }