| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 #include "net/ssl/server_bound_cert_service.h" | 42 #include "net/ssl/server_bound_cert_service.h" |
| 43 | 43 |
| 44 namespace net { | 44 namespace net { |
| 45 | 45 |
| 46 namespace { | 46 namespace { |
| 47 | 47 |
| 48 const int kReadBufferSize = 8 * 1024; | 48 const int kReadBufferSize = 8 * 1024; |
| 49 const int kDefaultConnectionAtRiskOfLossSeconds = 10; | 49 const int kDefaultConnectionAtRiskOfLossSeconds = 10; |
| 50 const int kHungIntervalSeconds = 10; | 50 const int kHungIntervalSeconds = 10; |
| 51 | 51 |
| 52 // Always start at 1 for the first stream id. | 52 // As we always act as the client, start at 1 for the first stream id. |
| 53 const SpdyStreamId kFirstStreamId = 1; | 53 const SpdyStreamId kFirstStreamId = 1; |
| 54 const SpdyStreamId kLastStreamId = 0x7fffffff; |
| 54 | 55 |
| 55 // Minimum seconds that unclaimed pushed streams will be kept in memory. | 56 // Minimum seconds that unclaimed pushed streams will be kept in memory. |
| 56 const int kMinPushedStreamLifetimeSeconds = 300; | 57 const int kMinPushedStreamLifetimeSeconds = 300; |
| 57 | 58 |
| 58 scoped_ptr<base::ListValue> SpdyHeaderBlockToListValue( | 59 scoped_ptr<base::ListValue> SpdyHeaderBlockToListValue( |
| 59 const SpdyHeaderBlock& headers, | 60 const SpdyHeaderBlock& headers, |
| 60 net::NetLog::LogLevel log_level) { | 61 net::NetLog::LogLevel log_level) { |
| 61 scoped_ptr<base::ListValue> headers_list(new base::ListValue()); | 62 scoped_ptr<base::ListValue> headers_list(new base::ListValue()); |
| 62 for (SpdyHeaderBlock::const_iterator it = headers.begin(); | 63 for (SpdyHeaderBlock::const_iterator it = headers.begin(); |
| 63 it != headers.end(); ++it) { | 64 it != headers.end(); ++it) { |
| (...skipping 1313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1377 CHECK(!stream->IsClosed()); | 1378 CHECK(!stream->IsClosed()); |
| 1378 | 1379 |
| 1379 // Activate the stream only when sending the SYN_STREAM frame to | 1380 // Activate the stream only when sending the SYN_STREAM frame to |
| 1380 // guarantee monotonically-increasing stream IDs. | 1381 // guarantee monotonically-increasing stream IDs. |
| 1381 if (frame_type == SYN_STREAM) { | 1382 if (frame_type == SYN_STREAM) { |
| 1382 CHECK(stream.get()); | 1383 CHECK(stream.get()); |
| 1383 CHECK_EQ(stream->stream_id(), 0u); | 1384 CHECK_EQ(stream->stream_id(), 0u); |
| 1384 scoped_ptr<SpdyStream> owned_stream = | 1385 scoped_ptr<SpdyStream> owned_stream = |
| 1385 ActivateCreatedStream(stream.get()); | 1386 ActivateCreatedStream(stream.get()); |
| 1386 InsertActivatedStream(owned_stream.Pass()); | 1387 InsertActivatedStream(owned_stream.Pass()); |
| 1388 |
| 1389 if (stream_hi_water_mark_ > kLastStreamId) { |
| 1390 CHECK_EQ(stream->stream_id(), kLastStreamId); |
| 1391 // We've exhausted the stream ID space, and no new streams may be |
| 1392 // created after this one. |
| 1393 MakeUnavailable(); |
| 1394 StartGoingAway(kLastStreamId, ERR_ABORTED); |
| 1395 } |
| 1387 } | 1396 } |
| 1388 | 1397 |
| 1389 in_flight_write_ = producer->ProduceBuffer(); | 1398 in_flight_write_ = producer->ProduceBuffer(); |
| 1390 if (!in_flight_write_) { | 1399 if (!in_flight_write_) { |
| 1391 NOTREACHED(); | 1400 NOTREACHED(); |
| 1392 return ERR_UNEXPECTED; | 1401 return ERR_UNEXPECTED; |
| 1393 } | 1402 } |
| 1394 in_flight_write_frame_type_ = frame_type; | 1403 in_flight_write_frame_type_ = frame_type; |
| 1395 in_flight_write_frame_size_ = in_flight_write_->GetRemainingSize(); | 1404 in_flight_write_frame_size_ = in_flight_write_->GetRemainingSize(); |
| 1396 DCHECK_GE(in_flight_write_frame_size_, | 1405 DCHECK_GE(in_flight_write_frame_size_, |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1603 base::StatsCounter abandoned_streams("spdy.abandoned_streams"); | 1612 base::StatsCounter abandoned_streams("spdy.abandoned_streams"); |
| 1604 abandoned_streams.Increment(); | 1613 abandoned_streams.Increment(); |
| 1605 if (it->second.stream->type() == SPDY_PUSH_STREAM && | 1614 if (it->second.stream->type() == SPDY_PUSH_STREAM && |
| 1606 unclaimed_pushed_streams_.find(it->second.stream->url()) != | 1615 unclaimed_pushed_streams_.find(it->second.stream->url()) != |
| 1607 unclaimed_pushed_streams_.end()) { | 1616 unclaimed_pushed_streams_.end()) { |
| 1608 base::StatsCounter abandoned_push_streams("spdy.abandoned_push_streams"); | 1617 base::StatsCounter abandoned_push_streams("spdy.abandoned_push_streams"); |
| 1609 abandoned_push_streams.Increment(); | 1618 abandoned_push_streams.Increment(); |
| 1610 } | 1619 } |
| 1611 } | 1620 } |
| 1612 | 1621 |
| 1613 int SpdySession::GetNewStreamId() { | 1622 SpdyStreamId SpdySession::GetNewStreamId() { |
| 1614 int id = stream_hi_water_mark_; | 1623 CHECK_LE(stream_hi_water_mark_, kLastStreamId); |
| 1624 SpdyStreamId id = stream_hi_water_mark_; |
| 1615 stream_hi_water_mark_ += 2; | 1625 stream_hi_water_mark_ += 2; |
| 1616 if (stream_hi_water_mark_ > 0x7fff) | |
| 1617 stream_hi_water_mark_ = 1; | |
| 1618 return id; | 1626 return id; |
| 1619 } | 1627 } |
| 1620 | 1628 |
| 1621 void SpdySession::CloseSessionOnError(Error err, | 1629 void SpdySession::CloseSessionOnError(Error err, |
| 1622 const std::string& description) { | 1630 const std::string& description) { |
| 1623 // We may be called from anywhere, so we can't expect a particular | 1631 // We may be called from anywhere, so we can't expect a particular |
| 1624 // return value. | 1632 // return value. |
| 1625 ignore_result(DoCloseSession(err, description)); | 1633 ignore_result(DoCloseSession(err, description)); |
| 1626 } | 1634 } |
| 1627 | 1635 |
| (...skipping 1422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3050 if (!queue->empty()) { | 3058 if (!queue->empty()) { |
| 3051 SpdyStreamId stream_id = queue->front(); | 3059 SpdyStreamId stream_id = queue->front(); |
| 3052 queue->pop_front(); | 3060 queue->pop_front(); |
| 3053 return stream_id; | 3061 return stream_id; |
| 3054 } | 3062 } |
| 3055 } | 3063 } |
| 3056 return 0; | 3064 return 0; |
| 3057 } | 3065 } |
| 3058 | 3066 |
| 3059 } // namespace net | 3067 } // namespace net |
| OLD | NEW |