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