Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Side by Side Diff: net/quic/chromium/quic_http_stream.cc

Issue 2789093003: Mark QUIC broken when the network blackholes after the handshake (Closed)
Patch Set: Rename mark_quic_broken_when_network_suspected to mark_quic_broken_when_network_blackholes Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/chromium/quic_http_stream.h" 5 #include "net/quic/chromium/quic_http_stream.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 } 43 }
44 44
45 } // namespace 45 } // namespace
46 46
47 QuicHttpStream::QuicHttpStream( 47 QuicHttpStream::QuicHttpStream(
48 const base::WeakPtr<QuicChromiumClientSession>& session, 48 const base::WeakPtr<QuicChromiumClientSession>& session,
49 HttpServerProperties* http_server_properties) 49 HttpServerProperties* http_server_properties)
50 : MultiplexedHttpStream(MultiplexedSessionHandle(session)), 50 : MultiplexedHttpStream(MultiplexedSessionHandle(session)),
51 next_state_(STATE_NONE), 51 next_state_(STATE_NONE),
52 session_(session), 52 session_(session),
53 server_id_(session->server_id()),
53 http_server_properties_(http_server_properties), 54 http_server_properties_(http_server_properties),
54 quic_version_(session->GetQuicVersion()), 55 quic_version_(session->GetQuicVersion()),
55 session_error_(ERR_UNEXPECTED), 56 session_error_(ERR_UNEXPECTED),
56 was_handshake_confirmed_(session->IsCryptoHandshakeConfirmed()), 57 was_handshake_confirmed_(session->IsCryptoHandshakeConfirmed()),
57 stream_(nullptr), 58 stream_(nullptr),
58 request_info_(nullptr), 59 request_info_(nullptr),
59 request_body_stream_(nullptr), 60 request_body_stream_(nullptr),
60 priority_(MINIMUM_PRIORITY), 61 priority_(MINIMUM_PRIORITY),
61 response_info_(nullptr), 62 response_info_(nullptr),
62 has_response_status_(false), 63 has_response_status_(false),
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 316
316 return rv > 0 ? OK : rv; 317 return rv > 0 ? OK : rv;
317 } 318 }
318 319
319 int QuicHttpStream::ReadResponseHeaders(const CompletionCallback& callback) { 320 int QuicHttpStream::ReadResponseHeaders(const CompletionCallback& callback) {
320 CHECK(callback_.is_null()); 321 CHECK(callback_.is_null());
321 CHECK(!callback.is_null()); 322 CHECK(!callback.is_null());
322 323
323 if (stream_ == nullptr) 324 if (stream_ == nullptr)
324 return GetResponseStatus(); 325 return GetResponseStatus();
325
326 // Check if we already have the response headers. If so, return synchronously. 326 // Check if we already have the response headers. If so, return synchronously.
327 if (response_headers_received_) 327 if (response_headers_received_)
328 return OK; 328 return OK;
329 329
330 // Still waiting for the response, return IO_PENDING. 330 // Still waiting for the response, return IO_PENDING.
331 CHECK(callback_.is_null()); 331 CHECK(callback_.is_null());
332 callback_ = callback; 332 callback_ = callback;
333 return ERR_IO_PENDING; 333 return ERR_IO_PENDING;
334 } 334 }
335 335
(...skipping 21 matching lines...) Expand all
357 if (rv != ERR_IO_PENDING) 357 if (rv != ERR_IO_PENDING)
358 return rv; 358 return rv;
359 359
360 callback_ = callback; 360 callback_ = callback;
361 user_buffer_ = buf; 361 user_buffer_ = buf;
362 user_buffer_len_ = buf_len; 362 user_buffer_len_ = buf_len;
363 return ERR_IO_PENDING; 363 return ERR_IO_PENDING;
364 } 364 }
365 365
366 void QuicHttpStream::Close(bool /*not_reusable*/) { 366 void QuicHttpStream::Close(bool /*not_reusable*/) {
367 session_error_ = ERR_ABORTED;
367 SaveResponseStatus(); 368 SaveResponseStatus();
368 // Note: the not_reusable flag has no meaning for QUIC streams. 369 // Note: the not_reusable flag has no meaning for QUIC streams.
369 if (stream_) { 370 if (stream_) {
370 stream_->SetDelegate(nullptr); 371 stream_->SetDelegate(nullptr);
371 stream_->Reset(QUIC_STREAM_CANCELLED); 372 stream_->Reset(QUIC_STREAM_CANCELLED);
372 } 373 }
373 ResetStream(); 374 ResetStream();
374 } 375 }
375 376
376 bool QuicHttpStream::IsResponseBodyComplete() const { 377 bool QuicHttpStream::IsResponseBodyComplete() const {
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
849 void QuicHttpStream::SaveResponseStatus() { 850 void QuicHttpStream::SaveResponseStatus() {
850 if (!has_response_status_) 851 if (!has_response_status_)
851 SetResponseStatus(ComputeResponseStatus()); 852 SetResponseStatus(ComputeResponseStatus());
852 } 853 }
853 854
854 void QuicHttpStream::SetResponseStatus(int response_status) { 855 void QuicHttpStream::SetResponseStatus(int response_status) {
855 has_response_status_ = true; 856 has_response_status_ = true;
856 response_status_ = response_status; 857 response_status_ = response_status;
857 } 858 }
858 859
860 // Returns true if |error| is possibly caused by the network
861 bool IsPossiblyNetworkError(QuicErrorCode error) {
Jana 2017/04/07 21:59:29 You don't need this function anymore, do you?
Ryan Hamilton 2017/04/07 22:37:20 Right! Good point. I should move this comment to t
862 // QUIC connections should not timeout while there are open streams,
863 // since PING frames are sent to prevent timeouts. If, however, the
864 // connection timed out while this stream was open then QUIC traffic
865 // has become blackholed.
866 return error == QUIC_NETWORK_IDLE_TIMEOUT || error == QUIC_TOO_MANY_RTOS;
867 }
868
859 int QuicHttpStream::ComputeResponseStatus() const { 869 int QuicHttpStream::ComputeResponseStatus() const {
860 DCHECK(!has_response_status_); 870 DCHECK(!has_response_status_);
861 871
862 // If the handshake has failed this will be handled by the 872 // If the handshake has failed this will be handled by the QuicStreamFactory
863 // QuicStreamFactory and HttpStreamFactory to mark QUIC as broken. 873 // and HttpStreamFactory to mark QUIC as broken if TCP is actually working.
864 if (!was_handshake_confirmed_) 874 if (!was_handshake_confirmed_)
865 return ERR_QUIC_HANDSHAKE_FAILED; 875 return ERR_QUIC_HANDSHAKE_FAILED;
866 876
867 // If the session was aborted by a higher layer, simply use that error code. 877 // If the session was aborted by a higher layer, simply use that error code.
868 if (session_error_ != ERR_UNEXPECTED) 878 if (session_error_ != ERR_UNEXPECTED)
869 return session_error_; 879 return session_error_;
870 880
871 // If |response_info_| is null then the request has not been sent, so 881 // If |response_info_| is null then the request has not been sent, so
872 // return ERR_CONNECTION_CLOSED to permit HttpNetworkTransaction to 882 // return ERR_CONNECTION_CLOSED to permit HttpNetworkTransaction to
873 // retry the request. 883 // retry the request.
874 if (!response_info_) 884 if (!response_info_)
875 return ERR_CONNECTION_CLOSED; 885 return ERR_CONNECTION_CLOSED;
876 886
887 // Explicit stream error are always fatal.
888 if (quic_stream_error_ != QUIC_STREAM_NO_ERROR &&
889 quic_stream_error_ != QUIC_STREAM_CONNECTION_ERROR) {
890 return ERR_QUIC_PROTOCOL_ERROR;
891 }
892
893 DCHECK_NE(QUIC_HANDSHAKE_TIMEOUT, quic_connection_error_);
894
895 // If the headers have not been received and QUIC is now broken, return
896 // ERR_QUIC_BROKEN_ERROR to permit HttpNetworkTransaction to retry the request
897 // over TCP.
898 if (!response_headers_received_ &&
899 http_server_properties_->IsAlternativeServiceBroken(AlternativeService(
900 kProtoQUIC, server_id_.host(), server_id_.port()))) {
901 return ERR_QUIC_BROKEN_ERROR;
902 }
903
877 return ERR_QUIC_PROTOCOL_ERROR; 904 return ERR_QUIC_PROTOCOL_ERROR;
878 } 905 }
879 906
880 } // namespace net 907 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698