xref: /aosp_15_r20/external/cronet/net/http/http_stream_request.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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