quic_client_session.h revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/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) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Close the session because of |error|. 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CloseSessionOnError(int error); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* GetInfoAsValue(const HostPortPair& pair) const; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BoundNetLog& net_log() const { return net_log_; } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // QuicSession methods: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ReliableQuicStream* CreateIncomingReliableStream( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamId id) OVERRIDE; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class test::QuicClientSessionPeer; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A completion callback invoked when a read completes. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnReadComplete(int result); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<QuicClientSession> weak_factory_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<QuicCryptoClientStream> crypto_stream_; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamFactory* stream_factory_; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DatagramClientSocket> socket_; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<IOBufferWithSize> read_buffer_; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool read_pending_; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompletionCallback callback_; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t num_total_streams_; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoundNetLog net_log_; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicConnectionLogger logger_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QuicClientSession); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_QUIC_QUIC_CLIENT_SESSION_H_ 99