quic_client_session.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A client specific QuicSession subclass. This class owns the underlying 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// QuicConnection and QuicConnectionHelper objects. The connection stores 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a non-owning pointer to the helper so this session needs to ensure that 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the helper outlives the connection. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_QUIC_QUIC_CLIENT_SESSION_H_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_QUIC_QUIC_CLIENT_SESSION_H_ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/completion_callback.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_connection_logger.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_crypto_client_stream.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_reliable_client_stream.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_session.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DatagramClientSocket; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicConnectionHelper; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicCryptoClientStreamFactory; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicStreamFactory; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace test { 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class QuicClientSessionPeer; 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace test 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicClientSession : public QuicSession { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Constructs a new session which will own |connection| and |helper|, but 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not |stream_factory|, which must outlive this session. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(rch): decouple the factory from the session via a Delegate interface. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicClientSession(QuicConnection* connection, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DatagramClientSocket* socket, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamFactory* stream_factory, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicCryptoClientStreamFactory* crypto_client_stream_factory, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& server_hostname, 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const QuicConfig& config, 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicCryptoClientConfig* crypto_config, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog* net_log); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~QuicClientSession(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // QuicSession methods: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual QuicReliableClientStream* CreateOutgoingReliableStream() OVERRIDE; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual QuicCryptoClientStream* GetCryptoStream() OVERRIDE; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CloseStream(QuicStreamId stream_id) OVERRIDE; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) OVERRIDE; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // QuicConnectionVisitorInterface methods: 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ConnectionClose(QuicErrorCode error, bool from_peer) OVERRIDE; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Performs a crypto handshake with the server. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int CryptoConnect(const CompletionCallback& callback); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Causes the QuicConnectionHelper to start reading from the socket 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and passing the data along to the QuicConnection. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartReading(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Close the session because of |error| and notifies the factory 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // that this session has been closed, which will delete the session. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CloseSessionOnError(int error); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* GetInfoAsValue(const HostPortPair& pair) const; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BoundNetLog& net_log() const { return net_log_; } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // QuicSession methods: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ReliableQuicStream* CreateIncomingReliableStream( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamId id) OVERRIDE; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class test::QuicClientSessionPeer; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A completion callback invoked when a read completes. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnReadComplete(int result); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void CloseSessionOnErrorInner(int error); 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Posts a task to notify the factory that this session has been closed. 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void NotifyFactoryOfSessionCloseLater(); 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Notifies the factory that this session has been closed which will 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // delete |this|. 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void NotifyFactoryOfSessionClose(); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<QuicClientSession> weak_factory_; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<QuicCryptoClientStream> crypto_stream_; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamFactory* stream_factory_; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DatagramClientSocket> socket_; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<IOBufferWithSize> read_buffer_; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool read_pending_; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompletionCallback callback_; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t num_total_streams_; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoundNetLog net_log_; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicConnectionLogger logger_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QuicClientSession); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_QUIC_QUIC_CLIENT_SESSION_H_ 109