diff --git a/examples/http_form.rs b/examples/http_form.rs
index e6abce78..fb311468 100644
--- a/examples/http_form.rs
+++ b/examples/http_form.rs
@@ -28,7 +28,7 @@
//!
//! Alternatively you can
//!
-//! ```
+//! ```sh
//! open http://127.0.0.1:8080
//! ```
//!
diff --git a/src/http/service/web/endpoint/extract/body.rs b/src/http/service/web/endpoint/extract/body.rs
index b0e388d1..48d9ee26 100644
--- a/src/http/service/web/endpoint/extract/body.rs
+++ b/src/http/service/web/endpoint/extract/body.rs
@@ -265,6 +265,52 @@ mod test {
assert_eq!(resp.status(), StatusCode::OK);
}
+ #[tokio::test]
+ async fn test_form_post_form_urlencoded_missing_data_fail() {
+ #[derive(Debug, serde::Deserialize)]
+ #[allow(dead_code)]
+ struct Input {
+ name: String,
+ age: u8,
+ }
+
+ let service = WebService::default().post("/", |Form(_): Form| async move {
+ panic!("should not reach here");
+ });
+
+ let req = http::Request::builder()
+ .uri("/")
+ .method(http::Method::POST)
+ .header("content-type", "application/x-www-form-urlencoded")
+ .body(r#"age=29"#.into())
+ .unwrap();
+ let resp = service.serve(Context::default(), req).await.unwrap();
+ assert_eq!(resp.status(), StatusCode::BAD_REQUEST);
+ }
+
+ #[tokio::test]
+ async fn test_form_get_form_urlencoded_fail() {
+ #[derive(Debug, serde::Deserialize)]
+ #[allow(dead_code)]
+ struct Input {
+ name: String,
+ age: u8,
+ }
+
+ let service = WebService::default().get("/", |Form(_): Form| async move {
+ panic!("should not reach here");
+ });
+
+ let req = http::Request::builder()
+ .uri("/")
+ .method(http::Method::GET)
+ .header("content-type", "application/x-www-form-urlencoded")
+ .body(r#"name=Devan&age=29"#.into())
+ .unwrap();
+ let resp = service.serve(Context::default(), req).await.unwrap();
+ assert_eq!(resp.status(), StatusCode::BAD_REQUEST);
+ }
+
#[tokio::test]
async fn test_form_get() {
#[derive(Debug, serde::Deserialize)]
@@ -286,4 +332,26 @@ mod test {
let resp = service.serve(Context::default(), req).await.unwrap();
assert_eq!(resp.status(), StatusCode::OK);
}
+
+ #[tokio::test]
+ async fn test_form_get_fail_missing_data() {
+ #[derive(Debug, serde::Deserialize)]
+ #[allow(dead_code)]
+ struct Input {
+ name: String,
+ age: u8,
+ }
+
+ let service = WebService::default().get("/", |Form(_): Form| async move {
+ panic!("should not reach here");
+ });
+
+ let req = http::Request::builder()
+ .uri("/?name=Devan")
+ .method(http::Method::GET)
+ .body(http::Body::empty())
+ .unwrap();
+ let resp = service.serve(Context::default(), req).await.unwrap();
+ assert_eq!(resp.status(), StatusCode::BAD_REQUEST);
+ }
}