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