Skip to content

Commit 07b7317

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 07b7317

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed

src/isahc.rs

+42-18
Original file line numberDiff line numberDiff line change
@@ -41,25 +41,49 @@ 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+
(
63+
parts,
64+
Body::from_reader(BufReader::new(body), None),
65+
maybe_metrics,
66+
)
67+
}
68+
None => {
69+
let mut builder = http::Request::builder()
70+
.uri(req.url().as_str())
71+
.method(http::Method::from_bytes(req.method().to_string().as_bytes()).unwrap());
72+
73+
for (name, value) in req.iter() {
74+
builder = builder.header(name.as_str(), value.as_str());
75+
}
76+
let request = builder.body(()).unwrap();
77+
let res = self.client.send_async(request).await.map_err(Error::from)?;
78+
let maybe_metrics = res.metrics().cloned();
79+
let (parts, body) = res.into_parts();
80+
(
81+
parts,
82+
Body::from_reader(BufReader::new(body), None),
83+
maybe_metrics,
84+
)
85+
}
86+
};
6387
let mut response = http_types::Response::new(parts.status.as_u16());
6488
for (name, value) in &parts.headers {
6589
response.append_header(name.as_str(), value.to_str().unwrap());
@@ -69,7 +93,7 @@ impl HttpClient for IsahcClient {
6993
response.ext_mut().insert(metrics);
7094
}
7195

72-
response.set_body(body);
96+
response.set_body(response_body);
7397
Ok(response)
7498
}
7599

0 commit comments

Comments
 (0)