Index: net/http/http_network_transaction.cc |
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc |
index d9397e4cfbc30dd4f8eab5fb3cf1e5233b277590..14ed89b0d495cee0b75fe54c1ca833b1134f6e36 100644 |
--- a/net/http/http_network_transaction.cc |
+++ b/net/http/http_network_transaction.cc |
@@ -987,6 +987,19 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) { |
DCHECK(response_.headers.get()); |
+ // On a 408 response from the server ("Request Timeout") on a stale socket, |
+ // retry the request. |
+ if (response_.headers->response_code() == 408 && |
+ stream_->IsConnectionReused()) { |
+ net_log_.AddEventWithNetErrorCode( |
+ NetLog::TYPE_HTTP_TRANSACTION_RESTART_AFTER_ERROR, |
+ response_.headers->response_code()); |
+ // This will close the socket - it would be weird to try and reuse it, even |
+ // if the server doesn't actually close it. |
+ ResetConnectionAndRequestForResend(); |
+ return OK; |
+ } |
+ |
#if defined(SPDY_PROXY_AUTH_ORIGIN) |
// Server-induced fallback; see: http://crbug.com/143712 |
if (response_.was_fetched_via_proxy) { |