From 1876b15d2ef9a61e13cfbd5b582490d84042ba45 Mon Sep 17 00:00:00 2001 From: Yann Simon Date: Mon, 11 Sep 2023 17:19:49 +0200 Subject: [PATCH 1/2] handle body encoded as form --- Cargo.toml | 1 + src/request.rs | 4 ++++ tests/request.rs | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 tests/request.rs diff --git a/Cargo.toml b/Cargo.toml index 647a3f0..0334caf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ async-trait = "0.1" once_cell = "1" assert-json-diff = "2.0.1" base64 = "0.21.0" +serde_urlencoded = "0.7.1" [dev-dependencies] async-std = { version = "1.9.0", features = ["attributes"] } diff --git a/src/request.rs b/src/request.rs index cb2e163..09d22eb 100644 --- a/src/request.rs +++ b/src/request.rs @@ -53,6 +53,10 @@ impl Request { serde_json::from_slice(&self.body) } + pub fn body_form(&self) -> Result { + serde_urlencoded::from_bytes(&self.body) + } + pub async fn from(mut request: http_types::Request) -> Request { let method = request.method(); let url = request.url().to_owned(); diff --git a/tests/request.rs b/tests/request.rs new file mode 100644 index 0000000..fff08ee --- /dev/null +++ b/tests/request.rs @@ -0,0 +1,39 @@ +use std::{ + collections::HashMap, + sync::{Arc, RwLock}, +}; + +use http_types::mime; +use wiremock::{matchers::any, Mock, MockServer, Request, ResponseTemplate}; + +#[async_std::test] +async fn reuqest_form_data_body() { + // Arrange + let form_data: Arc>> = Arc::new(RwLock::new(HashMap::new())); + let mock_server = MockServer::start().await; + let form_data_clone = form_data.clone(); + Mock::given(any()) + .respond_with(move |request: &Request| { + let form_data = request.body_form::>().unwrap(); + *form_data_clone.write().unwrap() = form_data; + ResponseTemplate::new(200) + }) + .mount(&mock_server) + .await; + + // Act + let _ = surf::post(&mock_server.uri()) + .content_type(mime::FORM) + .body_string(r#"foo=bar&foo2="h%25l""#.to_string()) + .await + .unwrap() + .status(); + + // Assert + let result = form_data.read().unwrap().clone(); + let expected = HashMap::from([ + ("foo".to_string(), "bar".to_string()), + ("foo2".to_string(), "\"h%l\"".to_string()), + ]); + assert_eq!(result, expected); +} From 7bef3569f388d9b713dae3d9ca0a7840221257e4 Mon Sep 17 00:00:00 2001 From: Yann Simon Date: Fri, 9 Feb 2024 10:23:50 +0100 Subject: [PATCH 2/2] fix test name Co-authored-by: Taj Pereira --- tests/request.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/request.rs b/tests/request.rs index fff08ee..ffbcbc7 100644 --- a/tests/request.rs +++ b/tests/request.rs @@ -7,7 +7,7 @@ use http_types::mime; use wiremock::{matchers::any, Mock, MockServer, Request, ResponseTemplate}; #[async_std::test] -async fn reuqest_form_data_body() { +async fn request_form_data_body() { // Arrange let form_data: Arc>> = Arc::new(RwLock::new(HashMap::new())); let mock_server = MockServer::start().await;