Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"] }
Expand Down
4 changes: 4 additions & 0 deletions src/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ impl Request {
serde_json::from_slice(&self.body)
}

pub fn body_form<T: DeserializeOwned>(&self) -> Result<T, serde_urlencoded::de::Error> {
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();
Expand Down
39 changes: 39 additions & 0 deletions tests/request.rs
Original file line number Diff line number Diff line change
@@ -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<RwLock<HashMap<String, String>>> = 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::<HashMap<String, String>>().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);
}