| 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 #ifndef NET_SPDY_SPDY_SESSION_H_ | 5 #ifndef NET_SPDY_SPDY_SESSION_H_ |
| 6 #define NET_SPDY_SPDY_SESSION_H_ | 6 #define NET_SPDY_SPDY_SESSION_H_ |
| 7 | 7 |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 #include "net/spdy/spdy_header_block.h" | 32 #include "net/spdy/spdy_header_block.h" |
| 33 #include "net/spdy/spdy_protocol.h" | 33 #include "net/spdy/spdy_protocol.h" |
| 34 #include "net/spdy/spdy_session_pool.h" | 34 #include "net/spdy/spdy_session_pool.h" |
| 35 #include "net/spdy/spdy_stream.h" | 35 #include "net/spdy/spdy_stream.h" |
| 36 #include "net/spdy/spdy_write_queue.h" | 36 #include "net/spdy/spdy_write_queue.h" |
| 37 #include "net/ssl/ssl_config_service.h" | 37 #include "net/ssl/ssl_config_service.h" |
| 38 #include "url/gurl.h" | 38 #include "url/gurl.h" |
| 39 | 39 |
| 40 namespace net { | 40 namespace net { |
| 41 | 41 |
| 42 namespace test { |
| 43 class SpdyStreamTest; |
| 44 } |
| 45 |
| 42 // This is somewhat arbitrary and not really fixed, but it will always work | 46 // This is somewhat arbitrary and not really fixed, but it will always work |
| 43 // reasonably with ethernet. Chop the world into 2-packet chunks. This is | 47 // reasonably with ethernet. Chop the world into 2-packet chunks. This is |
| 44 // somewhat arbitrary, but is reasonably small and ensures that we elicit | 48 // somewhat arbitrary, but is reasonably small and ensures that we elicit |
| 45 // ACKs quickly from TCP (because TCP tries to only ACK every other packet). | 49 // ACKs quickly from TCP (because TCP tries to only ACK every other packet). |
| 46 const int kMss = 1430; | 50 const int kMss = 1430; |
| 47 // The 8 is the size of the SPDY frame header. | 51 // The 8 is the size of the SPDY frame header. |
| 48 const int kMaxSpdyFrameChunkSize = (2 * kMss) - 8; | 52 const int kMaxSpdyFrameChunkSize = (2 * kMss) - 8; |
| 49 | 53 |
| 50 // Maximum number of concurrent streams we will create, unless the server | 54 // Maximum number of concurrent streams we will create, unless the server |
| 51 // sends a SETTINGS frame with a different value. | 55 // sends a SETTINGS frame with a different value. |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 // standards for TLS. | 514 // standards for TLS. |
| 511 bool HasAcceptableTransportSecurity() const; | 515 bool HasAcceptableTransportSecurity() const; |
| 512 | 516 |
| 513 // Must be used only by |pool_|. | 517 // Must be used only by |pool_|. |
| 514 base::WeakPtr<SpdySession> GetWeakPtr(); | 518 base::WeakPtr<SpdySession> GetWeakPtr(); |
| 515 | 519 |
| 516 // HigherLayeredPool implementation: | 520 // HigherLayeredPool implementation: |
| 517 bool CloseOneIdleConnection() override; | 521 bool CloseOneIdleConnection() override; |
| 518 | 522 |
| 519 private: | 523 private: |
| 524 friend class test::SpdyStreamTest; |
| 520 friend class base::RefCounted<SpdySession>; | 525 friend class base::RefCounted<SpdySession>; |
| 526 friend class HttpNetworkTransactionTest; |
| 527 friend class HttpProxyClientSocketPoolTest; |
| 528 friend class SpdyHttpStreamTest; |
| 529 friend class SpdyNetworkTransactionTest; |
| 530 friend class SpdyProxyClientSocketTest; |
| 531 friend class SpdySessionTest; |
| 521 friend class SpdyStreamRequest; | 532 friend class SpdyStreamRequest; |
| 522 friend class SpdySessionTest; | |
| 523 | 533 |
| 524 // Allow tests to access our innards for testing purposes. | 534 // Allow tests to access our innards for testing purposes. |
| 525 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, ClientPing); | 535 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, ClientPing); |
| 526 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, FailedPing); | 536 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, FailedPing); |
| 527 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, GetActivePushStream); | 537 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, GetActivePushStream); |
| 528 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, DeleteExpiredPushStreams); | 538 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, DeleteExpiredPushStreams); |
| 529 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, ProtocolNegotiation); | 539 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, ProtocolNegotiation); |
| 530 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, ClearSettings); | 540 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, ClearSettings); |
| 531 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, AdjustRecvWindowSize); | 541 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, AdjustRecvWindowSize); |
| 532 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, AdjustSendWindowSize); | 542 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, AdjustSendWindowSize); |
| 533 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlInactiveStream); | 543 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlInactiveStream); |
| 534 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlPadding); | 544 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlPadding); |
| 535 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, | 545 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, |
| 536 SessionFlowControlTooMuchDataTwoDataFrames); | 546 SessionFlowControlTooMuchDataTwoDataFrames); |
| 537 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, | 547 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, |
| 538 StreamFlowControlTooMuchDataTwoDataFrames); | 548 StreamFlowControlTooMuchDataTwoDataFrames); |
| 539 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlNoReceiveLeaks); | 549 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlNoReceiveLeaks); |
| 540 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlNoSendLeaks); | 550 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlNoSendLeaks); |
| 541 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlEndToEnd); | 551 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, SessionFlowControlEndToEnd); |
| 542 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, StreamIdSpaceExhausted); | 552 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, StreamIdSpaceExhausted); |
| 543 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, UnstallRacesWithStreamCreation); | 553 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, UnstallRacesWithStreamCreation); |
| 544 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, GoAwayOnSessionFlowControlError); | 554 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, GoAwayOnSessionFlowControlError); |
| 545 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, | 555 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, |
| 546 RejectPushedStreamExceedingConcurrencyLimit); | 556 RejectPushedStreamExceedingConcurrencyLimit); |
| 547 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, IgnoreReservedRemoteStreamsCount); | 557 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, IgnoreReservedRemoteStreamsCount); |
| 548 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, | 558 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, |
| 549 CancelReservedStreamOnHeadersReceived); | 559 CancelReservedStreamOnHeadersReceived); |
| 550 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, RejectInvalidUnknownFrames); | 560 FRIEND_TEST_ALL_PREFIXES(SpdySessionTest, RejectInvalidUnknownFrames); |
| 561 FRIEND_TEST_ALL_PREFIXES(SpdySessionPoolTest, IPAddressChanged); |
| 551 | 562 |
| 552 typedef std::deque<base::WeakPtr<SpdyStreamRequest> > | 563 typedef std::deque<base::WeakPtr<SpdyStreamRequest> > |
| 553 PendingStreamRequestQueue; | 564 PendingStreamRequestQueue; |
| 554 | 565 |
| 555 struct ActiveStreamInfo { | 566 struct ActiveStreamInfo { |
| 556 ActiveStreamInfo(); | 567 ActiveStreamInfo(); |
| 557 explicit ActiveStreamInfo(SpdyStream* stream); | 568 explicit ActiveStreamInfo(SpdyStream* stream); |
| 558 ~ActiveStreamInfo(); | 569 ~ActiveStreamInfo(); |
| 559 | 570 |
| 560 SpdyStream* stream; | 571 SpdyStream* stream; |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 951 int64 pings_in_flight() const { return pings_in_flight_; } | 962 int64 pings_in_flight() const { return pings_in_flight_; } |
| 952 | 963 |
| 953 SpdyPingId next_ping_id() const { return next_ping_id_; } | 964 SpdyPingId next_ping_id() const { return next_ping_id_; } |
| 954 | 965 |
| 955 base::TimeTicks last_activity_time() const { return last_activity_time_; } | 966 base::TimeTicks last_activity_time() const { return last_activity_time_; } |
| 956 | 967 |
| 957 bool check_ping_status_pending() const { return check_ping_status_pending_; } | 968 bool check_ping_status_pending() const { return check_ping_status_pending_; } |
| 958 | 969 |
| 959 size_t max_concurrent_streams() const { return max_concurrent_streams_; } | 970 size_t max_concurrent_streams() const { return max_concurrent_streams_; } |
| 960 | 971 |
| 972 // Set whether priority->dependency conversion is enabled |
| 973 // by default for all future SpdySessions. |
| 974 static void SetPriorityDependencyDefaultForTesting(bool enable); |
| 975 |
| 961 // Whether Do{Read,Write}Loop() is in the call stack. Useful for | 976 // Whether Do{Read,Write}Loop() is in the call stack. Useful for |
| 962 // making sure we don't destroy ourselves prematurely in that case. | 977 // making sure we don't destroy ourselves prematurely in that case. |
| 963 bool in_io_loop_; | 978 bool in_io_loop_; |
| 964 | 979 |
| 965 // The key used to identify this session. | 980 // The key used to identify this session. |
| 966 const SpdySessionKey spdy_session_key_; | 981 const SpdySessionKey spdy_session_key_; |
| 967 | 982 |
| 968 // Set set of SpdySessionKeys for which this session has serviced | 983 // Set set of SpdySessionKeys for which this session has serviced |
| 969 // requests. | 984 // requests. |
| 970 std::set<SpdySessionKey> pooled_aliases_; | 985 std::set<SpdySessionKey> pooled_aliases_; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 997 // the server to start pushing the stream]) or there are still network events | 1012 // the server to start pushing the stream]) or there are still network events |
| 998 // incoming even though the consumer has already gone away (cancellation). | 1013 // incoming even though the consumer has already gone away (cancellation). |
| 999 // | 1014 // |
| 1000 // |active_streams_| owns all its SpdyStream objects. | 1015 // |active_streams_| owns all its SpdyStream objects. |
| 1001 // | 1016 // |
| 1002 // TODO(willchan): Perhaps we should separate out cancelled streams and move | 1017 // TODO(willchan): Perhaps we should separate out cancelled streams and move |
| 1003 // them into a separate ActiveStreamMap, and not deliver network events to | 1018 // them into a separate ActiveStreamMap, and not deliver network events to |
| 1004 // them? | 1019 // them? |
| 1005 ActiveStreamMap active_streams_; | 1020 ActiveStreamMap active_streams_; |
| 1006 | 1021 |
| 1022 // Per-priority map from stream id to all active streams. This map will |
| 1023 // contain the same set of streams as |active_streams_|. It is used for |
| 1024 // setting dependencies to match incoming requests RequestPriority. |
| 1025 // |
| 1026 // |active_streams_by_priority_| does *not* own its SpdyStream objects. |
| 1027 std::map<SpdyStreamId, SpdyStream*> |
| 1028 active_streams_by_priority_[NUM_PRIORITIES]; |
| 1029 |
| 1007 // (Bijective) map from the URL to the ID of the streams that have | 1030 // (Bijective) map from the URL to the ID of the streams that have |
| 1008 // already started to be pushed by the server, but do not have | 1031 // already started to be pushed by the server, but do not have |
| 1009 // consumers yet. Contains a subset of |active_streams_|. | 1032 // consumers yet. Contains a subset of |active_streams_|. |
| 1010 PushedStreamMap unclaimed_pushed_streams_; | 1033 PushedStreamMap unclaimed_pushed_streams_; |
| 1011 | 1034 |
| 1012 // Set of all created streams but that have not yet sent any frames. | 1035 // Set of all created streams but that have not yet sent any frames. |
| 1013 // | 1036 // |
| 1014 // |created_streams_| owns all its SpdyStream objects. | 1037 // |created_streams_| owns all its SpdyStream objects. |
| 1015 CreatedStreamSet created_streams_; | 1038 CreatedStreamSet created_streams_; |
| 1016 | 1039 |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1175 // to build a new connection, and see if that completes before we (finally) | 1198 // to build a new connection, and see if that completes before we (finally) |
| 1176 // get a PING response (http://crbug.com/127812). | 1199 // get a PING response (http://crbug.com/127812). |
| 1177 base::TimeDelta hung_interval_; | 1200 base::TimeDelta hung_interval_; |
| 1178 | 1201 |
| 1179 // This SPDY proxy is allowed to push resources from origins that are | 1202 // This SPDY proxy is allowed to push resources from origins that are |
| 1180 // different from those of their associated streams. | 1203 // different from those of their associated streams. |
| 1181 HostPortPair trusted_spdy_proxy_; | 1204 HostPortPair trusted_spdy_proxy_; |
| 1182 | 1205 |
| 1183 TimeFunc time_func_; | 1206 TimeFunc time_func_; |
| 1184 | 1207 |
| 1208 // Should priority-based dependency information be sent in stream header |
| 1209 // frames. |
| 1210 bool send_priority_dependency_; |
| 1211 |
| 1185 // Used for posting asynchronous IO tasks. We use this even though | 1212 // Used for posting asynchronous IO tasks. We use this even though |
| 1186 // SpdySession is refcounted because we don't need to keep the SpdySession | 1213 // SpdySession is refcounted because we don't need to keep the SpdySession |
| 1187 // alive if the last reference is within a RunnableMethod. Just revoke the | 1214 // alive if the last reference is within a RunnableMethod. Just revoke the |
| 1188 // method. | 1215 // method. |
| 1189 base::WeakPtrFactory<SpdySession> weak_factory_; | 1216 base::WeakPtrFactory<SpdySession> weak_factory_; |
| 1190 }; | 1217 }; |
| 1191 | 1218 |
| 1192 } // namespace net | 1219 } // namespace net |
| 1193 | 1220 |
| 1194 #endif // NET_SPDY_SPDY_SESSION_H_ | 1221 #endif // NET_SPDY_SPDY_SESSION_H_ |
| OLD | NEW |