| 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 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 int certificate_error_code) { | 417 int certificate_error_code) { |
| 418 base::StatsCounter spdy_sessions("spdy.sessions"); | 418 base::StatsCounter spdy_sessions("spdy.sessions"); |
| 419 spdy_sessions.Increment(); | 419 spdy_sessions.Increment(); |
| 420 | 420 |
| 421 state_ = CONNECTED; | 421 state_ = CONNECTED; |
| 422 connection_.reset(connection); | 422 connection_.reset(connection); |
| 423 is_secure_ = is_secure; | 423 is_secure_ = is_secure; |
| 424 certificate_error_code_ = certificate_error_code; | 424 certificate_error_code_ = certificate_error_code; |
| 425 | 425 |
| 426 NextProto protocol = g_default_protocol; | 426 NextProto protocol = g_default_protocol; |
| 427 if (is_secure_) { | 427 NextProto protocol_negotiated = connection->socket()->GetNegotiatedProtocol(); |
| 428 SSLClientSocket* ssl_socket = GetSSLClientSocket(); | 428 if (protocol_negotiated != kProtoUnknown) { |
| 429 NextProto protocol_negotiated = ssl_socket->protocol_negotiated(); | 429 protocol = protocol_negotiated; |
| 430 if (protocol_negotiated != kProtoUnknown) { | 430 } |
| 431 protocol = protocol_negotiated; | |
| 432 } | |
| 433 | 431 |
| 434 if (ssl_socket->WasDomainBoundCertSent()) { | 432 SSLClientSocket* ssl_socket = GetSSLClientSocket(); |
| 435 // According to the SPDY spec, the credential associated with the TLS | 433 if (ssl_socket && ssl_socket->WasDomainBoundCertSent()) { |
| 436 // connection is stored in slot[1]. | 434 // According to the SPDY spec, the credential associated with the TLS |
| 437 credential_state_.SetHasCredential(GURL("https://" + | 435 // connection is stored in slot[1]. |
| 438 host_port_pair().ToString())); | 436 credential_state_.SetHasCredential(GURL("https://" + |
| 439 } | 437 host_port_pair().ToString())); |
| 440 } | 438 } |
| 441 | 439 |
| 442 DCHECK(protocol >= kProtoSPDY2); | 440 DCHECK(protocol >= kProtoSPDY2); |
| 443 DCHECK(protocol <= kProtoSPDY3); | 441 DCHECK(protocol <= kProtoSPDY3); |
| 444 int version = (protocol == kProtoSPDY3) ? 3 : 2; | 442 int version = (protocol == kProtoSPDY3) ? 3 : 2; |
| 445 flow_control_ = (protocol >= kProtoSPDY21); | 443 flow_control_ = (protocol >= kProtoSPDY21); |
| 446 | 444 |
| 447 buffered_spdy_framer_.reset(new BufferedSpdyFramer(version)); | 445 buffered_spdy_framer_.reset(new BufferedSpdyFramer(version)); |
| 448 buffered_spdy_framer_->set_visitor(this); | 446 buffered_spdy_framer_->set_visitor(this); |
| 449 SendSettings(); | 447 SendSettings(); |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 void SpdySession::CloseStream(SpdyStreamId stream_id, int status) { | 805 void SpdySession::CloseStream(SpdyStreamId stream_id, int status) { |
| 808 // TODO(mbelshe): We should send a RST_STREAM control frame here | 806 // TODO(mbelshe): We should send a RST_STREAM control frame here |
| 809 // so that the server can cancel a large send. | 807 // so that the server can cancel a large send. |
| 810 | 808 |
| 811 DeleteStream(stream_id, status); | 809 DeleteStream(stream_id, status); |
| 812 } | 810 } |
| 813 | 811 |
| 814 void SpdySession::ResetStream(SpdyStreamId stream_id, | 812 void SpdySession::ResetStream(SpdyStreamId stream_id, |
| 815 SpdyStatusCodes status, | 813 SpdyStatusCodes status, |
| 816 const std::string& description) { | 814 const std::string& description) { |
| 817 | |
| 818 net_log().AddEvent( | 815 net_log().AddEvent( |
| 819 NetLog::TYPE_SPDY_SESSION_SEND_RST_STREAM, | 816 NetLog::TYPE_SPDY_SESSION_SEND_RST_STREAM, |
| 820 make_scoped_refptr(new NetLogSpdyRstParameter(stream_id, status, | 817 make_scoped_refptr(new NetLogSpdyRstParameter(stream_id, status, |
| 821 description))); | 818 description))); |
| 822 | 819 |
| 823 DCHECK(buffered_spdy_framer_.get()); | 820 DCHECK(buffered_spdy_framer_.get()); |
| 824 scoped_ptr<SpdyRstStreamControlFrame> rst_frame( | 821 scoped_ptr<SpdyRstStreamControlFrame> rst_frame( |
| 825 buffered_spdy_framer_->CreateRstStream(stream_id, status)); | 822 buffered_spdy_framer_->CreateRstStream(stream_id, status)); |
| 826 | 823 |
| 827 // Default to lowest priority unless we know otherwise. | 824 // Default to lowest priority unless we know otherwise. |
| (...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1401 associated_stream_id, stream_id); | 1398 associated_stream_id, stream_id); |
| 1402 ResetStream(stream_id, INVALID_STREAM, description); | 1399 ResetStream(stream_id, INVALID_STREAM, description); |
| 1403 return; | 1400 return; |
| 1404 } | 1401 } |
| 1405 | 1402 |
| 1406 streams_pushed_count_++; | 1403 streams_pushed_count_++; |
| 1407 | 1404 |
| 1408 // TODO(mbelshe): DCHECK that this is a GET method? | 1405 // TODO(mbelshe): DCHECK that this is a GET method? |
| 1409 | 1406 |
| 1410 // Verify that the response had a URL for us. | 1407 // Verify that the response had a URL for us. |
| 1411 const std::string& url = ContainsKey(*headers, "url") ? | 1408 GURL gurl = GetUrlFromHeaderBlock(*headers, GetProtocolVersion(), true); |
| 1412 headers->find("url")->second : ""; | 1409 if (!gurl.is_valid()) { |
| 1413 if (url.empty()) { | |
| 1414 ResetStream(stream_id, PROTOCOL_ERROR, | 1410 ResetStream(stream_id, PROTOCOL_ERROR, |
| 1415 "Pushed stream did not contain a url."); | 1411 "Pushed stream url was invalid: " + gurl.spec()); |
| 1416 return; | 1412 return; |
| 1417 } | 1413 } |
| 1418 | 1414 const std::string& url = gurl.spec(); |
| 1419 GURL gurl(url); | |
| 1420 if (!gurl.is_valid()) { | |
| 1421 ResetStream(stream_id, PROTOCOL_ERROR, | |
| 1422 "Pushed stream url was invalid: " + url); | |
| 1423 return; | |
| 1424 } | |
| 1425 | 1415 |
| 1426 // Verify we have a valid stream association. | 1416 // Verify we have a valid stream association. |
| 1427 if (!IsStreamActive(associated_stream_id)) { | 1417 if (!IsStreamActive(associated_stream_id)) { |
| 1428 ResetStream(stream_id, INVALID_ASSOCIATED_STREAM, | 1418 ResetStream(stream_id, INVALID_ASSOCIATED_STREAM, |
| 1429 base::StringPrintf( | 1419 base::StringPrintf( |
| 1430 "Received OnSyn with inactive associated stream %d", | 1420 "Received OnSyn with inactive associated stream %d", |
| 1431 associated_stream_id)); | 1421 associated_stream_id)); |
| 1432 return; | 1422 return; |
| 1433 } | 1423 } |
| 1434 | 1424 |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1947 SSLClientSocket* SpdySession::GetSSLClientSocket() const { | 1937 SSLClientSocket* SpdySession::GetSSLClientSocket() const { |
| 1948 if (!is_secure_) | 1938 if (!is_secure_) |
| 1949 return NULL; | 1939 return NULL; |
| 1950 SSLClientSocket* ssl_socket = | 1940 SSLClientSocket* ssl_socket = |
| 1951 reinterpret_cast<SSLClientSocket*>(connection_->socket()); | 1941 reinterpret_cast<SSLClientSocket*>(connection_->socket()); |
| 1952 DCHECK(ssl_socket); | 1942 DCHECK(ssl_socket); |
| 1953 return ssl_socket; | 1943 return ssl_socket; |
| 1954 } | 1944 } |
| 1955 | 1945 |
| 1956 } // namespace net | 1946 } // namespace net |
| OLD | NEW |