OLD | NEW |
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/spdy/spdy_session.h" | 5 #include "net/spdy/spdy_session.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
429 base::StatsCounter spdy_sessions("spdy.sessions"); | 429 base::StatsCounter spdy_sessions("spdy.sessions"); |
430 spdy_sessions.Increment(); | 430 spdy_sessions.Increment(); |
431 | 431 |
432 state_ = CONNECTED; | 432 state_ = CONNECTED; |
433 connection_.reset(connection); | 433 connection_.reset(connection); |
434 connection_->AddLayeredPool(this); | 434 connection_->AddLayeredPool(this); |
435 is_secure_ = is_secure; | 435 is_secure_ = is_secure; |
436 certificate_error_code_ = certificate_error_code; | 436 certificate_error_code_ = certificate_error_code; |
437 | 437 |
438 NextProto protocol = g_default_protocol; | 438 NextProto protocol = g_default_protocol; |
439 if (is_secure_) { | 439 NextProto protocol_negotiated = connection->socket()->GetNegotiatedProtocol(); |
440 SSLClientSocket* ssl_socket = GetSSLClientSocket(); | 440 if (protocol_negotiated != kProtoUnknown) { |
441 NextProto protocol_negotiated = ssl_socket->GetNegotiatedProtocol(); | 441 protocol = protocol_negotiated; |
442 if (protocol_negotiated != kProtoUnknown) { | 442 } |
443 protocol = protocol_negotiated; | |
444 } | |
445 | 443 |
446 if (ssl_socket->WasDomainBoundCertSent()) { | 444 SSLClientSocket* ssl_socket = GetSSLClientSocket(); |
447 // According to the SPDY spec, the credential associated with the TLS | 445 if (ssl_socket && ssl_socket->WasDomainBoundCertSent()) { |
448 // connection is stored in slot[1]. | 446 // According to the SPDY spec, the credential associated with the TLS |
449 credential_state_.SetHasCredential(GURL("https://" + | 447 // connection is stored in slot[1]. |
450 host_port_pair().ToString())); | 448 credential_state_.SetHasCredential(GURL("https://" + |
451 } | 449 host_port_pair().ToString())); |
452 } | 450 } |
453 | 451 |
454 DCHECK(protocol >= kProtoSPDY2); | 452 DCHECK(protocol >= kProtoSPDY2); |
455 DCHECK(protocol <= kProtoSPDY3); | 453 DCHECK(protocol <= kProtoSPDY3); |
456 int version = (protocol == kProtoSPDY3) ? 3 : 2; | 454 int version = (protocol == kProtoSPDY3) ? 3 : 2; |
457 flow_control_ = (protocol >= kProtoSPDY21); | 455 flow_control_ = (protocol >= kProtoSPDY21); |
458 | 456 |
459 buffered_spdy_framer_.reset(new BufferedSpdyFramer(version)); | 457 buffered_spdy_framer_.reset(new BufferedSpdyFramer(version)); |
460 buffered_spdy_framer_->set_visitor(this); | 458 buffered_spdy_framer_->set_visitor(this); |
461 SendSettings(); | 459 SendSettings(); |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
818 void SpdySession::CloseStream(SpdyStreamId stream_id, int status) { | 816 void SpdySession::CloseStream(SpdyStreamId stream_id, int status) { |
819 // TODO(mbelshe): We should send a RST_STREAM control frame here | 817 // TODO(mbelshe): We should send a RST_STREAM control frame here |
820 // so that the server can cancel a large send. | 818 // so that the server can cancel a large send. |
821 | 819 |
822 DeleteStream(stream_id, status); | 820 DeleteStream(stream_id, status); |
823 } | 821 } |
824 | 822 |
825 void SpdySession::ResetStream(SpdyStreamId stream_id, | 823 void SpdySession::ResetStream(SpdyStreamId stream_id, |
826 SpdyStatusCodes status, | 824 SpdyStatusCodes status, |
827 const std::string& description) { | 825 const std::string& description) { |
828 | |
829 net_log().AddEvent( | 826 net_log().AddEvent( |
830 NetLog::TYPE_SPDY_SESSION_SEND_RST_STREAM, | 827 NetLog::TYPE_SPDY_SESSION_SEND_RST_STREAM, |
831 make_scoped_refptr(new NetLogSpdyRstParameter(stream_id, status, | 828 make_scoped_refptr(new NetLogSpdyRstParameter(stream_id, status, |
832 description))); | 829 description))); |
833 | 830 |
834 DCHECK(buffered_spdy_framer_.get()); | 831 DCHECK(buffered_spdy_framer_.get()); |
835 scoped_ptr<SpdyRstStreamControlFrame> rst_frame( | 832 scoped_ptr<SpdyRstStreamControlFrame> rst_frame( |
836 buffered_spdy_framer_->CreateRstStream(stream_id, status)); | 833 buffered_spdy_framer_->CreateRstStream(stream_id, status)); |
837 | 834 |
838 // Default to lowest priority unless we know otherwise. | 835 // Default to lowest priority unless we know otherwise. |
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1424 associated_stream_id, stream_id); | 1421 associated_stream_id, stream_id); |
1425 ResetStream(stream_id, INVALID_STREAM, description); | 1422 ResetStream(stream_id, INVALID_STREAM, description); |
1426 return; | 1423 return; |
1427 } | 1424 } |
1428 | 1425 |
1429 streams_pushed_count_++; | 1426 streams_pushed_count_++; |
1430 | 1427 |
1431 // TODO(mbelshe): DCHECK that this is a GET method? | 1428 // TODO(mbelshe): DCHECK that this is a GET method? |
1432 | 1429 |
1433 // Verify that the response had a URL for us. | 1430 // Verify that the response had a URL for us. |
1434 const std::string& url = ContainsKey(*headers, "url") ? | 1431 GURL gurl = GetUrlFromHeaderBlock(*headers, GetProtocolVersion(), true); |
1435 headers->find("url")->second : ""; | 1432 if (!gurl.is_valid()) { |
1436 if (url.empty()) { | |
1437 ResetStream(stream_id, PROTOCOL_ERROR, | 1433 ResetStream(stream_id, PROTOCOL_ERROR, |
1438 "Pushed stream did not contain a url."); | 1434 "Pushed stream url was invalid: " + gurl.spec()); |
1439 return; | 1435 return; |
1440 } | 1436 } |
1441 | 1437 const std::string& url = gurl.spec(); |
1442 GURL gurl(url); | |
1443 if (!gurl.is_valid()) { | |
1444 ResetStream(stream_id, PROTOCOL_ERROR, | |
1445 "Pushed stream url was invalid: " + url); | |
1446 return; | |
1447 } | |
1448 | 1438 |
1449 // Verify we have a valid stream association. | 1439 // Verify we have a valid stream association. |
1450 if (!IsStreamActive(associated_stream_id)) { | 1440 if (!IsStreamActive(associated_stream_id)) { |
1451 ResetStream(stream_id, INVALID_ASSOCIATED_STREAM, | 1441 ResetStream(stream_id, INVALID_ASSOCIATED_STREAM, |
1452 base::StringPrintf( | 1442 base::StringPrintf( |
1453 "Received OnSyn with inactive associated stream %d", | 1443 "Received OnSyn with inactive associated stream %d", |
1454 associated_stream_id)); | 1444 associated_stream_id)); |
1455 return; | 1445 return; |
1456 } | 1446 } |
1457 | 1447 |
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1975 SSLClientSocket* SpdySession::GetSSLClientSocket() const { | 1965 SSLClientSocket* SpdySession::GetSSLClientSocket() const { |
1976 if (!is_secure_) | 1966 if (!is_secure_) |
1977 return NULL; | 1967 return NULL; |
1978 SSLClientSocket* ssl_socket = | 1968 SSLClientSocket* ssl_socket = |
1979 reinterpret_cast<SSLClientSocket*>(connection_->socket()); | 1969 reinterpret_cast<SSLClientSocket*>(connection_->socket()); |
1980 DCHECK(ssl_socket); | 1970 DCHECK(ssl_socket); |
1981 return ssl_socket; | 1971 return ssl_socket; |
1982 } | 1972 } |
1983 | 1973 |
1984 } // namespace net | 1974 } // namespace net |
OLD | NEW |