diff --git a/src/client/request.rs b/src/client/request.rs index 4fef3e5d0..d3f6ebdb6 100644 --- a/src/client/request.rs +++ b/src/client/request.rs @@ -506,7 +506,7 @@ impl ClientRequestBuilder { } /// Do not add default request headers. - /// By default `Accept-Encoding` header is set. + /// By default `Accept-Encoding` and `User-Agent` headers are set. pub fn no_default_headers(&mut self) -> &mut Self { self.default_headers = false; self @@ -608,6 +608,15 @@ impl ClientRequestBuilder { } else { self.header(header::ACCEPT_ENCODING, "gzip, deflate"); } + + let contains = if let Some(parts) = parts(&mut self.request, &self.err) { + parts.headers.contains_key(header::USER_AGENT) + } else { + true + }; + if !contains { + self.header(header::USER_AGENT, "Actix-web"); + } } let mut request = self.request.take().expect("cannot reuse request builder"); diff --git a/tests/test_client.rs b/tests/test_client.rs index 9b9fb0e82..cd47583c6 100644 --- a/tests/test_client.rs +++ b/tests/test_client.rs @@ -432,3 +432,21 @@ fn test_client_cookie_handling() { let c2 = response.cookie("cookie2").expect("Missing cookie2"); assert_eq!(c2, &cookie2); } + +#[test] +fn test_default_headers() { + let srv = test::TestServer::new(|app| app.handler(|_| HttpResponse::Ok().body(STR))); + + let request = srv.get().finish().unwrap(); + let repr = format!("{:?}", request); + assert!(repr.contains("\"accept-encoding\": \"gzip, deflate\"")); + assert!(repr.contains("\"user-agent\": \"Actix-web\"")); + + let request_override = srv.get() + .header("User-Agent", "test") + .finish() + .unwrap(); + let repr_override = format!("{:?}", request_override); + assert!(repr_override.contains("\"user-agent\": \"test\"")); + assert!(!repr_override.contains("\"user-agent\": \"Actix-web\"")); +}