• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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