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