stream_socket.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_SOCKET_STREAM_SOCKET_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_SOCKET_STREAM_SOCKET_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/next_proto.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AddressList;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IPEndPoint;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLInfo;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE StreamSocket : public Socket {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~StreamSocket() {}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to establish a connection.  Returns OK if the connection could be
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // established synchronously.  Otherwise, ERR_IO_PENDING is returned and the
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // given callback will run asynchronously when the connection is established
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or when an error occurs.  The result is some other error code if the
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connection could not be established.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The socket's Read and Write methods may not be called until Connect
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // succeeds.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is valid to call Connect on an already connected socket, in which case
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OK is simply returned.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connect may also be called again after a call to the Disconnect method.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Connect(const CompletionCallback& callback) = 0;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to disconnect a socket.  Does nothing if the socket is already
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disconnected.  After calling Disconnect it is possible to call Connect
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // again to establish a new connection.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If IO (Connect, Read, or Write) is pending when the socket is
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disconnected, the pending IO is cancelled, and the completion callback
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will not be called.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Disconnect() = 0;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to test if the connection is still alive.  Returns false if a
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connection wasn't established or the connection is dead.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsConnected() const = 0;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to test if the connection is still alive and idle.  Returns false
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if a connection wasn't established, the connection is dead, or some data
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have been received.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsConnectedAndIdle() const = 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the peer address to |address| and returns a network error code.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ERR_SOCKET_NOT_CONNECTED will be returned if the socket is not connected.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sergeyu): Use IPEndPoint instead of AddressList.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetPeerAddress(IPEndPoint* address) const = 0;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the local address to |address| and returns a network error code.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ERR_SOCKET_NOT_CONNECTED will be returned if the socket is not bound.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetLocalAddress(IPEndPoint* address) const = 0;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the NetLog for this socket.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const BoundNetLog& NetLog() const = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the annotation to indicate this socket was created for speculative
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reasons.  This call is generally forwarded to a basic TCPClientSocket*,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // where a UseHistory can be updated.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSubresourceSpeculation() = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetOmniboxSpeculation() = 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the underlying transport socket ever had any reads or
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // writes.  StreamSockets layered on top of transport sockets should forward
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this call to the transport socket.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool WasEverUsed() const = 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the underlying transport socket is using TCP FastOpen.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TCP FastOpen is an experiment with sending data in the TCP SYN packet.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool UsingTCPFastOpen() const = 0;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of bytes successfully read from this socket.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int64 NumBytesRead() const = 0;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the connection setup time of this socket.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::TimeDelta GetConnectTimeMicros() const = 0;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if NPN was negotiated during the connection of this socket.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool WasNpnNegotiated() const = 0;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the protocol negotiated via NPN for this socket, or
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kProtoUnknown will be returned if NPN is not applicable.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NextProto GetNegotiatedProtocol() const = 0;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the SSL connection information of the socket.  Returns false if
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SSL was not used by this socket.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetSSLInfo(SSLInfo* ssl_info) = 0;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following class is only used to gather statistics about the history of
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a socket.  It is only instantiated and used in basic sockets, such as
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TCPClientSocket* instances.  Other classes that are derived from
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // StreamSocket should forward any potential settings to their underlying
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // transport sockets.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class UseHistory {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UseHistory();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~UseHistory();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Resets the state of UseHistory and emits histograms for the
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // current state.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Reset();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_was_ever_connected();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_was_used_to_convey_data();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The next two setters only have any impact if the socket has not yet been
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // used to transmit data.  If called later, we assume that the socket was
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // reused from the pool, and was NOT constructed to service a speculative
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // request.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_subresource_speculation();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_omnibox_speculation();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool was_used_to_convey_data() const;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Summarize the statistics for this socket.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void EmitPreconnectionHistograms() const;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indicate if this was ever connected.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool was_ever_connected_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indicate if this socket was ever used to transmit or receive data.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool was_used_to_convey_data_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indicate if this socket was first created for speculative use, and
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // identify the motivation.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool omnibox_speculation_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool subresource_speculation_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(UseHistory);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_SOCKET_STREAM_SOCKET_H_
147