Skip to content

Commit 49942f4

Browse files
committed
Add a timeout on http recv
1 parent 52dc8f8 commit 49942f4

File tree

1 file changed

+40
-37
lines changed

1 file changed

+40
-37
lines changed

src/lib.rs

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -147,48 +147,51 @@ impl PProxy {
147147

148148
loop {
149149
let mut buf = [0u8; 30000];
150-
match stream.read(&mut buf).await {
151-
Err(_) => break,
152-
Ok(0) => break,
153-
Ok(n) => {
154-
response.extend_from_slice(&buf[..n]);
155-
156-
if full_length.not_parsed() {
157-
let mut headers = [httparse::EMPTY_HEADER; 1024];
158-
let mut resp_checker = httparse::Response::new(&mut headers);
159-
let res = resp_checker.parse(&response)?;
160-
if res.is_complete() {
161-
let content_length =
162-
resp_checker.headers.iter().find_map(|h| {
163-
if h.name.to_lowercase() != "content-length" {
164-
return None;
165-
}
166-
let Ok(value) = std::str::from_utf8(h.value) else {
167-
return None;
168-
};
169-
value.parse::<usize>().ok()
170-
});
171-
172-
match content_length {
173-
Some(content_length) => {
174-
let header_length = res.unwrap();
175-
full_length =
176-
FullLength::Parsed(header_length + content_length)
177-
}
178-
None => {
179-
full_length = FullLength::NotSet;
180-
}
181-
}
182-
}
183-
}
184150

185-
if let FullLength::Parsed(full_length) = full_length {
186-
if response.len() >= full_length {
187-
break;
151+
let Ok(Ok(n)) =
152+
timeout(std::time::Duration::from_secs(5), stream.read(&mut buf)).await
153+
else {
154+
break;
155+
};
156+
157+
if n == 0 {
158+
break;
159+
}
160+
161+
response.extend_from_slice(&buf[..n]);
162+
163+
if full_length.not_parsed() {
164+
let mut headers = [httparse::EMPTY_HEADER; 1024];
165+
let mut resp_checker = httparse::Response::new(&mut headers);
166+
let res = resp_checker.parse(&response)?;
167+
if res.is_complete() {
168+
let content_length = resp_checker.headers.iter().find_map(|h| {
169+
if h.name.to_lowercase() != "content-length" {
170+
return None;
171+
}
172+
let Ok(value) = std::str::from_utf8(h.value) else {
173+
return None;
174+
};
175+
value.parse::<usize>().ok()
176+
});
177+
178+
match content_length {
179+
Some(content_length) => {
180+
let header_length = res.unwrap();
181+
full_length = FullLength::Parsed(header_length + content_length)
182+
}
183+
None => {
184+
full_length = FullLength::NotSet;
188185
}
189186
}
190187
}
191188
}
189+
190+
if let FullLength::Parsed(full_length) = full_length {
191+
if response.len() >= full_length {
192+
break;
193+
}
194+
}
192195
}
193196

194197
if response.is_empty() {

0 commit comments

Comments
 (0)