OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 // | |
5 // A client specific QuicSession subclass. This class owns the underlying | |
6 // QuicConnection and QuicConnectionHelper objects. The connection stores | |
7 // a non-owning pointer to the helper so this session needs to ensure that | |
8 // the helper outlives the connection. | |
9 | |
10 #ifndef NET_QUIC_QUIC_CLIENT_SESSION_H_ | |
11 #define NET_QUIC_QUIC_CLIENT_SESSION_H_ | |
12 | |
13 #include <string> | |
14 | |
15 #include "base/basictypes.h" | |
16 #include "base/containers/hash_tables.h" | |
17 #include "base/memory/scoped_ptr.h" | |
18 #include "base/time/time.h" | |
19 #include "net/base/completion_callback.h" | |
20 #include "net/proxy/proxy_server.h" | |
21 #include "net/quic/quic_client_session_base.h" | |
22 #include "net/quic/quic_connection_logger.h" | |
23 #include "net/quic/quic_crypto_client_stream.h" | |
24 #include "net/quic/quic_protocol.h" | |
25 #include "net/quic/quic_reliable_client_stream.h" | |
26 | |
27 namespace net { | |
28 | |
29 class CertVerifyResult; | |
30 class DatagramClientSocket; | |
31 class QuicConnectionHelper; | |
32 class QuicCryptoClientStreamFactory; | |
33 class QuicServerId; | |
34 class QuicServerInfo; | |
35 class QuicStreamFactory; | |
36 class SSLInfo; | |
37 class TransportSecurityState; | |
38 | |
39 namespace test { | |
40 class QuicClientSessionPeer; | |
41 } // namespace test | |
42 | |
43 class NET_EXPORT_PRIVATE QuicClientSession : public QuicClientSessionBase { | |
44 public: | |
45 // An interface for observing events on a session. | |
46 class NET_EXPORT_PRIVATE Observer { | |
47 public: | |
48 virtual ~Observer() {} | |
49 virtual void OnCryptoHandshakeConfirmed() = 0; | |
50 virtual void OnSessionClosed(int error) = 0; | |
51 }; | |
52 | |
53 // A helper class used to manage a request to create a stream. | |
54 class NET_EXPORT_PRIVATE StreamRequest { | |
55 public: | |
56 StreamRequest(); | |
57 ~StreamRequest(); | |
58 | |
59 // Starts a request to create a stream. If OK is returned, then | |
60 // |stream| will be updated with the newly created stream. If | |
61 // ERR_IO_PENDING is returned, then when the request is eventuallly | |
62 // complete |callback| will be called. | |
63 int StartRequest(const base::WeakPtr<QuicClientSession>& session, | |
64 QuicReliableClientStream** stream, | |
65 const CompletionCallback& callback); | |
66 | |
67 // Cancels any pending stream creation request. May be called | |
68 // repeatedly. | |
69 void CancelRequest(); | |
70 | |
71 private: | |
72 friend class QuicClientSession; | |
73 | |
74 // Called by |session_| for an asynchronous request when the stream | |
75 // request has finished successfully. | |
76 void OnRequestCompleteSuccess(QuicReliableClientStream* stream); | |
77 | |
78 // Called by |session_| for an asynchronous request when the stream | |
79 // request has finished with an error. Also called with ERR_ABORTED | |
80 // if |session_| is destroyed while the stream request is still pending. | |
81 void OnRequestCompleteFailure(int rv); | |
82 | |
83 base::WeakPtr<QuicClientSession> session_; | |
84 CompletionCallback callback_; | |
85 QuicReliableClientStream** stream_; | |
86 | |
87 DISALLOW_COPY_AND_ASSIGN(StreamRequest); | |
88 }; | |
89 | |
90 // Constructs a new session which will own |connection|, but not | |
91 // |stream_factory|, which must outlive this session. | |
92 // TODO(rch): decouple the factory from the session via a Delegate interface. | |
93 QuicClientSession(QuicConnection* connection, | |
94 scoped_ptr<DatagramClientSocket> socket, | |
95 QuicStreamFactory* stream_factory, | |
96 TransportSecurityState* transport_security_state, | |
97 scoped_ptr<QuicServerInfo> server_info, | |
98 const QuicConfig& config, | |
99 base::TaskRunner* task_runner, | |
100 NetLog* net_log); | |
101 ~QuicClientSession() override; | |
102 | |
103 // Initialize session's connection to |server_id|. | |
104 void InitializeSession( | |
105 const QuicServerId& server_id, | |
106 QuicCryptoClientConfig* config, | |
107 QuicCryptoClientStreamFactory* crypto_client_stream_factory); | |
108 | |
109 void AddObserver(Observer* observer); | |
110 void RemoveObserver(Observer* observer); | |
111 | |
112 // Attempts to create a new stream. If the stream can be | |
113 // created immediately, returns OK. If the open stream limit | |
114 // has been reached, returns ERR_IO_PENDING, and |request| | |
115 // will be added to the stream requets queue and will | |
116 // be completed asynchronously. | |
117 // TODO(rch): remove |stream| from this and use setter on |request| | |
118 // and fix in spdy too. | |
119 int TryCreateStream(StreamRequest* request, | |
120 QuicReliableClientStream** stream); | |
121 | |
122 // Cancels the pending stream creation request. | |
123 void CancelRequest(StreamRequest* request); | |
124 | |
125 // QuicSession methods: | |
126 void OnStreamFrames(const std::vector<QuicStreamFrame>& frames) override; | |
127 QuicReliableClientStream* CreateOutgoingDataStream() override; | |
128 QuicCryptoClientStream* GetCryptoStream() override; | |
129 void CloseStream(QuicStreamId stream_id) override; | |
130 void SendRstStream(QuicStreamId id, | |
131 QuicRstStreamErrorCode error, | |
132 QuicStreamOffset bytes_written) override; | |
133 void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) override; | |
134 void OnCryptoHandshakeMessageSent( | |
135 const CryptoHandshakeMessage& message) override; | |
136 void OnCryptoHandshakeMessageReceived( | |
137 const CryptoHandshakeMessage& message) override; | |
138 bool GetSSLInfo(SSLInfo* ssl_info) const override; | |
139 | |
140 // QuicClientSessionBase methods: | |
141 void OnProofValid(const QuicCryptoClientConfig::CachedState& cached) override; | |
142 void OnProofVerifyDetailsAvailable( | |
143 const ProofVerifyDetails& verify_details) override; | |
144 | |
145 // QuicConnectionVisitorInterface methods: | |
146 void OnConnectionClosed(QuicErrorCode error, bool from_peer) override; | |
147 void OnSuccessfulVersionNegotiation(const QuicVersion& version) override; | |
148 | |
149 // Performs a crypto handshake with the server. | |
150 int CryptoConnect(bool require_confirmation, | |
151 const CompletionCallback& callback); | |
152 | |
153 // Resumes a crypto handshake with the server after a timeout. | |
154 int ResumeCryptoConnect(const CompletionCallback& callback); | |
155 | |
156 // Causes the QuicConnectionHelper to start reading from the socket | |
157 // and passing the data along to the QuicConnection. | |
158 void StartReading(); | |
159 | |
160 // Close the session because of |error| and notifies the factory | |
161 // that this session has been closed, which will delete the session. | |
162 void CloseSessionOnError(int error); | |
163 | |
164 base::Value* GetInfoAsValue(const std::set<HostPortPair>& aliases); | |
165 | |
166 const BoundNetLog& net_log() const { return net_log_; } | |
167 | |
168 base::WeakPtr<QuicClientSession> GetWeakPtr(); | |
169 | |
170 // Returns the number of client hello messages that have been sent on the | |
171 // crypto stream. If the handshake has completed then this is one greater | |
172 // than the number of round-trips needed for the handshake. | |
173 int GetNumSentClientHellos() const; | |
174 | |
175 // Returns true if |hostname| may be pooled onto this session. If this | |
176 // is a secure QUIC session, then |hostname| must match the certificate | |
177 // presented during the handshake. | |
178 bool CanPool(const std::string& hostname, PrivacyMode privacy_mode) const; | |
179 | |
180 const QuicServerId& server_id() const { return server_id_; } | |
181 | |
182 protected: | |
183 // QuicSession methods: | |
184 QuicDataStream* CreateIncomingDataStream(QuicStreamId id) override; | |
185 | |
186 private: | |
187 friend class test::QuicClientSessionPeer; | |
188 | |
189 typedef std::set<Observer*> ObserverSet; | |
190 typedef std::list<StreamRequest*> StreamRequestQueue; | |
191 | |
192 QuicReliableClientStream* CreateOutgoingReliableStreamImpl(); | |
193 // A completion callback invoked when a read completes. | |
194 void OnReadComplete(int result); | |
195 | |
196 void OnClosedStream(); | |
197 | |
198 // A Session may be closed via any of three methods: | |
199 // OnConnectionClosed - called by the connection when the connection has been | |
200 // closed, perhaps due to a timeout or a protocol error. | |
201 // CloseSessionOnError - called from the owner of the session, | |
202 // the QuicStreamFactory, when there is an error. | |
203 // OnReadComplete - when there is a read error. | |
204 // This method closes all stream and performs any necessary cleanup. | |
205 void CloseSessionOnErrorInner(int net_error, QuicErrorCode quic_error); | |
206 | |
207 void CloseAllStreams(int net_error); | |
208 void CloseAllObservers(int net_error); | |
209 | |
210 // Notifies the factory that this session is going away and no more streams | |
211 // should be created from it. This needs to be called before closing any | |
212 // streams, because closing a stream may cause a new stream to be created. | |
213 void NotifyFactoryOfSessionGoingAway(); | |
214 | |
215 // Posts a task to notify the factory that this session has been closed. | |
216 void NotifyFactoryOfSessionClosedLater(); | |
217 | |
218 // Notifies the factory that this session has been closed which will | |
219 // delete |this|. | |
220 void NotifyFactoryOfSessionClosed(); | |
221 | |
222 void OnConnectTimeout(); | |
223 | |
224 QuicServerId server_id_; | |
225 bool require_confirmation_; | |
226 scoped_ptr<QuicCryptoClientStream> crypto_stream_; | |
227 QuicStreamFactory* stream_factory_; | |
228 scoped_ptr<DatagramClientSocket> socket_; | |
229 scoped_refptr<IOBufferWithSize> read_buffer_; | |
230 TransportSecurityState* transport_security_state_; | |
231 scoped_ptr<QuicServerInfo> server_info_; | |
232 scoped_ptr<CertVerifyResult> cert_verify_result_; | |
233 std::string pinning_failure_log_; | |
234 ObserverSet observers_; | |
235 StreamRequestQueue stream_requests_; | |
236 bool read_pending_; | |
237 CompletionCallback callback_; | |
238 size_t num_total_streams_; | |
239 base::TaskRunner* task_runner_; | |
240 BoundNetLog net_log_; | |
241 base::TimeTicks handshake_start_; // Time the handshake was started. | |
242 QuicConnectionLogger* logger_; // Owned by |connection_|. | |
243 // Number of packets read in the current read loop. | |
244 size_t num_packets_read_; | |
245 // True when the session is going away, and streams may no longer be created | |
246 // on this session. Existing stream will continue to be processed. | |
247 bool going_away_; | |
248 base::WeakPtrFactory<QuicClientSession> weak_factory_; | |
249 | |
250 DISALLOW_COPY_AND_ASSIGN(QuicClientSession); | |
251 }; | |
252 | |
253 } // namespace net | |
254 | |
255 #endif // NET_QUIC_QUIC_CLIENT_SESSION_H_ | |
OLD | NEW |