1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_HTTP_HTTP_STREAM_REQUEST_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_HTTP_HTTP_STREAM_REQUEST_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 11*6777b538SAndroid Build Coastguard Worker #include "net/base/load_states.h" 12*6777b538SAndroid Build Coastguard Worker #include "net/base/net_error_details.h" 13*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 14*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/http/http_response_info.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_source.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/proxy_resolution/proxy_info.h" 19*6777b538SAndroid Build Coastguard Worker #include "net/socket/connection_attempts.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/socket/next_proto.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/spdy/spdy_session_key.h" 22*6777b538SAndroid Build Coastguard Worker #include "net/spdy/spdy_session_pool.h" 23*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_config.h" 24*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_info.h" 25*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_handshake_stream_base.h" 26*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h" 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker namespace net { 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker class BidirectionalStreamImpl; 31*6777b538SAndroid Build Coastguard Worker class HttpAuthController; 32*6777b538SAndroid Build Coastguard Worker class HttpStream; 33*6777b538SAndroid Build Coastguard Worker class SSLCertRequestInfo; 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // The HttpStreamRequest is the client's handle to the worker object which 36*6777b538SAndroid Build Coastguard Worker // handles the creation of an HttpStream. While the HttpStream is being 37*6777b538SAndroid Build Coastguard Worker // created, this object is the creator's handle for interacting with the 38*6777b538SAndroid Build Coastguard Worker // HttpStream creation process. The request is cancelled by deleting it, after 39*6777b538SAndroid Build Coastguard Worker // which no callbacks will be invoked. 40*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE HttpStreamRequest { 41*6777b538SAndroid Build Coastguard Worker public: 42*6777b538SAndroid Build Coastguard Worker // Indicates which type of stream is requested. 43*6777b538SAndroid Build Coastguard Worker enum StreamType { 44*6777b538SAndroid Build Coastguard Worker BIDIRECTIONAL_STREAM, 45*6777b538SAndroid Build Coastguard Worker HTTP_STREAM, 46*6777b538SAndroid Build Coastguard Worker }; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // The HttpStreamRequest::Delegate is a set of callback methods for a 49*6777b538SAndroid Build Coastguard Worker // HttpStreamRequestJob. Generally, only one of these methods will be 50*6777b538SAndroid Build Coastguard Worker // called as a result of a stream request. 51*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE Delegate { 52*6777b538SAndroid Build Coastguard Worker public: 53*6777b538SAndroid Build Coastguard Worker virtual ~Delegate() = default; 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // This is the success case for RequestStream. 56*6777b538SAndroid Build Coastguard Worker // |stream| is now owned by the delegate. 57*6777b538SAndroid Build Coastguard Worker // |used_proxy_info| indicates the actual ProxyInfo used for this stream, 58*6777b538SAndroid Build Coastguard Worker // since the HttpStreamRequest performs the proxy resolution. 59*6777b538SAndroid Build Coastguard Worker virtual void OnStreamReady(const ProxyInfo& used_proxy_info, 60*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HttpStream> stream) = 0; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // This is the success case for RequestWebSocketHandshakeStream. 63*6777b538SAndroid Build Coastguard Worker // |stream| is now owned by the delegate. 64*6777b538SAndroid Build Coastguard Worker // |used_proxy_info| indicates the actual ProxyInfo used for this stream, 65*6777b538SAndroid Build Coastguard Worker // since the HttpStreamRequest performs the proxy resolution. 66*6777b538SAndroid Build Coastguard Worker virtual void OnWebSocketHandshakeStreamReady( 67*6777b538SAndroid Build Coastguard Worker const ProxyInfo& used_proxy_info, 68*6777b538SAndroid Build Coastguard Worker std::unique_ptr<WebSocketHandshakeStreamBase> stream) = 0; 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker virtual void OnBidirectionalStreamImplReady( 71*6777b538SAndroid Build Coastguard Worker const ProxyInfo& used_proxy_info, 72*6777b538SAndroid Build Coastguard Worker std::unique_ptr<BidirectionalStreamImpl> stream) = 0; 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker // This is the failure to create a stream case. 75*6777b538SAndroid Build Coastguard Worker // |used_proxy_info| indicates the actual ProxyInfo used for this stream, 76*6777b538SAndroid Build Coastguard Worker // since the HttpStreamRequest performs the proxy resolution. 77*6777b538SAndroid Build Coastguard Worker virtual void OnStreamFailed(int status, 78*6777b538SAndroid Build Coastguard Worker const NetErrorDetails& net_error_details, 79*6777b538SAndroid Build Coastguard Worker const ProxyInfo& used_proxy_info, 80*6777b538SAndroid Build Coastguard Worker ResolveErrorInfo resolve_error_info) = 0; 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker // Called when we have a certificate error for the request. 83*6777b538SAndroid Build Coastguard Worker virtual void OnCertificateError(int status, const SSLInfo& ssl_info) = 0; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // This is the failure case where we need proxy authentication during 86*6777b538SAndroid Build Coastguard Worker // proxy tunnel establishment. For the tunnel case, we were unable to 87*6777b538SAndroid Build Coastguard Worker // create the HttpStream, so the caller provides the auth and then resumes 88*6777b538SAndroid Build Coastguard Worker // the HttpStreamRequest. 89*6777b538SAndroid Build Coastguard Worker // 90*6777b538SAndroid Build Coastguard Worker // For the non-tunnel case, the caller will discover the authentication 91*6777b538SAndroid Build Coastguard Worker // failure when reading response headers. At that point, it will handle the 92*6777b538SAndroid Build Coastguard Worker // authentication failure and restart the HttpStreamRequest entirely. 93*6777b538SAndroid Build Coastguard Worker // 94*6777b538SAndroid Build Coastguard Worker // Ownership of |auth_controller| and |proxy_response| are owned 95*6777b538SAndroid Build Coastguard Worker // by the HttpStreamRequest. |proxy_response| is not guaranteed to be usable 96*6777b538SAndroid Build Coastguard Worker // after the lifetime of this callback. The delegate may take a reference 97*6777b538SAndroid Build Coastguard Worker // to |auth_controller| if it is needed beyond the lifetime of this 98*6777b538SAndroid Build Coastguard Worker // callback. 99*6777b538SAndroid Build Coastguard Worker virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response, 100*6777b538SAndroid Build Coastguard Worker const ProxyInfo& used_proxy_info, 101*6777b538SAndroid Build Coastguard Worker HttpAuthController* auth_controller) = 0; 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // This is the failure for SSL Client Auth 104*6777b538SAndroid Build Coastguard Worker // Ownership of |cert_info| is retained by the HttpStreamRequest. The 105*6777b538SAndroid Build Coastguard Worker // delegate may take a reference if it needs the cert_info beyond the 106*6777b538SAndroid Build Coastguard Worker // lifetime of this callback. 107*6777b538SAndroid Build Coastguard Worker virtual void OnNeedsClientAuth(SSLCertRequestInfo* cert_info) = 0; 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker // Called when finding all QUIC alternative services are marked broken for 110*6777b538SAndroid Build Coastguard Worker // the origin in this request which advertises supporting QUIC. 111*6777b538SAndroid Build Coastguard Worker virtual void OnQuicBroken() = 0; 112*6777b538SAndroid Build Coastguard Worker }; 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE Helper { 115*6777b538SAndroid Build Coastguard Worker public: 116*6777b538SAndroid Build Coastguard Worker virtual ~Helper() = default; 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker // Returns the LoadState for Request. 119*6777b538SAndroid Build Coastguard Worker virtual LoadState GetLoadState() const = 0; 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker // Called when Request is destructed. 122*6777b538SAndroid Build Coastguard Worker virtual void OnRequestComplete() = 0; 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker // Called to resume the HttpStream creation process when necessary 125*6777b538SAndroid Build Coastguard Worker // Proxy authentication credentials are collected. 126*6777b538SAndroid Build Coastguard Worker virtual int RestartTunnelWithProxyAuth() = 0; 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker // Called when the priority of transaction changes. 129*6777b538SAndroid Build Coastguard Worker virtual void SetPriority(RequestPriority priority) = 0; 130*6777b538SAndroid Build Coastguard Worker }; 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Worker // Request will notify |job_controller| when it's destructed. 133*6777b538SAndroid Build Coastguard Worker // Thus |job_controller| is valid for the lifetime of the |this| Request. 134*6777b538SAndroid Build Coastguard Worker HttpStreamRequest(Helper* helper, 135*6777b538SAndroid Build Coastguard Worker HttpStreamRequest::Delegate* delegate, 136*6777b538SAndroid Build Coastguard Worker WebSocketHandshakeStreamBase::CreateHelper* 137*6777b538SAndroid Build Coastguard Worker websocket_handshake_stream_create_helper, 138*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 139*6777b538SAndroid Build Coastguard Worker StreamType stream_type); 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Worker HttpStreamRequest(const HttpStreamRequest&) = delete; 142*6777b538SAndroid Build Coastguard Worker HttpStreamRequest& operator=(const HttpStreamRequest&) = delete; 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker ~HttpStreamRequest(); 145*6777b538SAndroid Build Coastguard Worker 146*6777b538SAndroid Build Coastguard Worker // When a HttpStream creation process is stalled due to necessity 147*6777b538SAndroid Build Coastguard Worker // of Proxy authentication credentials, the delegate OnNeedsProxyAuth 148*6777b538SAndroid Build Coastguard Worker // will have been called. It now becomes the delegate's responsibility 149*6777b538SAndroid Build Coastguard Worker // to collect the necessary credentials, and then call this method to 150*6777b538SAndroid Build Coastguard Worker // resume the HttpStream creation process. 151*6777b538SAndroid Build Coastguard Worker int RestartTunnelWithProxyAuth(); 152*6777b538SAndroid Build Coastguard Worker 153*6777b538SAndroid Build Coastguard Worker // Called when the priority of the parent transaction changes. 154*6777b538SAndroid Build Coastguard Worker void SetPriority(RequestPriority priority); 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker // Marks completion of the request. Must be called before OnStreamReady(). 157*6777b538SAndroid Build Coastguard Worker void Complete(NextProto negotiated_protocol, 158*6777b538SAndroid Build Coastguard Worker AlternateProtocolUsage alternate_protocol_usage); 159*6777b538SAndroid Build Coastguard Worker 160*6777b538SAndroid Build Coastguard Worker // Called by |helper_| to record connection attempts made by the socket 161*6777b538SAndroid Build Coastguard Worker // layer in an attached Job for this stream request. 162*6777b538SAndroid Build Coastguard Worker void AddConnectionAttempts(const ConnectionAttempts& attempts); 163*6777b538SAndroid Build Coastguard Worker 164*6777b538SAndroid Build Coastguard Worker // Returns the LoadState for the request. 165*6777b538SAndroid Build Coastguard Worker LoadState GetLoadState() const; 166*6777b538SAndroid Build Coastguard Worker 167*6777b538SAndroid Build Coastguard Worker // Protocol negotiated with the server. 168*6777b538SAndroid Build Coastguard Worker NextProto negotiated_protocol() const; 169*6777b538SAndroid Build Coastguard Worker 170*6777b538SAndroid Build Coastguard Worker // The reason why Chrome uses a specific transport protocol for HTTP 171*6777b538SAndroid Build Coastguard Worker // semantics. 172*6777b538SAndroid Build Coastguard Worker AlternateProtocolUsage alternate_protocol_usage() const; 173*6777b538SAndroid Build Coastguard Worker 174*6777b538SAndroid Build Coastguard Worker // Returns socket-layer connection attempts made for this stream request. 175*6777b538SAndroid Build Coastguard Worker const ConnectionAttempts& connection_attempts() const; 176*6777b538SAndroid Build Coastguard Worker 177*6777b538SAndroid Build Coastguard Worker // Returns the WebSocketHandshakeStreamBase::CreateHelper for this stream 178*6777b538SAndroid Build Coastguard Worker // request. 179*6777b538SAndroid Build Coastguard Worker WebSocketHandshakeStreamBase::CreateHelper* 180*6777b538SAndroid Build Coastguard Worker websocket_handshake_stream_create_helper() const; 181*6777b538SAndroid Build Coastguard Worker net_log()182*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log() const { return net_log_; } 183*6777b538SAndroid Build Coastguard Worker stream_type()184*6777b538SAndroid Build Coastguard Worker StreamType stream_type() const { return stream_type_; } 185*6777b538SAndroid Build Coastguard Worker completed()186*6777b538SAndroid Build Coastguard Worker bool completed() const { return completed_; } 187*6777b538SAndroid Build Coastguard Worker 188*6777b538SAndroid Build Coastguard Worker private: 189*6777b538SAndroid Build Coastguard Worker // Unowned. The helper must not be destroyed before this object is. 190*6777b538SAndroid Build Coastguard Worker raw_ptr<Helper> helper_; 191*6777b538SAndroid Build Coastguard Worker 192*6777b538SAndroid Build Coastguard Worker const raw_ptr<WebSocketHandshakeStreamBase::CreateHelper> 193*6777b538SAndroid Build Coastguard Worker websocket_handshake_stream_create_helper_; 194*6777b538SAndroid Build Coastguard Worker const NetLogWithSource net_log_; 195*6777b538SAndroid Build Coastguard Worker 196*6777b538SAndroid Build Coastguard Worker bool completed_ = false; 197*6777b538SAndroid Build Coastguard Worker // Protocol negotiated with the server. 198*6777b538SAndroid Build Coastguard Worker NextProto negotiated_protocol_ = kProtoUnknown; 199*6777b538SAndroid Build Coastguard Worker // The reason why Chrome uses a specific transport protocol for HTTP 200*6777b538SAndroid Build Coastguard Worker // semantics. 201*6777b538SAndroid Build Coastguard Worker AlternateProtocolUsage alternate_protocol_usage_ = 202*6777b538SAndroid Build Coastguard Worker AlternateProtocolUsage::ALTERNATE_PROTOCOL_USAGE_UNSPECIFIED_REASON; 203*6777b538SAndroid Build Coastguard Worker ConnectionAttempts connection_attempts_; 204*6777b538SAndroid Build Coastguard Worker const StreamType stream_type_; 205*6777b538SAndroid Build Coastguard Worker }; 206*6777b538SAndroid Build Coastguard Worker 207*6777b538SAndroid Build Coastguard Worker } // namespace net 208*6777b538SAndroid Build Coastguard Worker 209*6777b538SAndroid Build Coastguard Worker #endif // NET_HTTP_HTTP_STREAM_REQUEST_H_ 210