Skip to content

Commit 44cba08

Browse files
committed
fix: curl - avoid zero-sized HEAD bodies
If there is no body then don't construct a zero-lengthed body. Fixes: http-rs/surf#321 Fixes: http-rs/surf#218
1 parent 3c0ed9a commit 44cba08

File tree

1 file changed

+34
-18
lines changed

1 file changed

+34
-18
lines changed

Diff for: src/isahc.rs

+34-18
Original file line numberDiff line numberDiff line change
@@ -41,25 +41,41 @@ impl IsahcClient {
4141
#[async_trait]
4242
impl HttpClient for IsahcClient {
4343
async fn send(&self, mut req: Request) -> Result<Response, Error> {
44-
let mut builder = http::Request::builder()
45-
.uri(req.url().as_str())
46-
.method(http::Method::from_bytes(req.method().to_string().as_bytes()).unwrap());
47-
48-
for (name, value) in req.iter() {
49-
builder = builder.header(name.as_str(), value.as_str());
50-
}
51-
5244
let body = req.take_body();
53-
let body = match body.len() {
54-
Some(len) => isahc::Body::from_reader_sized(body, len as u64),
55-
None => isahc::Body::from_reader(body),
56-
};
5745

58-
let request = builder.body(body).unwrap();
59-
let res = self.client.send_async(request).await.map_err(Error::from)?;
60-
let maybe_metrics = res.metrics().cloned();
61-
let (parts, body) = res.into_parts();
62-
let body = Body::from_reader(BufReader::new(body), None);
46+
// Code duplication to get around https://github.com/http-rs/surf/issues/321
47+
// This is because `http::request` is generic (sized) over an existent and non-existent body differently, which is less than ideal.
48+
let (parts, response_body, maybe_metrics) = match body.len() {
49+
Some(len) => {
50+
let mut builder = http::Request::builder()
51+
.uri(req.url().as_str())
52+
.method(http::Method::from_bytes(req.method().to_string().as_bytes()).unwrap());
53+
54+
for (name, value) in req.iter() {
55+
builder = builder.header(name.as_str(), value.as_str());
56+
}
57+
let body = isahc::Body::from_reader_sized(body, len as u64);
58+
let request = builder.body(body).unwrap();
59+
let res = self.client.send_async(request).await.map_err(Error::from)?;
60+
let maybe_metrics = res.metrics().cloned();
61+
let (parts, body) = res.into_parts();
62+
(parts, Body::from_reader(BufReader::new(body), None), maybe_metrics)
63+
}
64+
None => {
65+
let mut builder = http::Request::builder()
66+
.uri(req.url().as_str())
67+
.method(http::Method::from_bytes(req.method().to_string().as_bytes()).unwrap());
68+
69+
for (name, value) in req.iter() {
70+
builder = builder.header(name.as_str(), value.as_str());
71+
}
72+
let request = builder.body(()).unwrap();
73+
let res = self.client.send_async(request).await.map_err(Error::from)?;
74+
let maybe_metrics = res.metrics().cloned();
75+
let (parts, body) = res.into_parts();
76+
(parts, Body::from_reader(BufReader::new(body), None), maybe_metrics)
77+
}
78+
};
6379
let mut response = http_types::Response::new(parts.status.as_u16());
6480
for (name, value) in &parts.headers {
6581
response.append_header(name.as_str(), value.to_str().unwrap());
@@ -69,7 +85,7 @@ impl HttpClient for IsahcClient {
6985
response.ext_mut().insert(metrics);
7086
}
7187

72-
response.set_body(body);
88+
response.set_body(response_body);
7389
Ok(response)
7490
}
7591

0 commit comments

Comments
 (0)