xref: /aosp_15_r20/external/cronet/net/http/http_request_headers.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 // HttpRequestHeaders manages the request headers.
6*6777b538SAndroid Build Coastguard Worker // It maintains these in a vector of header key/value pairs, thereby maintaining
7*6777b538SAndroid Build Coastguard Worker // the order of the headers.  This means that any lookups are linear time
8*6777b538SAndroid Build Coastguard Worker // operations.
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #ifndef NET_HTTP_HTTP_REQUEST_HEADERS_H_
11*6777b538SAndroid Build Coastguard Worker #define NET_HTTP_HTTP_REQUEST_HEADERS_H_
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include <memory>
14*6777b538SAndroid Build Coastguard Worker #include <optional>
15*6777b538SAndroid Build Coastguard Worker #include <string>
16*6777b538SAndroid Build Coastguard Worker #include <string_view>
17*6777b538SAndroid Build Coastguard Worker #include <vector>
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker #include "base/containers/flat_set.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/filter/source_stream.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_capture_mode.h"
24*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace net {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker class NET_EXPORT HttpRequestHeaders {
29*6777b538SAndroid Build Coastguard Worker  public:
30*6777b538SAndroid Build Coastguard Worker   struct NET_EXPORT HeaderKeyValuePair {
31*6777b538SAndroid Build Coastguard Worker     HeaderKeyValuePair();
32*6777b538SAndroid Build Coastguard Worker     HeaderKeyValuePair(std::string_view key, std::string_view value);
33*6777b538SAndroid Build Coastguard Worker     HeaderKeyValuePair(std::string_view key, std::string&& value);
34*6777b538SAndroid Build Coastguard Worker     // Inline to take advantage of the std::string_view constructor being
35*6777b538SAndroid Build Coastguard Worker     // constexpr.
HeaderKeyValuePairHeaderKeyValuePair36*6777b538SAndroid Build Coastguard Worker     HeaderKeyValuePair(std::string_view key, const char* value)
37*6777b538SAndroid Build Coastguard Worker         : HeaderKeyValuePair(key, std::string_view(value)) {}
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker     std::string key;
40*6777b538SAndroid Build Coastguard Worker     std::string value;
41*6777b538SAndroid Build Coastguard Worker   };
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker   typedef std::vector<HeaderKeyValuePair> HeaderVector;
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   class NET_EXPORT Iterator {
46*6777b538SAndroid Build Coastguard Worker    public:
47*6777b538SAndroid Build Coastguard Worker     explicit Iterator(const HttpRequestHeaders& headers);
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker     Iterator(const Iterator&) = delete;
50*6777b538SAndroid Build Coastguard Worker     Iterator& operator=(const Iterator&) = delete;
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker     ~Iterator();
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker     // Advances the iterator to the next header, if any.  Returns true if there
55*6777b538SAndroid Build Coastguard Worker     // is a next header.  Use name() and value() methods to access the resultant
56*6777b538SAndroid Build Coastguard Worker     // header name and value.
57*6777b538SAndroid Build Coastguard Worker     bool GetNext();
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker     // These two accessors are only valid if GetNext() returned true.
name()60*6777b538SAndroid Build Coastguard Worker     const std::string& name() const { return curr_->key; }
value()61*6777b538SAndroid Build Coastguard Worker     const std::string& value() const { return curr_->value; }
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker    private:
64*6777b538SAndroid Build Coastguard Worker     bool started_ = false;
65*6777b538SAndroid Build Coastguard Worker     HttpRequestHeaders::HeaderVector::const_iterator curr_;
66*6777b538SAndroid Build Coastguard Worker     const HttpRequestHeaders::HeaderVector::const_iterator end_;
67*6777b538SAndroid Build Coastguard Worker   };
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker   static const char kConnectMethod[];
70*6777b538SAndroid Build Coastguard Worker   static const char kDeleteMethod[];
71*6777b538SAndroid Build Coastguard Worker   static const char kGetMethod[];
72*6777b538SAndroid Build Coastguard Worker   static const char kHeadMethod[];
73*6777b538SAndroid Build Coastguard Worker   static const char kOptionsMethod[];
74*6777b538SAndroid Build Coastguard Worker   static const char kPatchMethod[];
75*6777b538SAndroid Build Coastguard Worker   static const char kPostMethod[];
76*6777b538SAndroid Build Coastguard Worker   static const char kPutMethod[];
77*6777b538SAndroid Build Coastguard Worker   static const char kTraceMethod[];
78*6777b538SAndroid Build Coastguard Worker   static const char kTrackMethod[];
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker   static const char kAccept[];
81*6777b538SAndroid Build Coastguard Worker   static const char kAcceptCharset[];
82*6777b538SAndroid Build Coastguard Worker   static const char kAcceptEncoding[];
83*6777b538SAndroid Build Coastguard Worker   static const char kAcceptLanguage[];
84*6777b538SAndroid Build Coastguard Worker   static const char kAuthorization[];
85*6777b538SAndroid Build Coastguard Worker   static const char kCacheControl[];
86*6777b538SAndroid Build Coastguard Worker   static const char kConnection[];
87*6777b538SAndroid Build Coastguard Worker   static const char kContentType[];
88*6777b538SAndroid Build Coastguard Worker   static const char kCookie[];
89*6777b538SAndroid Build Coastguard Worker   static const char kContentLength[];
90*6777b538SAndroid Build Coastguard Worker   static const char kHost[];
91*6777b538SAndroid Build Coastguard Worker   static const char kIfMatch[];
92*6777b538SAndroid Build Coastguard Worker   static const char kIfModifiedSince[];
93*6777b538SAndroid Build Coastguard Worker   static const char kIfNoneMatch[];
94*6777b538SAndroid Build Coastguard Worker   static const char kIfRange[];
95*6777b538SAndroid Build Coastguard Worker   static const char kIfUnmodifiedSince[];
96*6777b538SAndroid Build Coastguard Worker   static const char kOrigin[];
97*6777b538SAndroid Build Coastguard Worker   static const char kPragma[];
98*6777b538SAndroid Build Coastguard Worker   static const char kPriority[];
99*6777b538SAndroid Build Coastguard Worker   static const char kProxyAuthorization[];
100*6777b538SAndroid Build Coastguard Worker   static const char kProxyConnection[];
101*6777b538SAndroid Build Coastguard Worker   static const char kRange[];
102*6777b538SAndroid Build Coastguard Worker   static const char kReferer[];
103*6777b538SAndroid Build Coastguard Worker   static const char kTransferEncoding[];
104*6777b538SAndroid Build Coastguard Worker   static const char kUserAgent[];
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   HttpRequestHeaders();
107*6777b538SAndroid Build Coastguard Worker   HttpRequestHeaders(const HttpRequestHeaders& other);
108*6777b538SAndroid Build Coastguard Worker   HttpRequestHeaders(HttpRequestHeaders&& other);
109*6777b538SAndroid Build Coastguard Worker   ~HttpRequestHeaders();
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   HttpRequestHeaders& operator=(const HttpRequestHeaders& other);
112*6777b538SAndroid Build Coastguard Worker   HttpRequestHeaders& operator=(HttpRequestHeaders&& other);
113*6777b538SAndroid Build Coastguard Worker 
IsEmpty()114*6777b538SAndroid Build Coastguard Worker   bool IsEmpty() const { return headers_.empty(); }
115*6777b538SAndroid Build Coastguard Worker 
HasHeader(std::string_view key)116*6777b538SAndroid Build Coastguard Worker   bool HasHeader(std::string_view key) const {
117*6777b538SAndroid Build Coastguard Worker     return FindHeader(key) != headers_.end();
118*6777b538SAndroid Build Coastguard Worker   }
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker   // Gets the first header that matches |key|.  If found, returns true and
121*6777b538SAndroid Build Coastguard Worker   // writes the value to |out|.
122*6777b538SAndroid Build Coastguard Worker   bool GetHeader(std::string_view key, std::string* out) const;
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker   // Clears all the headers.
125*6777b538SAndroid Build Coastguard Worker   void Clear();
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker   // Sets the header value pair for |key| and |value|.  If |key| already exists,
128*6777b538SAndroid Build Coastguard Worker   // then the header value is modified, but the key is untouched, and the order
129*6777b538SAndroid Build Coastguard Worker   // in the vector remains the same.  When comparing |key|, case is ignored.
130*6777b538SAndroid Build Coastguard Worker   // The caller must ensure that |key| passes HttpUtil::IsValidHeaderName() and
131*6777b538SAndroid Build Coastguard Worker   // |value| passes HttpUtil::IsValidHeaderValue().
132*6777b538SAndroid Build Coastguard Worker   void SetHeader(std::string_view key, std::string_view value);
133*6777b538SAndroid Build Coastguard Worker   void SetHeader(std::string_view key, std::string&& value);
134*6777b538SAndroid Build Coastguard Worker   // Inline to take advantage of the std::string_view constructor being
135*6777b538SAndroid Build Coastguard Worker   // constexpr.
SetHeader(std::string_view key,const char * value)136*6777b538SAndroid Build Coastguard Worker   void SetHeader(std::string_view key, const char* value) {
137*6777b538SAndroid Build Coastguard Worker     SetHeader(key, std::string_view(value));
138*6777b538SAndroid Build Coastguard Worker   }
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   // Does the same as above but without internal DCHECKs for validations.
141*6777b538SAndroid Build Coastguard Worker   void SetHeaderWithoutCheckForTesting(std::string_view key,
142*6777b538SAndroid Build Coastguard Worker                                        std::string_view value);
143*6777b538SAndroid Build Coastguard Worker 
144*6777b538SAndroid Build Coastguard Worker   // Sets the header value pair for |key| and |value|, if |key| does not exist.
145*6777b538SAndroid Build Coastguard Worker   // If |key| already exists, the call is a no-op.
146*6777b538SAndroid Build Coastguard Worker   // When comparing |key|, case is ignored.
147*6777b538SAndroid Build Coastguard Worker   //
148*6777b538SAndroid Build Coastguard Worker   // The caller must ensure that |key| passes HttpUtil::IsValidHeaderName() and
149*6777b538SAndroid Build Coastguard Worker   // |value| passes HttpUtil::IsValidHeaderValue().
150*6777b538SAndroid Build Coastguard Worker   void SetHeaderIfMissing(std::string_view key, std::string_view value);
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker   // Removes the first header that matches (case insensitive) |key|.
153*6777b538SAndroid Build Coastguard Worker   void RemoveHeader(std::string_view key);
154*6777b538SAndroid Build Coastguard Worker 
155*6777b538SAndroid Build Coastguard Worker   // Parses the header from a string and calls SetHeader() with it.  This string
156*6777b538SAndroid Build Coastguard Worker   // should not contain any CRLF.  As per RFC7230 Section 3.2, the format is:
157*6777b538SAndroid Build Coastguard Worker   //
158*6777b538SAndroid Build Coastguard Worker   // header-field   = field-name ":" OWS field-value OWS
159*6777b538SAndroid Build Coastguard Worker   //
160*6777b538SAndroid Build Coastguard Worker   // field-name     = token
161*6777b538SAndroid Build Coastguard Worker   // field-value    = *( field-content / obs-fold )
162*6777b538SAndroid Build Coastguard Worker   // field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
163*6777b538SAndroid Build Coastguard Worker   // field-vchar    = VCHAR / obs-text
164*6777b538SAndroid Build Coastguard Worker   //
165*6777b538SAndroid Build Coastguard Worker   // obs-fold       = CRLF 1*( SP / HTAB )
166*6777b538SAndroid Build Coastguard Worker   //                ; obsolete line folding
167*6777b538SAndroid Build Coastguard Worker   //                ; see Section 3.2.4
168*6777b538SAndroid Build Coastguard Worker   //
169*6777b538SAndroid Build Coastguard Worker   // AddHeaderFromString() will trim any LWS surrounding the
170*6777b538SAndroid Build Coastguard Worker   // field-content.
171*6777b538SAndroid Build Coastguard Worker   void AddHeaderFromString(std::string_view header_line);
172*6777b538SAndroid Build Coastguard Worker 
173*6777b538SAndroid Build Coastguard Worker   // Same thing as AddHeaderFromString() except that |headers| is a "\r\n"
174*6777b538SAndroid Build Coastguard Worker   // delimited string of header lines.  It will split up the string by "\r\n"
175*6777b538SAndroid Build Coastguard Worker   // and call AddHeaderFromString() on each.
176*6777b538SAndroid Build Coastguard Worker   void AddHeadersFromString(std::string_view headers);
177*6777b538SAndroid Build Coastguard Worker 
178*6777b538SAndroid Build Coastguard Worker   // Calls SetHeader() on each header from |other|, maintaining order.
179*6777b538SAndroid Build Coastguard Worker   void MergeFrom(const HttpRequestHeaders& other);
180*6777b538SAndroid Build Coastguard Worker 
Swap(HttpRequestHeaders * other)181*6777b538SAndroid Build Coastguard Worker   void Swap(HttpRequestHeaders* other) { headers_.swap(other->headers_); }
182*6777b538SAndroid Build Coastguard Worker 
183*6777b538SAndroid Build Coastguard Worker   // Serializes HttpRequestHeaders to a string representation.  Joins all the
184*6777b538SAndroid Build Coastguard Worker   // header keys and values with ": ", and inserts "\r\n" between each header
185*6777b538SAndroid Build Coastguard Worker   // line, and adds the trailing "\r\n".
186*6777b538SAndroid Build Coastguard Worker   std::string ToString() const;
187*6777b538SAndroid Build Coastguard Worker 
188*6777b538SAndroid Build Coastguard Worker   // Takes in the request line and returns a Value for use with the NetLog
189*6777b538SAndroid Build Coastguard Worker   // containing both the request line and all headers fields.
190*6777b538SAndroid Build Coastguard Worker   base::Value::Dict NetLogParams(const std::string& request_line,
191*6777b538SAndroid Build Coastguard Worker                                  NetLogCaptureMode capture_mode) const;
192*6777b538SAndroid Build Coastguard Worker 
GetHeaderVector()193*6777b538SAndroid Build Coastguard Worker   const HeaderVector& GetHeaderVector() const { return headers_; }
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker   // Sets Accept-Encoding header based on `url` and `accepted_stream_types`, if
196*6777b538SAndroid Build Coastguard Worker   // it does not exist. "br" is appended only when `enable_brotli` is true.
197*6777b538SAndroid Build Coastguard Worker   void SetAcceptEncodingIfMissing(
198*6777b538SAndroid Build Coastguard Worker       const GURL& url,
199*6777b538SAndroid Build Coastguard Worker       const std::optional<base::flat_set<SourceStream::SourceType>>&
200*6777b538SAndroid Build Coastguard Worker           accepted_stream_types,
201*6777b538SAndroid Build Coastguard Worker       bool enable_brotli,
202*6777b538SAndroid Build Coastguard Worker       bool enable_zstd);
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker  private:
205*6777b538SAndroid Build Coastguard Worker   HeaderVector::iterator FindHeader(std::string_view key);
206*6777b538SAndroid Build Coastguard Worker   HeaderVector::const_iterator FindHeader(std::string_view key) const;
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker   void SetHeaderInternal(std::string_view key, std::string&& value);
209*6777b538SAndroid Build Coastguard Worker 
210*6777b538SAndroid Build Coastguard Worker   HeaderVector headers_;
211*6777b538SAndroid Build Coastguard Worker };
212*6777b538SAndroid Build Coastguard Worker 
213*6777b538SAndroid Build Coastguard Worker }  // namespace net
214*6777b538SAndroid Build Coastguard Worker 
215*6777b538SAndroid Build Coastguard Worker #endif  // NET_HTTP_HTTP_REQUEST_HEADERS_H_
216