Handle ConnectionReset+ConnectionAbort at any time (#168)
Previously we had a special case for BadStatusRead that would happen only when we got a ConnectionAborted error reading the status line. However, sometimes we get ConnectionReset instead. Also the HTTP spec says that idempotent requests may be retried anytime a connection is closed prematurely. The change treats as retryable any ConnectionAborted OR ConnectionReset error while reading the status line and headers. It removes the special case BadStatusRead error. Fixes #165 (I think).
This commit is contained in:
committed by
GitHub
parent
065b560dfb
commit
17d7e147eb
@@ -368,7 +368,9 @@ pub(crate) fn connect_https(unit: &Unit, hostname: &str) -> Result<Stream, Error
|
||||
.connect(&hostname.trim_matches(|c| c == '[' || c == ']'), sock)
|
||||
.map_err(|e| match e {
|
||||
HandshakeError::Failure(err) => Error::TlsError(err),
|
||||
_ => Error::BadStatusRead,
|
||||
// The only other possibility is WouldBlock. Since we don't
|
||||
// handle retries of WouldBlock, turn it into a generic error.
|
||||
_ => Error::ConnectionFailed("TLS handshake unexpected error".to_string()),
|
||||
})?;
|
||||
|
||||
Ok(Stream::Https(BufReader::new(stream)))
|
||||
@@ -380,7 +382,6 @@ pub(crate) fn connect_host(unit: &Unit, hostname: &str, port: u16) -> Result<Tcp
|
||||
} else {
|
||||
unit.deadline
|
||||
};
|
||||
|
||||
let netloc = match unit.req.proxy {
|
||||
Some(ref proxy) => format!("{}:{}", proxy.server, proxy.port),
|
||||
None => format!("{}:{}", hostname, port),
|
||||
|
||||
Reference in New Issue
Block a user