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 <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
11 #include <deque> | 11 #include <deque> |
12 #include <map> | 12 #include <map> |
13 #include <memory> | 13 #include <memory> |
14 #include <set> | 14 #include <set> |
15 #include <string> | |
16 #include <vector> | 15 #include <vector> |
17 | 16 |
18 #include "base/gtest_prod_util.h" | 17 #include "base/gtest_prod_util.h" |
19 #include "base/macros.h" | 18 #include "base/macros.h" |
20 #include "base/memory/ref_counted.h" | 19 #include "base/memory/ref_counted.h" |
21 #include "base/memory/weak_ptr.h" | 20 #include "base/memory/weak_ptr.h" |
22 #include "base/time/time.h" | 21 #include "base/time/time.h" |
23 #include "net/base/host_port_pair.h" | 22 #include "net/base/host_port_pair.h" |
24 #include "net/base/io_buffer.h" | 23 #include "net/base/io_buffer.h" |
25 #include "net/base/load_states.h" | 24 #include "net/base/load_states.h" |
26 #include "net/base/net_errors.h" | 25 #include "net/base/net_errors.h" |
27 #include "net/base/net_export.h" | 26 #include "net/base/net_export.h" |
28 #include "net/base/request_priority.h" | 27 #include "net/base/request_priority.h" |
29 #include "net/log/net_log_source.h" | 28 #include "net/log/net_log_source.h" |
30 #include "net/socket/client_socket_handle.h" | 29 #include "net/socket/client_socket_handle.h" |
31 #include "net/socket/client_socket_pool.h" | 30 #include "net/socket/client_socket_pool.h" |
32 #include "net/socket/next_proto.h" | 31 #include "net/socket/next_proto.h" |
33 #include "net/socket/ssl_client_socket.h" | 32 #include "net/socket/ssl_client_socket.h" |
34 #include "net/socket/stream_socket.h" | 33 #include "net/socket/stream_socket.h" |
35 #include "net/spdy/buffered_spdy_framer.h" | 34 #include "net/spdy/buffered_spdy_framer.h" |
36 #include "net/spdy/http2_priority_dependencies.h" | 35 #include "net/spdy/http2_priority_dependencies.h" |
37 #include "net/spdy/multiplexed_session.h" | 36 #include "net/spdy/multiplexed_session.h" |
| 37 #include "net/spdy/platform/api/spdy_string.h" |
38 #include "net/spdy/platform/api/spdy_string_piece.h" | 38 #include "net/spdy/platform/api/spdy_string_piece.h" |
39 #include "net/spdy/server_push_delegate.h" | 39 #include "net/spdy/server_push_delegate.h" |
40 #include "net/spdy/spdy_alt_svc_wire_format.h" | 40 #include "net/spdy/spdy_alt_svc_wire_format.h" |
41 #include "net/spdy/spdy_buffer.h" | 41 #include "net/spdy/spdy_buffer.h" |
42 #include "net/spdy/spdy_framer.h" | 42 #include "net/spdy/spdy_framer.h" |
43 #include "net/spdy/spdy_header_block.h" | 43 #include "net/spdy/spdy_header_block.h" |
44 #include "net/spdy/spdy_protocol.h" | 44 #include "net/spdy/spdy_protocol.h" |
45 #include "net/spdy/spdy_session_pool.h" | 45 #include "net/spdy/spdy_session_pool.h" |
46 #include "net/spdy/spdy_stream.h" | 46 #include "net/spdy/spdy_stream.h" |
47 #include "net/spdy/spdy_write_queue.h" | 47 #include "net/spdy/spdy_write_queue.h" |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 // (Bijective) map from the URL to the ID of the streams that have | 285 // (Bijective) map from the URL to the ID of the streams that have |
286 // already started to be pushed by the server, but do not have | 286 // already started to be pushed by the server, but do not have |
287 // consumers yet. Contains a subset of |active_streams_|. | 287 // consumers yet. Contains a subset of |active_streams_|. |
288 PushedStreamMap streams_; | 288 PushedStreamMap streams_; |
289 }; | 289 }; |
290 | 290 |
291 // Returns true if |new_hostname| can be pooled into an existing connection to | 291 // Returns true if |new_hostname| can be pooled into an existing connection to |
292 // |old_hostname| associated with |ssl_info|. | 292 // |old_hostname| associated with |ssl_info|. |
293 static bool CanPool(TransportSecurityState* transport_security_state, | 293 static bool CanPool(TransportSecurityState* transport_security_state, |
294 const SSLInfo& ssl_info, | 294 const SSLInfo& ssl_info, |
295 const std::string& old_hostname, | 295 const SpdyString& old_hostname, |
296 const std::string& new_hostname); | 296 const SpdyString& new_hostname); |
297 | 297 |
298 // Create a new SpdySession. | 298 // Create a new SpdySession. |
299 // |spdy_session_key| is the host/port that this session connects to, privacy | 299 // |spdy_session_key| is the host/port that this session connects to, privacy |
300 // and proxy configuration settings that it's using. | 300 // and proxy configuration settings that it's using. |
301 // |session| is the HttpNetworkSession. |net_log| is the NetLog that we log | 301 // |session| is the HttpNetworkSession. |net_log| is the NetLog that we log |
302 // network events to. | 302 // network events to. |
303 SpdySession(const SpdySessionKey& spdy_session_key, | 303 SpdySession(const SpdySessionKey& spdy_session_key, |
304 HttpServerProperties* http_server_properties, | 304 HttpServerProperties* http_server_properties, |
305 TransportSecurityState* transport_security_state, | 305 TransportSecurityState* transport_security_state, |
306 bool enable_sending_initial_data, | 306 bool enable_sending_initial_data, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 // Check to see if this SPDY session can support an additional domain. | 361 // Check to see if this SPDY session can support an additional domain. |
362 // If the session is un-authenticated, then this call always returns true. | 362 // If the session is un-authenticated, then this call always returns true. |
363 // For SSL-based sessions, verifies that the server certificate in use by | 363 // For SSL-based sessions, verifies that the server certificate in use by |
364 // this session provides authentication for the domain and no client | 364 // this session provides authentication for the domain and no client |
365 // certificate or channel ID was sent to the original server during the SSL | 365 // certificate or channel ID was sent to the original server during the SSL |
366 // handshake. NOTE: This function can have false negatives on some | 366 // handshake. NOTE: This function can have false negatives on some |
367 // platforms. | 367 // platforms. |
368 // TODO(wtc): rename this function and the Net.SpdyIPPoolDomainMatch | 368 // TODO(wtc): rename this function and the Net.SpdyIPPoolDomainMatch |
369 // histogram because this function does more than verifying domain | 369 // histogram because this function does more than verifying domain |
370 // authentication now. | 370 // authentication now. |
371 bool VerifyDomainAuthentication(const std::string& domain); | 371 bool VerifyDomainAuthentication(const SpdyString& domain); |
372 | 372 |
373 // Pushes the given producer into the write queue for | 373 // Pushes the given producer into the write queue for |
374 // |stream|. |stream| is guaranteed to be activated before the | 374 // |stream|. |stream| is guaranteed to be activated before the |
375 // producer is used to produce its frame. | 375 // producer is used to produce its frame. |
376 void EnqueueStreamWrite(const base::WeakPtr<SpdyStream>& stream, | 376 void EnqueueStreamWrite(const base::WeakPtr<SpdyStream>& stream, |
377 SpdyFrameType frame_type, | 377 SpdyFrameType frame_type, |
378 std::unique_ptr<SpdyBufferProducer> producer); | 378 std::unique_ptr<SpdyBufferProducer> producer); |
379 | 379 |
380 // Creates and returns a HEADERS frame for |stream_id|. | 380 // Creates and returns a HEADERS frame for |stream_id|. |
381 std::unique_ptr<SpdySerializedFrame> CreateHeaders( | 381 std::unique_ptr<SpdySerializedFrame> CreateHeaders( |
(...skipping 18 matching lines...) Expand all Loading... |
400 // Close the given created stream, which must exist but not yet be | 400 // Close the given created stream, which must exist but not yet be |
401 // active. Note that |stream| may hold the last reference to the | 401 // active. Note that |stream| may hold the last reference to the |
402 // session. | 402 // session. |
403 void CloseCreatedStream(const base::WeakPtr<SpdyStream>& stream, int status); | 403 void CloseCreatedStream(const base::WeakPtr<SpdyStream>& stream, int status); |
404 | 404 |
405 // Send a RST_STREAM frame with the given status code and close the | 405 // Send a RST_STREAM frame with the given status code and close the |
406 // stream with the given ID, which must exist and be active. Note | 406 // stream with the given ID, which must exist and be active. Note |
407 // that that stream may hold the last reference to the session. | 407 // that that stream may hold the last reference to the session. |
408 void ResetStream(SpdyStreamId stream_id, | 408 void ResetStream(SpdyStreamId stream_id, |
409 SpdyErrorCode error_code, | 409 SpdyErrorCode error_code, |
410 const std::string& description); | 410 const SpdyString& description); |
411 | 411 |
412 // Check if a stream is active. | 412 // Check if a stream is active. |
413 bool IsStreamActive(SpdyStreamId stream_id) const; | 413 bool IsStreamActive(SpdyStreamId stream_id) const; |
414 | 414 |
415 // The LoadState is used for informing the user of the current network | 415 // The LoadState is used for informing the user of the current network |
416 // status, such as "resolving host", "connecting", etc. | 416 // status, such as "resolving host", "connecting", etc. |
417 LoadState GetLoadState() const; | 417 LoadState GetLoadState() const; |
418 | 418 |
419 // Returns server infomation in the form of (scheme/host/port). | 419 // Returns server infomation in the form of (scheme/host/port). |
420 url::SchemeHostPort GetServer(); | 420 url::SchemeHostPort GetServer(); |
(...skipping 23 matching lines...) Expand all Loading... |
444 | 444 |
445 // Closes this session. This will close all active streams and mark | 445 // Closes this session. This will close all active streams and mark |
446 // the session as permanently closed. Callers must assume that the | 446 // the session as permanently closed. Callers must assume that the |
447 // session is destroyed after this is called. (However, it may not | 447 // session is destroyed after this is called. (However, it may not |
448 // be destroyed right away, e.g. when a SpdySession function is | 448 // be destroyed right away, e.g. when a SpdySession function is |
449 // present in the call stack.) | 449 // present in the call stack.) |
450 // | 450 // |
451 // |err| should be < ERR_IO_PENDING; this function is intended to be | 451 // |err| should be < ERR_IO_PENDING; this function is intended to be |
452 // called on error. | 452 // called on error. |
453 // |description| indicates the reason for the error. | 453 // |description| indicates the reason for the error. |
454 void CloseSessionOnError(Error err, const std::string& description); | 454 void CloseSessionOnError(Error err, const SpdyString& description); |
455 | 455 |
456 // Mark this session as unavailable, meaning that it will not be used to | 456 // Mark this session as unavailable, meaning that it will not be used to |
457 // service new streams. Unlike when a GOAWAY frame is received, this function | 457 // service new streams. Unlike when a GOAWAY frame is received, this function |
458 // will not close any streams. | 458 // will not close any streams. |
459 void MakeUnavailable(); | 459 void MakeUnavailable(); |
460 | 460 |
461 // Closes all active streams with stream id's greater than | 461 // Closes all active streams with stream id's greater than |
462 // |last_good_stream_id|, as well as any created or pending | 462 // |last_good_stream_id|, as well as any created or pending |
463 // streams. Must be called only when |availability_state_| >= | 463 // streams. Must be called only when |availability_state_| >= |
464 // STATE_GOING_AWAY. After this function, DcheckGoingAway() will | 464 // STATE_GOING_AWAY. After this function, DcheckGoingAway() will |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 void CloseActiveStreamIterator(ActiveStreamMap::iterator it, int status); | 699 void CloseActiveStreamIterator(ActiveStreamMap::iterator it, int status); |
700 | 700 |
701 // Close the stream pointed to by the given iterator. Note that that | 701 // Close the stream pointed to by the given iterator. Note that that |
702 // stream may hold the last reference to the session. | 702 // stream may hold the last reference to the session. |
703 void CloseCreatedStreamIterator(CreatedStreamSet::iterator it, int status); | 703 void CloseCreatedStreamIterator(CreatedStreamSet::iterator it, int status); |
704 | 704 |
705 // Calls EnqueueResetStreamFrame() and then | 705 // Calls EnqueueResetStreamFrame() and then |
706 // CloseActiveStreamIterator(). | 706 // CloseActiveStreamIterator(). |
707 void ResetStreamIterator(ActiveStreamMap::iterator it, | 707 void ResetStreamIterator(ActiveStreamMap::iterator it, |
708 SpdyErrorCode error_code, | 708 SpdyErrorCode error_code, |
709 const std::string& description); | 709 const SpdyString& description); |
710 | 710 |
711 // Send a RST_STREAM frame with the given parameters. There should | 711 // Send a RST_STREAM frame with the given parameters. There should |
712 // either be no active stream with the given ID, or that active | 712 // either be no active stream with the given ID, or that active |
713 // stream should be closed shortly after this function is called. | 713 // stream should be closed shortly after this function is called. |
714 void EnqueueResetStreamFrame(SpdyStreamId stream_id, | 714 void EnqueueResetStreamFrame(SpdyStreamId stream_id, |
715 RequestPriority priority, | 715 RequestPriority priority, |
716 SpdyErrorCode error_code, | 716 SpdyErrorCode error_code, |
717 const std::string& description); | 717 const SpdyString& description); |
718 | 718 |
719 // Send a PRIORITY frame with the given parameters. | 719 // Send a PRIORITY frame with the given parameters. |
720 void EnqueuePriorityFrame(SpdyStreamId stream_id, | 720 void EnqueuePriorityFrame(SpdyStreamId stream_id, |
721 SpdyStreamId dependency_id, | 721 SpdyStreamId dependency_id, |
722 int weight, | 722 int weight, |
723 bool exclusive); | 723 bool exclusive); |
724 | 724 |
725 // Calls DoReadLoop. Use this function instead of DoReadLoop when | 725 // Calls DoReadLoop. Use this function instead of DoReadLoop when |
726 // posting a task to pump the read loop. | 726 // posting a task to pump the read loop. |
727 void PumpReadLoop(ReadState expected_read_state, int result); | 727 void PumpReadLoop(ReadState expected_read_state, int result); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 // no created streams. | 845 // no created streams. |
846 void DcheckGoingAway() const; | 846 void DcheckGoingAway() const; |
847 | 847 |
848 // Calls DcheckGoingAway(), then DCHECKs that |availability_state_| | 848 // Calls DcheckGoingAway(), then DCHECKs that |availability_state_| |
849 // == STATE_DRAINING, |error_on_close_| has a valid value, and that there | 849 // == STATE_DRAINING, |error_on_close_| has a valid value, and that there |
850 // are no active streams or unclaimed pushed streams. | 850 // are no active streams or unclaimed pushed streams. |
851 void DcheckDraining() const; | 851 void DcheckDraining() const; |
852 | 852 |
853 // If the session is already draining, does nothing. Otherwise, moves | 853 // If the session is already draining, does nothing. Otherwise, moves |
854 // the session to the draining state. | 854 // the session to the draining state. |
855 void DoDrainSession(Error err, const std::string& description); | 855 void DoDrainSession(Error err, const SpdyString& description); |
856 | 856 |
857 // Called right before closing a (possibly-inactive) stream for a | 857 // Called right before closing a (possibly-inactive) stream for a |
858 // reason other than being requested to by the stream. | 858 // reason other than being requested to by the stream. |
859 void LogAbandonedStream(SpdyStream* stream, Error status); | 859 void LogAbandonedStream(SpdyStream* stream, Error status); |
860 | 860 |
861 // Called right before closing an active stream for a reason other | 861 // Called right before closing an active stream for a reason other |
862 // than being requested to by the stream. | 862 // than being requested to by the stream. |
863 void LogAbandonedActiveStream(ActiveStreamMap::const_iterator it, | 863 void LogAbandonedActiveStream(ActiveStreamMap::const_iterator it, |
864 Error status); | 864 Error status); |
865 | 865 |
866 // Invokes a user callback for stream creation. We provide this method so it | 866 // Invokes a user callback for stream creation. We provide this method so it |
867 // can be deferred to the MessageLoop, so we avoid re-entrancy problems. | 867 // can be deferred to the MessageLoop, so we avoid re-entrancy problems. |
868 void CompleteStreamRequest( | 868 void CompleteStreamRequest( |
869 const base::WeakPtr<SpdyStreamRequest>& pending_request); | 869 const base::WeakPtr<SpdyStreamRequest>& pending_request); |
870 | 870 |
871 // Remove old unclaimed pushed streams. | 871 // Remove old unclaimed pushed streams. |
872 void DeleteExpiredPushedStreams(); | 872 void DeleteExpiredPushedStreams(); |
873 | 873 |
874 // BufferedSpdyFramerVisitorInterface: | 874 // BufferedSpdyFramerVisitorInterface: |
875 void OnError(SpdyFramer::SpdyFramerError spdy_framer_error) override; | 875 void OnError(SpdyFramer::SpdyFramerError spdy_framer_error) override; |
876 void OnStreamError(SpdyStreamId stream_id, | 876 void OnStreamError(SpdyStreamId stream_id, |
877 const std::string& description) override; | 877 const SpdyString& description) override; |
878 void OnPing(SpdyPingId unique_id, bool is_ack) override; | 878 void OnPing(SpdyPingId unique_id, bool is_ack) override; |
879 void OnRstStream(SpdyStreamId stream_id, SpdyErrorCode error_code) override; | 879 void OnRstStream(SpdyStreamId stream_id, SpdyErrorCode error_code) override; |
880 void OnGoAway(SpdyStreamId last_accepted_stream_id, | 880 void OnGoAway(SpdyStreamId last_accepted_stream_id, |
881 SpdyErrorCode error_code, | 881 SpdyErrorCode error_code, |
882 SpdyStringPiece debug_data) override; | 882 SpdyStringPiece debug_data) override; |
883 void OnDataFrameHeader(SpdyStreamId stream_id, | 883 void OnDataFrameHeader(SpdyStreamId stream_id, |
884 size_t length, | 884 size_t length, |
885 bool fin) override; | 885 bool fin) override; |
886 void OnStreamFrameData(SpdyStreamId stream_id, | 886 void OnStreamFrameData(SpdyStreamId stream_id, |
887 const char* data, | 887 const char* data, |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1227 // Used for posting asynchronous IO tasks. We use this even though | 1227 // Used for posting asynchronous IO tasks. We use this even though |
1228 // SpdySession is refcounted because we don't need to keep the SpdySession | 1228 // SpdySession is refcounted because we don't need to keep the SpdySession |
1229 // alive if the last reference is within a RunnableMethod. Just revoke the | 1229 // alive if the last reference is within a RunnableMethod. Just revoke the |
1230 // method. | 1230 // method. |
1231 base::WeakPtrFactory<SpdySession> weak_factory_; | 1231 base::WeakPtrFactory<SpdySession> weak_factory_; |
1232 }; | 1232 }; |
1233 | 1233 |
1234 } // namespace net | 1234 } // namespace net |
1235 | 1235 |
1236 #endif // NET_SPDY_SPDY_SESSION_H_ | 1236 #endif // NET_SPDY_SPDY_SESSION_H_ |
OLD | NEW |