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 // A QuicSession, which demuxes a single connection to individual streams. | 5 // A QuicSession, which demuxes a single connection to individual streams. |
6 | 6 |
7 #ifndef NET_QUIC_QUIC_SESSION_H_ | 7 #ifndef NET_QUIC_QUIC_SESSION_H_ |
8 #define NET_QUIC_QUIC_SESSION_H_ | 8 #define NET_QUIC_QUIC_SESSION_H_ |
9 | 9 |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
13 #include "base/containers/hash_tables.h" | 13 #include "base/containers/hash_tables.h" |
14 #include "net/base/ip_endpoint.h" | 14 #include "net/base/ip_endpoint.h" |
15 #include "net/base/linked_hash_map.h" | 15 #include "net/base/linked_hash_map.h" |
16 #include "net/quic/quic_connection.h" | 16 #include "net/quic/quic_connection.h" |
17 #include "net/quic/quic_crypto_stream.h" | 17 #include "net/quic/quic_crypto_stream.h" |
| 18 #include "net/quic/quic_data_stream.h" |
18 #include "net/quic/quic_packet_creator.h" | 19 #include "net/quic/quic_packet_creator.h" |
19 #include "net/quic/quic_protocol.h" | 20 #include "net/quic/quic_protocol.h" |
20 #include "net/quic/quic_spdy_compressor.h" | 21 #include "net/quic/quic_spdy_compressor.h" |
21 #include "net/quic/quic_spdy_decompressor.h" | 22 #include "net/quic/quic_spdy_decompressor.h" |
22 #include "net/quic/reliable_quic_stream.h" | 23 #include "net/quic/reliable_quic_stream.h" |
23 #include "net/spdy/write_blocked_list.h" | 24 #include "net/spdy/write_blocked_list.h" |
24 | 25 |
25 namespace net { | 26 namespace net { |
26 | 27 |
27 class QuicCryptoStream; | 28 class QuicCryptoStream; |
(...skipping 30 matching lines...) Expand all Loading... |
58 | 59 |
59 virtual ~QuicSession(); | 60 virtual ~QuicSession(); |
60 | 61 |
61 // QuicConnectionVisitorInterface methods: | 62 // QuicConnectionVisitorInterface methods: |
62 virtual bool OnStreamFrames( | 63 virtual bool OnStreamFrames( |
63 const std::vector<QuicStreamFrame>& frames) OVERRIDE; | 64 const std::vector<QuicStreamFrame>& frames) OVERRIDE; |
64 virtual void OnRstStream(const QuicRstStreamFrame& frame) OVERRIDE; | 65 virtual void OnRstStream(const QuicRstStreamFrame& frame) OVERRIDE; |
65 virtual void OnGoAway(const QuicGoAwayFrame& frame) OVERRIDE; | 66 virtual void OnGoAway(const QuicGoAwayFrame& frame) OVERRIDE; |
66 virtual void OnConnectionClosed(QuicErrorCode error, bool from_peer) OVERRIDE; | 67 virtual void OnConnectionClosed(QuicErrorCode error, bool from_peer) OVERRIDE; |
67 virtual void OnSuccessfulVersionNegotiation( | 68 virtual void OnSuccessfulVersionNegotiation( |
68 const QuicVersion& version) OVERRIDE{} | 69 const QuicVersion& version) OVERRIDE {} |
69 virtual void OnConfigNegotiated() OVERRIDE; | 70 virtual void OnConfigNegotiated() OVERRIDE; |
70 // Not needed for HTTP. | 71 // Not needed for HTTP. |
71 virtual bool OnCanWrite() OVERRIDE; | 72 virtual bool OnCanWrite() OVERRIDE; |
72 virtual bool HasPendingHandshake() const OVERRIDE; | 73 virtual bool HasPendingHandshake() const OVERRIDE; |
73 | 74 |
74 // Called by streams when they want to write data to the peer. | 75 // Called by streams when they want to write data to the peer. |
75 // Returns a pair with the number of bytes consumed from data, and a boolean | 76 // Returns a pair with the number of bytes consumed from data, and a boolean |
76 // indicating if the fin bit was consumed. This does not indicate the data | 77 // indicating if the fin bit was consumed. This does not indicate the data |
77 // has been sent on the wire: it may have been turned into a packet and queued | 78 // has been sent on the wire: it may have been turned into a packet and queued |
78 // if the socket was unexpectedly blocked. | 79 // if the socket was unexpectedly blocked. |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 QuicSpdyCompressor* compressor() { return &compressor_; } | 169 QuicSpdyCompressor* compressor() { return &compressor_; } |
169 | 170 |
170 // Gets the SSL connection information. | 171 // Gets the SSL connection information. |
171 virtual bool GetSSLInfo(SSLInfo* ssl_info); | 172 virtual bool GetSSLInfo(SSLInfo* ssl_info); |
172 | 173 |
173 QuicErrorCode error() const { return error_; } | 174 QuicErrorCode error() const { return error_; } |
174 | 175 |
175 bool is_server() const { return is_server_; } | 176 bool is_server() const { return is_server_; } |
176 | 177 |
177 protected: | 178 protected: |
| 179 typedef base::hash_map<QuicStreamId, QuicDataStream*> DataStreamMap; |
| 180 |
178 // Creates a new stream, owned by the caller, to handle a peer-initiated | 181 // Creates a new stream, owned by the caller, to handle a peer-initiated |
179 // stream. Returns NULL and does error handling if the stream can not be | 182 // stream. Returns NULL and does error handling if the stream can not be |
180 // created. | 183 // created. |
181 virtual ReliableQuicStream* CreateIncomingReliableStream(QuicStreamId id) = 0; | 184 virtual QuicDataStream* CreateIncomingDataStream(QuicStreamId id) = 0; |
182 | 185 |
183 // Create a new stream, owned by the caller, to handle a locally-initiated | 186 // Create a new stream, owned by the caller, to handle a locally-initiated |
184 // stream. Returns NULL if max streams have already been opened. | 187 // stream. Returns NULL if max streams have already been opened. |
185 virtual ReliableQuicStream* CreateOutgoingReliableStream() = 0; | 188 virtual QuicDataStream* CreateOutgoingDataStream() = 0; |
186 | 189 |
187 // Return the reserved crypto stream. | 190 // Return the reserved crypto stream. |
188 virtual QuicCryptoStream* GetCryptoStream() = 0; | 191 virtual QuicCryptoStream* GetCryptoStream() = 0; |
189 | 192 |
190 // Adds 'stream' to the active stream map. | 193 // Adds 'stream' to the active stream map. |
191 virtual void ActivateStream(ReliableQuicStream* stream); | 194 virtual void ActivateStream(QuicDataStream* stream); |
192 | 195 |
193 // Returns the stream id for a new stream. | 196 // Returns the stream id for a new stream. |
194 QuicStreamId GetNextStreamId(); | 197 QuicStreamId GetNextStreamId(); |
195 | 198 |
196 ReliableQuicStream* GetIncomingReliableStream(QuicStreamId stream_id); | 199 QuicDataStream* GetIncomingReliableStream(QuicStreamId stream_id); |
| 200 |
| 201 QuicDataStream* GetDataStream(const QuicStreamId stream_id); |
197 | 202 |
198 ReliableQuicStream* GetStream(const QuicStreamId stream_id); | 203 ReliableQuicStream* GetStream(const QuicStreamId stream_id); |
199 | 204 |
200 // This is called after every call other than OnConnectionClose from the | 205 // This is called after every call other than OnConnectionClose from the |
201 // QuicConnectionVisitor to allow post-processing once the work has been done. | 206 // QuicConnectionVisitor to allow post-processing once the work has been done. |
202 // In this case, it deletes streams given that it's safe to do so (no other | 207 // In this case, it deletes streams given that it's safe to do so (no other |
203 // operations are being done on the streams at this time) | 208 // operations are being done on the streams at this time) |
204 virtual void PostProcessAfterData(); | 209 virtual void PostProcessAfterData(); |
205 | 210 |
206 base::hash_map<QuicStreamId, ReliableQuicStream*>* streams() { | 211 base::hash_map<QuicStreamId, QuicDataStream*>* streams() { |
207 return &stream_map_; | 212 return &stream_map_; |
208 } | 213 } |
209 | 214 |
210 const base::hash_map<QuicStreamId, ReliableQuicStream*>* streams() const { | 215 const base::hash_map<QuicStreamId, QuicDataStream*>* streams() const { |
211 return &stream_map_; | 216 return &stream_map_; |
212 } | 217 } |
213 | 218 |
214 std::vector<ReliableQuicStream*>* closed_streams() { | 219 std::vector<QuicDataStream*>* closed_streams() { return &closed_streams_; } |
215 return &closed_streams_; | |
216 } | |
217 | 220 |
218 size_t get_max_open_streams() const { | 221 size_t get_max_open_streams() const { |
219 return max_open_streams_; | 222 return max_open_streams_; |
220 } | 223 } |
221 | 224 |
222 private: | 225 private: |
223 friend class test::QuicSessionPeer; | 226 friend class test::QuicSessionPeer; |
224 friend class VisitorShim; | 227 friend class VisitorShim; |
225 | 228 |
226 typedef base::hash_map<QuicStreamId, ReliableQuicStream*> ReliableStreamMap; | |
227 | |
228 // Performs the work required to close |stream_id|. If |locally_reset| | 229 // Performs the work required to close |stream_id|. If |locally_reset| |
229 // then the stream has been reset by this endpoint, not by the peer. This | 230 // then the stream has been reset by this endpoint, not by the peer. This |
230 // means the stream may become a zombie stream which needs to stay | 231 // means the stream may become a zombie stream which needs to stay |
231 // around until headers have been decompressed. | 232 // around until headers have been decompressed. |
232 void CloseStreamInner(QuicStreamId stream_id, bool locally_reset); | 233 void CloseStreamInner(QuicStreamId stream_id, bool locally_reset); |
233 | 234 |
234 // Adds |stream_id| to the zobmie stream map, closing the oldest | 235 // Adds |stream_id| to the zobmie stream map, closing the oldest |
235 // zombie stream if the set is full. | 236 // zombie stream if the set is full. |
236 void AddZombieStream(QuicStreamId stream_id); | 237 void AddZombieStream(QuicStreamId stream_id); |
237 | 238 |
(...skipping 15 matching lines...) Expand all Loading... |
253 // Streams which have been locally reset before decompressing headers | 254 // Streams which have been locally reset before decompressing headers |
254 // from the peer. These streams need to stay open long enough to | 255 // from the peer. These streams need to stay open long enough to |
255 // process any headers from the peer. | 256 // process any headers from the peer. |
256 // Ideally this would be a linked_hash_set as the boolean is unused. | 257 // Ideally this would be a linked_hash_set as the boolean is unused. |
257 linked_hash_map<QuicStreamId, bool> zombie_streams_; | 258 linked_hash_map<QuicStreamId, bool> zombie_streams_; |
258 | 259 |
259 // A shim to stand between the connection and the session, to handle stream | 260 // A shim to stand between the connection and the session, to handle stream |
260 // deletions. | 261 // deletions. |
261 scoped_ptr<VisitorShim> visitor_shim_; | 262 scoped_ptr<VisitorShim> visitor_shim_; |
262 | 263 |
263 std::vector<ReliableQuicStream*> closed_streams_; | 264 std::vector<QuicDataStream*> closed_streams_; |
264 | 265 |
265 QuicSpdyDecompressor decompressor_; | 266 QuicSpdyDecompressor decompressor_; |
266 QuicSpdyCompressor compressor_; | 267 QuicSpdyCompressor compressor_; |
267 | 268 |
268 QuicConfig config_; | 269 QuicConfig config_; |
269 | 270 |
270 // Returns the maximum number of streams this connection can open. | 271 // Returns the maximum number of streams this connection can open. |
271 size_t max_open_streams_; | 272 size_t max_open_streams_; |
272 | 273 |
273 // Map from StreamId to pointers to streams that are owned by the caller. | 274 // Map from StreamId to pointers to streams that are owned by the caller. |
274 ReliableStreamMap stream_map_; | 275 DataStreamMap stream_map_; |
275 QuicStreamId next_stream_id_; | 276 QuicStreamId next_stream_id_; |
276 bool is_server_; | 277 bool is_server_; |
277 | 278 |
278 // Set of stream ids that have been "implicitly created" by receipt | 279 // Set of stream ids that have been "implicitly created" by receipt |
279 // of a stream id larger than the next expected stream id. | 280 // of a stream id larger than the next expected stream id. |
280 base::hash_set<QuicStreamId> implicitly_created_streams_; | 281 base::hash_set<QuicStreamId> implicitly_created_streams_; |
281 | 282 |
282 // A list of streams which need to write more data. | 283 // A list of streams which need to write more data. |
283 WriteBlockedList<QuicStreamId> write_blocked_streams_; | 284 WriteBlockedList<QuicStreamId> write_blocked_streams_; |
284 | 285 |
(...skipping 13 matching lines...) Expand all Loading... |
298 | 299 |
299 // Indicate if there is pending data for the crypto stream. | 300 // Indicate if there is pending data for the crypto stream. |
300 bool has_pending_handshake_; | 301 bool has_pending_handshake_; |
301 | 302 |
302 DISALLOW_COPY_AND_ASSIGN(QuicSession); | 303 DISALLOW_COPY_AND_ASSIGN(QuicSession); |
303 }; | 304 }; |
304 | 305 |
305 } // namespace net | 306 } // namespace net |
306 | 307 |
307 #endif // NET_QUIC_QUIC_SESSION_H_ | 308 #endif // NET_QUIC_QUIC_SESSION_H_ |
OLD | NEW |