xref: /aosp_15_r20/external/cronet/net/spdy/spdy_http_utils.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_SPDY_SPDY_HTTP_UTILS_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SPDY_SPDY_HTTP_UTILS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <optional>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/types/expected.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h"
17*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker namespace net {
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker class HttpResponseInfo;
22*6777b538SAndroid Build Coastguard Worker struct HttpRequestInfo;
23*6777b538SAndroid Build Coastguard Worker class HttpRequestHeaders;
24*6777b538SAndroid Build Coastguard Worker class HttpResponseHeaders;
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker // HTTP Extensible Priorities header (in lowercase HTTP2/3).
27*6777b538SAndroid Build Coastguard Worker // RFC 9218.
28*6777b538SAndroid Build Coastguard Worker NET_EXPORT extern const char* const kHttp2PriorityHeader;
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker // Convert a spdy::Http2HeaderBlock into an HttpResponseInfo with some checks.
31*6777b538SAndroid Build Coastguard Worker // `headers` input parameter with the spdy::Http2HeaderBlock.
32*6777b538SAndroid Build Coastguard Worker // `response` output parameter for the HttpResponseInfo.
33*6777b538SAndroid Build Coastguard Worker // Returns OK if successfully converted.  An error is returned if the
34*6777b538SAndroid Build Coastguard Worker // spdy::Http2HeaderBlock is incomplete (e.g. missing 'status' or 'version') or
35*6777b538SAndroid Build Coastguard Worker // checks fail.
36*6777b538SAndroid Build Coastguard Worker NET_EXPORT int SpdyHeadersToHttpResponse(const spdy::Http2HeaderBlock& headers,
37*6777b538SAndroid Build Coastguard Worker                                          HttpResponseInfo* response);
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker // Converts a spdy::Http2HeaderBlock object into an HttpResponseHeaders object
40*6777b538SAndroid Build Coastguard Worker // by creating a string with embedded nul bytes instead of newlines and then
41*6777b538SAndroid Build Coastguard Worker // parsing it to the HttpResponseHeaders constructor to be parsed. Exposed for
42*6777b538SAndroid Build Coastguard Worker // testing.
43*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/1485670): Remove this once it is no longer needed.
44*6777b538SAndroid Build Coastguard Worker NET_EXPORT_PRIVATE base::expected<scoped_refptr<HttpResponseHeaders>, int>
45*6777b538SAndroid Build Coastguard Worker SpdyHeadersToHttpResponseHeadersUsingRawString(
46*6777b538SAndroid Build Coastguard Worker     const spdy::Http2HeaderBlock& headers);
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker // Converts a spdy::Http2HeaderBlock object into an HttpResponseHeaders object
49*6777b538SAndroid Build Coastguard Worker // by using the HttpResponseHeaders::Builder API. Exposed for testing.
50*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/1485670): Merge this back into
51*6777b538SAndroid Build Coastguard Worker // SpdyHeadersToHttpResponse() when
52*6777b538SAndroid Build Coastguard Worker // SpdyHeadersToHttpResponseHeadersUsingRawString() is removed.
53*6777b538SAndroid Build Coastguard Worker NET_EXPORT_PRIVATE base::expected<scoped_refptr<HttpResponseHeaders>, int>
54*6777b538SAndroid Build Coastguard Worker SpdyHeadersToHttpResponseHeadersUsingBuilder(
55*6777b538SAndroid Build Coastguard Worker     const spdy::Http2HeaderBlock& headers);
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker // Create a spdy::Http2HeaderBlock from HttpRequestInfo and
58*6777b538SAndroid Build Coastguard Worker // HttpRequestHeaders.
59*6777b538SAndroid Build Coastguard Worker NET_EXPORT void CreateSpdyHeadersFromHttpRequest(
60*6777b538SAndroid Build Coastguard Worker     const HttpRequestInfo& info,
61*6777b538SAndroid Build Coastguard Worker     std::optional<RequestPriority> priority,
62*6777b538SAndroid Build Coastguard Worker     const HttpRequestHeaders& request_headers,
63*6777b538SAndroid Build Coastguard Worker     spdy::Http2HeaderBlock* headers);
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker // Create a spdy::Http2HeaderBlock from HttpRequestInfo and
66*6777b538SAndroid Build Coastguard Worker // HttpRequestHeaders, with the given protocol for extended CONNECT.
67*6777b538SAndroid Build Coastguard Worker // The request's method must be `CONNECT`.
68*6777b538SAndroid Build Coastguard Worker NET_EXPORT void CreateSpdyHeadersFromHttpRequestForExtendedConnect(
69*6777b538SAndroid Build Coastguard Worker     const HttpRequestInfo& info,
70*6777b538SAndroid Build Coastguard Worker     std::optional<RequestPriority> priority,
71*6777b538SAndroid Build Coastguard Worker     const std::string& ext_connect_protocol,
72*6777b538SAndroid Build Coastguard Worker     const HttpRequestHeaders& request_headers,
73*6777b538SAndroid Build Coastguard Worker     spdy::Http2HeaderBlock* headers);
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker // Create a spdy::Http2HeaderBlock from HttpRequestInfo and HttpRequestHeaders
76*6777b538SAndroid Build Coastguard Worker // for a WebSockets over HTTP/2 request.
77*6777b538SAndroid Build Coastguard Worker NET_EXPORT void CreateSpdyHeadersFromHttpRequestForWebSocket(
78*6777b538SAndroid Build Coastguard Worker     const GURL& url,
79*6777b538SAndroid Build Coastguard Worker     const HttpRequestHeaders& request_headers,
80*6777b538SAndroid Build Coastguard Worker     spdy::Http2HeaderBlock* headers);
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker // Create HttpRequestHeaders from spdy::Http2HeaderBlock.
83*6777b538SAndroid Build Coastguard Worker NET_EXPORT void ConvertHeaderBlockToHttpRequestHeaders(
84*6777b538SAndroid Build Coastguard Worker     const spdy::Http2HeaderBlock& spdy_headers,
85*6777b538SAndroid Build Coastguard Worker     HttpRequestHeaders* http_headers);
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker NET_EXPORT spdy::SpdyPriority ConvertRequestPriorityToSpdyPriority(
88*6777b538SAndroid Build Coastguard Worker     RequestPriority priority);
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker NET_EXPORT RequestPriority
91*6777b538SAndroid Build Coastguard Worker ConvertSpdyPriorityToRequestPriority(spdy::SpdyPriority priority);
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker }  // namespace net
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker #endif  // NET_SPDY_SPDY_HTTP_UTILS_H_
96