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