| 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 |