diff options
Diffstat (limited to 'net/http/http_request_headers.h')
-rw-r--r-- | net/http/http_request_headers.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/net/http/http_request_headers.h b/net/http/http_request_headers.h new file mode 100644 index 0000000..79522aa --- /dev/null +++ b/net/http/http_request_headers.h @@ -0,0 +1,97 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// HttpRequestHeaders manages the request headers (including the request line). +// It maintains these in a vector of header key/value pairs, thereby maintaining +// the order of the headers. This means that any lookups are linear time +// operations. + +#ifndef NET_HTTP_HTTP_REQUEST_HEADERS_H_ +#define NET_HTTP_HTTP_REQUEST_HEADERS_H_ + +#include <string> +#include <vector> +#include "base/basictypes.h" +#include "base/string_piece.h" + +namespace net { + +class HttpRequestHeaders { + public: + static const char kGetMethod[]; + + static const char kCacheControl[]; + static const char kConnection[]; + static const char kContentLength[]; + static const char kHost[]; + static const char kPragma[]; + static const char kProxyConnection[]; + static const char kReferer[]; + static const char kUserAgent[]; + + HttpRequestHeaders(); + ~HttpRequestHeaders(); + + void SetRequestLine(const base::StringPiece& method, + const base::StringPiece& path, + const base::StringPiece& version); + + // Sets the header value pair for |key| and |value|. If |key| already exists, + // then the header value is modified, but the key is untouched, and the order + // in the vector remains the same. When comparing |key|, case is ignored. + void SetHeader(const base::StringPiece& key, const base::StringPiece& value); + + // Removes the first header that matches (case insensitive) |key|. + void RemoveHeader(const base::StringPiece& key); + + // Parses the header from a string and calls SetHeader() with it. This string + // should not contain any CRLF. As per RFC2616, the format is: + // + // message-header = field-name ":" [ field-value ] + // field-name = token + // field-value = *( field-content | LWS ) + // field-content = <the OCTETs making up the field-value + // and consisting of either *TEXT or combinations + // of token, separators, and quoted-string> + // + // AddHeaderFromString() will trim any LWS surrounding the + // field-content. + void AddHeaderFromString(const base::StringPiece& header_line); + + // Calls SetHeader() on each header from |other|, maintaining order. + void MergeFrom(const HttpRequestHeaders& other); + + // Serializes HttpRequestHeaders to a string representation. Joins all the + // header keys and values with ": ", and inserts "\r\n" between each header + // line, and adds the trailing "\r\n". + std::string ToString() const; + + private: + struct HeaderKeyValuePair { + HeaderKeyValuePair() {} + HeaderKeyValuePair(const base::StringPiece& key, + const base::StringPiece& value) + : key(key.data(), key.size()), value(value.data(), value.size()) {} + + std::string key; + std::string value; + }; + + typedef std::vector<HeaderKeyValuePair> HeaderVector; + + HeaderVector::iterator FindHeader(const base::StringPiece& key); + HeaderVector::const_iterator FindHeader(const base::StringPiece& key) const; + + std::string method_; + std::string path_; + std::string version_; + + HeaderVector headers_; + + DISALLOW_COPY_AND_ASSIGN(HttpRequestHeaders); +}; + +} // namespace net + +#endif // NET_HTTP_HTTP_REQUEST_HEADERS_H_ |