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

Side by Side Diff: net/http/http_stream_factory_impl_job.cc

Issue 245663003: Do not mark alternate-protocol broken unless the main job succeeds. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix warning Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « net/http/http_stream_factory_impl_job.h ('k') | net/http/http_stream_factory_impl_request.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/http/http_stream_factory_impl_job.h" 5 #include "net/http/http_stream_factory_impl_job.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 using_existing_quic_session_(false), 101 using_existing_quic_session_(false),
102 force_spdy_always_(HttpStreamFactory::force_spdy_always()), 102 force_spdy_always_(HttpStreamFactory::force_spdy_always()),
103 force_spdy_over_ssl_(HttpStreamFactory::force_spdy_over_ssl()), 103 force_spdy_over_ssl_(HttpStreamFactory::force_spdy_over_ssl()),
104 spdy_certificate_error_(OK), 104 spdy_certificate_error_(OK),
105 establishing_tunnel_(false), 105 establishing_tunnel_(false),
106 was_npn_negotiated_(false), 106 was_npn_negotiated_(false),
107 protocol_negotiated_(kProtoUnknown), 107 protocol_negotiated_(kProtoUnknown),
108 num_streams_(0), 108 num_streams_(0),
109 spdy_session_direct_(false), 109 spdy_session_direct_(false),
110 existing_available_pipeline_(false), 110 existing_available_pipeline_(false),
111 job_status_(STATUS_RUNNING),
112 other_job_status_(STATUS_RUNNING),
111 ptr_factory_(this) { 113 ptr_factory_(this) {
112 DCHECK(stream_factory); 114 DCHECK(stream_factory);
113 DCHECK(session); 115 DCHECK(session);
114 } 116 }
115 117
116 HttpStreamFactoryImpl::Job::~Job() { 118 HttpStreamFactoryImpl::Job::~Job() {
117 net_log_.EndEvent(NetLog::TYPE_HTTP_STREAM_JOB); 119 net_log_.EndEvent(NetLog::TYPE_HTTP_STREAM_JOB);
118 120
119 // When we're in a partially constructed state, waiting for the user to 121 // When we're in a partially constructed state, waiting for the user to
120 // provide certificate handling information or authentication, we can't reuse 122 // provide certificate handling information or authentication, we can't reuse
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 base::MessageLoop::current()->PostTask( 511 base::MessageLoop::current()->PostTask(
510 FROM_HERE, 512 FROM_HERE,
511 base::Bind(&Job::OnHttpsProxyTunnelResponseCallback, 513 base::Bind(&Job::OnHttpsProxyTunnelResponseCallback,
512 ptr_factory_.GetWeakPtr(), 514 ptr_factory_.GetWeakPtr(),
513 *proxy_socket->GetConnectResponseInfo(), 515 *proxy_socket->GetConnectResponseInfo(),
514 proxy_socket->CreateConnectResponseStream())); 516 proxy_socket->CreateConnectResponseStream()));
515 return ERR_IO_PENDING; 517 return ERR_IO_PENDING;
516 } 518 }
517 519
518 case OK: 520 case OK:
521 job_status_ = STATUS_SUCCEEDED;
522 MaybeMarkAlternateProtocolBroken();
519 next_state_ = STATE_DONE; 523 next_state_ = STATE_DONE;
520 if (new_spdy_session_.get()) { 524 if (new_spdy_session_.get()) {
521 base::MessageLoop::current()->PostTask( 525 base::MessageLoop::current()->PostTask(
522 FROM_HERE, 526 FROM_HERE,
523 base::Bind(&Job::OnNewSpdySessionReadyCallback, 527 base::Bind(&Job::OnNewSpdySessionReadyCallback,
524 ptr_factory_.GetWeakPtr())); 528 ptr_factory_.GetWeakPtr()));
525 } else if (stream_factory_->for_websockets_) { 529 } else if (stream_factory_->for_websockets_) {
526 DCHECK(websocket_stream_); 530 DCHECK(websocket_stream_);
527 base::MessageLoop::current()->PostTask( 531 base::MessageLoop::current()->PostTask(
528 FROM_HERE, 532 FROM_HERE,
529 base::Bind(&Job::OnWebSocketHandshakeStreamReadyCallback, 533 base::Bind(&Job::OnWebSocketHandshakeStreamReadyCallback,
530 ptr_factory_.GetWeakPtr())); 534 ptr_factory_.GetWeakPtr()));
531 } else { 535 } else {
532 DCHECK(stream_.get()); 536 DCHECK(stream_.get());
533 base::MessageLoop::current()->PostTask( 537 base::MessageLoop::current()->PostTask(
534 FROM_HERE, 538 FROM_HERE,
535 base::Bind(&Job::OnStreamReadyCallback, ptr_factory_.GetWeakPtr())); 539 base::Bind(&Job::OnStreamReadyCallback, ptr_factory_.GetWeakPtr()));
536 } 540 }
537 return ERR_IO_PENDING; 541 return ERR_IO_PENDING;
538 542
539 default: 543 default:
544 if (job_status_ != STATUS_BROKEN) {
545 DCHECK_EQ(STATUS_RUNNING, job_status_);
546 job_status_ = STATUS_FAILED;
547 MaybeMarkAlternateProtocolBroken();
548 }
540 base::MessageLoop::current()->PostTask( 549 base::MessageLoop::current()->PostTask(
541 FROM_HERE, 550 FROM_HERE,
542 base::Bind(&Job::OnStreamFailedCallback, ptr_factory_.GetWeakPtr(), 551 base::Bind(&Job::OnStreamFailedCallback, ptr_factory_.GetWeakPtr(),
543 result)); 552 result));
544 return ERR_IO_PENDING; 553 return ERR_IO_PENDING;
545 } 554 }
546 } 555 }
547 556
548 int HttpStreamFactoryImpl::Job::DoLoop(int result) { 557 int HttpStreamFactoryImpl::Job::DoLoop(int result) {
549 DCHECK_NE(next_state_, STATE_NONE); 558 DCHECK_NE(next_state_, STATE_NONE);
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 990
982 if (using_quic_) { 991 if (using_quic_) {
983 if (result < 0) 992 if (result < 0)
984 return result; 993 return result;
985 stream_ = quic_request_.ReleaseStream(); 994 stream_ = quic_request_.ReleaseStream();
986 next_state_ = STATE_NONE; 995 next_state_ = STATE_NONE;
987 return OK; 996 return OK;
988 } 997 }
989 998
990 if (!ssl_started && result < 0 && original_url_.get()) { 999 if (!ssl_started && result < 0 && original_url_.get()) {
991 HistogramBrokenAlternateProtocolLocation( 1000 job_status_ = STATUS_BROKEN;
992 BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_IMPL_JOB); 1001 MaybeMarkAlternateProtocolBroken();
993 // Mark the alternate protocol as broken and fallback.
994 session_->http_server_properties()->SetBrokenAlternateProtocol(
995 HostPortPair::FromURL(*original_url_));
996 return result; 1002 return result;
997 } 1003 }
998 1004
999 if (result < 0 && !ssl_started) 1005 if (result < 0 && !ssl_started)
1000 return ReconsiderProxyAfterError(result); 1006 return ReconsiderProxyAfterError(result);
1001 establishing_tunnel_ = false; 1007 establishing_tunnel_ = false;
1002 1008
1003 if (connection_->socket()) { 1009 if (connection_->socket()) {
1004 LogHttpConnectedMetrics(*connection_); 1010 LogHttpConnectedMetrics(*connection_);
1005 1011
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 } else if (original_url_) { 1468 } else if (original_url_) {
1463 // This job was the alternate protocol job, and hence won the race. 1469 // This job was the alternate protocol job, and hence won the race.
1464 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_WON_RACE); 1470 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_WON_RACE);
1465 } else { 1471 } else {
1466 // This job was the normal job, and hence the alternate protocol job lost 1472 // This job was the normal job, and hence the alternate protocol job lost
1467 // the race. 1473 // the race.
1468 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_LOST_RACE); 1474 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_LOST_RACE);
1469 } 1475 }
1470 } 1476 }
1471 1477
1478 void HttpStreamFactoryImpl::Job::MarkOtherJobComplete(const Job& job) {
1479 DCHECK_EQ(STATUS_RUNNING, other_job_status_);
1480 other_job_status_ = job.job_status_;
1481 MaybeMarkAlternateProtocolBroken();
1482 }
1483
1472 bool HttpStreamFactoryImpl::Job::IsRequestEligibleForPipelining() { 1484 bool HttpStreamFactoryImpl::Job::IsRequestEligibleForPipelining() {
1473 if (IsPreconnecting() || !request_) { 1485 if (IsPreconnecting() || !request_) {
1474 return false; 1486 return false;
1475 } 1487 }
1476 if (stream_factory_->for_websockets_) { 1488 if (stream_factory_->for_websockets_) {
1477 return false; 1489 return false;
1478 } 1490 }
1479 if (session_->force_http_pipelining()) { 1491 if (session_->force_http_pipelining()) {
1480 return true; 1492 return true;
1481 } 1493 }
1482 if (!session_->params().http_pipelining_enabled) { 1494 if (!session_->params().http_pipelining_enabled) {
1483 return false; 1495 return false;
1484 } 1496 }
1485 if (using_ssl_) { 1497 if (using_ssl_) {
1486 return false; 1498 return false;
1487 } 1499 }
1488 if (request_info_.method != "GET" && request_info_.method != "HEAD") { 1500 if (request_info_.method != "GET" && request_info_.method != "HEAD") {
1489 return false; 1501 return false;
1490 } 1502 }
1491 if (request_info_.load_flags & 1503 if (request_info_.load_flags &
1492 (net::LOAD_MAIN_FRAME | net::LOAD_SUB_FRAME | net::LOAD_PREFETCH | 1504 (net::LOAD_MAIN_FRAME | net::LOAD_SUB_FRAME | net::LOAD_PREFETCH |
1493 net::LOAD_IS_DOWNLOAD)) { 1505 net::LOAD_IS_DOWNLOAD)) {
1494 // Avoid pipelining resources that may be streamed for a long time. 1506 // Avoid pipelining resources that may be streamed for a long time.
1495 return false; 1507 return false;
1496 } 1508 }
1497 return stream_factory_->http_pipelined_host_pool_.IsKeyEligibleForPipelining( 1509 return stream_factory_->http_pipelined_host_pool_.IsKeyEligibleForPipelining(
1498 *http_pipelining_key_.get()); 1510 *http_pipelining_key_.get());
1499 } 1511 }
1500 1512
1513 void HttpStreamFactoryImpl::Job::MaybeMarkAlternateProtocolBroken() {
1514 if (job_status_ == STATUS_RUNNING || other_job_status_ == STATUS_RUNNING)
1515 return;
1516
1517 bool is_alternate_protocol_job = original_url_.get() != NULL;
1518 if (is_alternate_protocol_job) {
1519 if (job_status_ == STATUS_BROKEN && other_job_status_ == STATUS_SUCCEEDED) {
1520 HistogramBrokenAlternateProtocolLocation(
1521 BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_IMPL_JOB_ALT);
1522 session_->http_server_properties()->SetBrokenAlternateProtocol(
1523 HostPortPair::FromURL(*original_url_));
1524 }
1525 return;
1526 }
1527
1528 if (job_status_ == STATUS_SUCCEEDED && other_job_status_ == STATUS_BROKEN) {
1529 HistogramBrokenAlternateProtocolLocation(
1530 BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_IMPL_JOB_MAIN);
1531 session_->http_server_properties()->SetBrokenAlternateProtocol(
1532 HostPortPair::FromURL(request_info_.url));
1533 }
1534 }
1535
1501 } // namespace net 1536 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_stream_factory_impl_job.h ('k') | net/http/http_stream_factory_impl_request.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698