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