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