Co-authored-by: Wim Looman <git@nemo157.com> Co-authored-by: Paolo Barbolini <paolo@paolo565.org>
		
			
				
	
	
		
			331 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			331 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| mod support;
 | |
| use support::*;
 | |
| 
 | |
| #[test]
 | |
| fn test_response_text() {
 | |
|     let server = server::http(move |_req| async { http::Response::new("Hello".into()) });
 | |
| 
 | |
|     let url = format!("http://{}/text", server.addr());
 | |
|     let res = reqwest::blocking::get(&url).unwrap();
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
|     assert_eq!(res.content_length(), Some(5));
 | |
| 
 | |
|     let body = res.text().unwrap();
 | |
|     assert_eq!(b"Hello", body.as_bytes());
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_response_non_utf_8_text() {
 | |
|     let server = server::http(move |_req| async {
 | |
|         http::Response::builder()
 | |
|             .header("content-type", "text/plain; charset=gbk")
 | |
|             .body(b"\xc4\xe3\xba\xc3"[..].into())
 | |
|             .unwrap()
 | |
|     });
 | |
| 
 | |
|     let url = format!("http://{}/text", server.addr());
 | |
|     let res = reqwest::blocking::get(&url).unwrap();
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
|     assert_eq!(res.content_length(), Some(4));
 | |
| 
 | |
|     let body = res.text().unwrap();
 | |
|     assert_eq!("你好", &body);
 | |
|     assert_eq!(b"\xe4\xbd\xa0\xe5\xa5\xbd", body.as_bytes()); // Now it's utf-8
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| #[cfg(feature = "json")]
 | |
| fn test_response_json() {
 | |
|     let server = server::http(move |_req| async { http::Response::new("\"Hello\"".into()) });
 | |
| 
 | |
|     let url = format!("http://{}/json", server.addr());
 | |
|     let res = reqwest::blocking::get(&url).unwrap();
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
|     assert_eq!(res.content_length(), Some(7));
 | |
| 
 | |
|     let body = res.json::<String>().unwrap();
 | |
|     assert_eq!("Hello", body);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_response_copy_to() {
 | |
|     let server = server::http(move |_req| async { http::Response::new("Hello".into()) });
 | |
| 
 | |
|     let url = format!("http://{}/1", server.addr());
 | |
|     let mut res = reqwest::blocking::get(&url).unwrap();
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
| 
 | |
|     let mut dst = Vec::new();
 | |
|     res.copy_to(&mut dst).unwrap();
 | |
|     assert_eq!(dst, b"Hello");
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_get() {
 | |
|     let server = server::http(move |_req| async { http::Response::default() });
 | |
| 
 | |
|     let url = format!("http://{}/1", server.addr());
 | |
|     let res = reqwest::blocking::get(&url).unwrap();
 | |
| 
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
|     assert_eq!(res.remote_addr(), Some(server.addr()));
 | |
| 
 | |
|     assert_eq!(res.text().unwrap().len(), 0)
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_post() {
 | |
|     let server = server::http(move |req| async move {
 | |
|         assert_eq!(req.method(), "POST");
 | |
|         assert_eq!(req.headers()["content-length"], "5");
 | |
| 
 | |
|         let data = hyper::body::to_bytes(req.into_body()).await.unwrap();
 | |
|         assert_eq!(&*data, b"Hello");
 | |
| 
 | |
|         http::Response::default()
 | |
|     });
 | |
| 
 | |
|     let url = format!("http://{}/2", server.addr());
 | |
|     let res = reqwest::blocking::Client::new()
 | |
|         .post(&url)
 | |
|         .body("Hello")
 | |
|         .send()
 | |
|         .unwrap();
 | |
| 
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_post_form() {
 | |
|     let server = server::http(move |req| async move {
 | |
|         assert_eq!(req.method(), "POST");
 | |
|         assert_eq!(req.headers()["content-length"], "24");
 | |
|         assert_eq!(
 | |
|             req.headers()["content-type"],
 | |
|             "application/x-www-form-urlencoded"
 | |
|         );
 | |
| 
 | |
|         let data = hyper::body::to_bytes(req.into_body()).await.unwrap();
 | |
|         assert_eq!(&*data, b"hello=world&sean=monstar");
 | |
| 
 | |
|         http::Response::default()
 | |
|     });
 | |
| 
 | |
|     let form = &[("hello", "world"), ("sean", "monstar")];
 | |
| 
 | |
|     let url = format!("http://{}/form", server.addr());
 | |
|     let res = reqwest::blocking::Client::new()
 | |
|         .post(&url)
 | |
|         .form(form)
 | |
|         .send()
 | |
|         .expect("request send");
 | |
| 
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
| }
 | |
| 
 | |
| /// Calling `Response::error_for_status`` on a response with status in 4xx
 | |
| /// returns a error.
 | |
| #[test]
 | |
| fn test_error_for_status_4xx() {
 | |
|     let server = server::http(move |_req| async {
 | |
|         http::Response::builder()
 | |
|             .status(400)
 | |
|             .body(Default::default())
 | |
|             .unwrap()
 | |
|     });
 | |
| 
 | |
|     let url = format!("http://{}/1", server.addr());
 | |
|     let res = reqwest::blocking::get(&url).unwrap();
 | |
| 
 | |
|     let err = res.error_for_status().unwrap_err();
 | |
|     assert!(err.is_status());
 | |
|     assert_eq!(err.status(), Some(reqwest::StatusCode::BAD_REQUEST));
 | |
| }
 | |
| 
 | |
| /// Calling `Response::error_for_status`` on a response with status in 5xx
 | |
| /// returns a error.
 | |
| #[test]
 | |
| fn test_error_for_status_5xx() {
 | |
|     let server = server::http(move |_req| async {
 | |
|         http::Response::builder()
 | |
|             .status(500)
 | |
|             .body(Default::default())
 | |
|             .unwrap()
 | |
|     });
 | |
| 
 | |
|     let url = format!("http://{}/1", server.addr());
 | |
|     let res = reqwest::blocking::get(&url).unwrap();
 | |
| 
 | |
|     let err = res.error_for_status().unwrap_err();
 | |
|     assert!(err.is_status());
 | |
|     assert_eq!(
 | |
|         err.status(),
 | |
|         Some(reqwest::StatusCode::INTERNAL_SERVER_ERROR)
 | |
|     );
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_default_headers() {
 | |
|     let server = server::http(move |req| async move {
 | |
|         assert_eq!(req.headers()["reqwest-test"], "orly");
 | |
|         http::Response::default()
 | |
|     });
 | |
| 
 | |
|     let mut headers = http::HeaderMap::with_capacity(1);
 | |
|     headers.insert("reqwest-test", "orly".parse().unwrap());
 | |
|     let client = reqwest::blocking::Client::builder()
 | |
|         .default_headers(headers)
 | |
|         .build()
 | |
|         .unwrap();
 | |
| 
 | |
|     let url = format!("http://{}/1", server.addr());
 | |
|     let res = client.get(&url).send().unwrap();
 | |
| 
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_override_default_headers() {
 | |
|     let server = server::http(move |req| {
 | |
|         async move {
 | |
|             // not 'iamatoken'
 | |
|             assert_eq!(req.headers()[&http::header::AUTHORIZATION], "secret");
 | |
|             http::Response::default()
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     let mut headers = http::HeaderMap::with_capacity(1);
 | |
|     headers.insert(
 | |
|         http::header::AUTHORIZATION,
 | |
|         http::header::HeaderValue::from_static("iamatoken"),
 | |
|     );
 | |
|     let client = reqwest::blocking::Client::builder()
 | |
|         .default_headers(headers)
 | |
|         .build()
 | |
|         .unwrap();
 | |
| 
 | |
|     let url = format!("http://{}/3", server.addr());
 | |
|     let res = client
 | |
|         .get(&url)
 | |
|         .header(
 | |
|             http::header::AUTHORIZATION,
 | |
|             http::header::HeaderValue::from_static("secret"),
 | |
|         )
 | |
|         .send()
 | |
|         .unwrap();
 | |
| 
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_appended_headers_not_overwritten() {
 | |
|     let server = server::http(move |req| async move {
 | |
|         let mut accepts = req.headers().get_all("accept").into_iter();
 | |
|         assert_eq!(accepts.next().unwrap(), "application/json");
 | |
|         assert_eq!(accepts.next().unwrap(), "application/json+hal");
 | |
|         assert_eq!(accepts.next(), None);
 | |
| 
 | |
|         http::Response::default()
 | |
|     });
 | |
| 
 | |
|     let client = reqwest::blocking::Client::new();
 | |
| 
 | |
|     let url = format!("http://{}/4", server.addr());
 | |
|     let res = client
 | |
|         .get(&url)
 | |
|         .header(header::ACCEPT, "application/json")
 | |
|         .header(header::ACCEPT, "application/json+hal")
 | |
|         .send()
 | |
|         .unwrap();
 | |
| 
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
| 
 | |
|     // make sure this also works with default headers
 | |
|     use reqwest::header;
 | |
|     let mut headers = header::HeaderMap::with_capacity(1);
 | |
|     headers.insert(
 | |
|         header::ACCEPT,
 | |
|         header::HeaderValue::from_static("text/html"),
 | |
|     );
 | |
|     let client = reqwest::blocking::Client::builder()
 | |
|         .default_headers(headers)
 | |
|         .build()
 | |
|         .unwrap();
 | |
| 
 | |
|     let url = format!("http://{}/4", server.addr());
 | |
|     let res = client
 | |
|         .get(&url)
 | |
|         .header(header::ACCEPT, "application/json")
 | |
|         .header(header::ACCEPT, "application/json+hal")
 | |
|         .send()
 | |
|         .unwrap();
 | |
| 
 | |
|     assert_eq!(res.url().as_str(), &url);
 | |
|     assert_eq!(res.status(), reqwest::StatusCode::OK);
 | |
| }
 | |
| 
 | |
| #[cfg_attr(not(debug_assertions), ignore)]
 | |
| #[test]
 | |
| #[should_panic]
 | |
| fn test_blocking_inside_a_runtime() {
 | |
|     let server = server::http(move |_req| async { http::Response::new("Hello".into()) });
 | |
| 
 | |
|     let url = format!("http://{}/text", server.addr());
 | |
| 
 | |
|     let rt = tokio::runtime::Builder::new_current_thread()
 | |
|         .build()
 | |
|         .expect("new rt");
 | |
| 
 | |
|     rt.block_on(async move {
 | |
|         let _should_panic = reqwest::blocking::get(&url);
 | |
|     });
 | |
| }
 | |
| 
 | |
| #[cfg(feature = "default-tls")]
 | |
| #[test]
 | |
| fn test_allowed_methods_blocking() {
 | |
|     let resp = reqwest::blocking::Client::builder()
 | |
|         .https_only(true)
 | |
|         .build()
 | |
|         .expect("client builder")
 | |
|         .get("https://google.com")
 | |
|         .send();
 | |
| 
 | |
|     assert_eq!(resp.is_err(), false);
 | |
| 
 | |
|     let resp = reqwest::blocking::Client::builder()
 | |
|         .https_only(true)
 | |
|         .build()
 | |
|         .expect("client builder")
 | |
|         .get("http://google.com")
 | |
|         .send();
 | |
| 
 | |
|     assert_eq!(resp.is_err(), true);
 | |
| }
 | |
| 
 | |
| /// Test that a [`reqwest::blocking::Body`] can be created from [`bytes::Bytes`].
 | |
| #[test]
 | |
| fn test_body_from_bytes() {
 | |
|     let body = "abc";
 | |
|     // No external calls are needed. Only the request building is tested.
 | |
|     let request = reqwest::blocking::Client::builder()
 | |
|         .build()
 | |
|         .expect("Could not build the client")
 | |
|         .put("https://google.com")
 | |
|         .body(bytes::Bytes::from(body))
 | |
|         .build()
 | |
|         .expect("Invalid body");
 | |
| 
 | |
|     assert_eq!(request.body().unwrap().as_bytes(), Some(body.as_bytes()));
 | |
| }
 |