Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / net / http / http_request_headers.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 //
5 // HttpRequestHeaders manages the request headers.
6 // It maintains these in a vector of header key/value pairs, thereby maintaining
7 // the order of the headers.  This means that any lookups are linear time
8 // operations.
9
10 #ifndef NET_HTTP_HTTP_REQUEST_HEADERS_H_
11 #define NET_HTTP_HTTP_REQUEST_HEADERS_H_
12
13 #include <string>
14 #include <vector>
15
16 #include "base/basictypes.h"
17 #include "base/strings/string_piece.h"
18 #include "net/base/net_export.h"
19 #include "net/base/net_log.h"
20
21 namespace net {
22
23 class NET_EXPORT HttpRequestHeaders {
24  public:
25   struct HeaderKeyValuePair {
26     HeaderKeyValuePair();
27     HeaderKeyValuePair(const base::StringPiece& key,
28                        const base::StringPiece& value);
29
30     std::string key;
31     std::string value;
32   };
33
34   typedef std::vector<HeaderKeyValuePair> HeaderVector;
35
36   class NET_EXPORT Iterator {
37    public:
38     explicit Iterator(const HttpRequestHeaders& headers);
39     ~Iterator();
40
41     // Advances the iterator to the next header, if any.  Returns true if there
42     // is a next header.  Use name() and value() methods to access the resultant
43     // header name and value.
44     bool GetNext();
45
46     // These two accessors are only valid if GetNext() returned true.
47     const std::string& name() const { return curr_->key; }
48     const std::string& value() const { return curr_->value; }
49
50    private:
51     bool started_;
52     HttpRequestHeaders::HeaderVector::const_iterator curr_;
53     const HttpRequestHeaders::HeaderVector::const_iterator end_;
54
55     DISALLOW_COPY_AND_ASSIGN(Iterator);
56   };
57
58   static const char kGetMethod[];
59
60   static const char kAcceptCharset[];
61   static const char kAcceptEncoding[];
62   static const char kAcceptLanguage[];
63   static const char kAuthorization[];
64   static const char kCacheControl[];
65   static const char kConnection[];
66   static const char kContentType[];
67   static const char kCookie[];
68   static const char kContentLength[];
69   static const char kHost[];
70   static const char kIfModifiedSince[];
71   static const char kIfNoneMatch[];
72   static const char kIfRange[];
73   static const char kOrigin[];
74   static const char kPragma[];
75   static const char kProxyAuthorization[];
76   static const char kProxyConnection[];
77   static const char kRange[];
78   static const char kReferer[];
79   static const char kUserAgent[];
80   static const char kTransferEncoding[];
81
82   HttpRequestHeaders();
83   ~HttpRequestHeaders();
84
85   bool IsEmpty() const { return headers_.empty(); }
86
87   bool HasHeader(const base::StringPiece& key) const {
88     return FindHeader(key) != headers_.end();
89   }
90
91   // Gets the first header that matches |key|.  If found, returns true and
92   // writes the value to |out|.
93   bool GetHeader(const base::StringPiece& key, std::string* out) const;
94
95   // Clears all the headers.
96   void Clear();
97
98   // Sets the header value pair for |key| and |value|.  If |key| already exists,
99   // then the header value is modified, but the key is untouched, and the order
100   // in the vector remains the same.  When comparing |key|, case is ignored.
101   void SetHeader(const base::StringPiece& key, const base::StringPiece& value);
102
103   // Sets the header value pair for |key| and |value|, if |key| does not exist.
104   // If |key| already exists, the call is a no-op.
105   // When comparing |key|, case is ignored.
106   void SetHeaderIfMissing(const base::StringPiece& key,
107                           const base::StringPiece& value);
108
109   // Removes the first header that matches (case insensitive) |key|.
110   void RemoveHeader(const base::StringPiece& key);
111
112   // Parses the header from a string and calls SetHeader() with it.  This string
113   // should not contain any CRLF.  As per RFC2616, the format is:
114   //
115   // message-header = field-name ":" [ field-value ]
116   // field-name     = token
117   // field-value    = *( field-content | LWS )
118   // field-content  = <the OCTETs making up the field-value
119   //                  and consisting of either *TEXT or combinations
120   //                  of token, separators, and quoted-string>
121   //
122   // AddHeaderFromString() will trim any LWS surrounding the
123   // field-content.
124   void AddHeaderFromString(const base::StringPiece& header_line);
125
126   // Same thing as AddHeaderFromString() except that |headers| is a "\r\n"
127   // delimited string of header lines.  It will split up the string by "\r\n"
128   // and call AddHeaderFromString() on each.
129   void AddHeadersFromString(const base::StringPiece& headers);
130
131   // Calls SetHeader() on each header from |other|, maintaining order.
132   void MergeFrom(const HttpRequestHeaders& other);
133
134   // Copies from |other| to |this|.
135   void CopyFrom(const HttpRequestHeaders& other) {
136     *this = other;
137   }
138
139   void Swap(HttpRequestHeaders* other) {
140     headers_.swap(other->headers_);
141   }
142
143   // Serializes HttpRequestHeaders to a string representation.  Joins all the
144   // header keys and values with ": ", and inserts "\r\n" between each header
145   // line, and adds the trailing "\r\n".
146   std::string ToString() const;
147
148   // Takes in the request line and returns a Value for use with the NetLog
149   // containing both the request line and all headers fields.
150   base::Value* NetLogCallback(const std::string* request_line,
151                               NetLog::LogLevel log_level) const;
152
153   // Takes in a Value created by the above function, and attempts to extract the
154   // request line and create a copy of the original headers.  Returns true on
155   // success.  On failure, clears |headers| and |request_line|.
156   // TODO(mmenke):  Long term, we want to remove this, and migrate external
157   //                consumers to be NetworkDelegates.
158   static bool FromNetLogParam(const base::Value* event_param,
159                               HttpRequestHeaders* headers,
160                               std::string* request_line);
161
162  private:
163   HeaderVector::iterator FindHeader(const base::StringPiece& key);
164   HeaderVector::const_iterator FindHeader(const base::StringPiece& key) const;
165
166   HeaderVector headers_;
167
168   // Allow the copy construction and operator= to facilitate copying in
169   // HttpRequestHeaders.
170   // TODO(willchan): Investigate to see if we can remove the need to copy
171   // HttpRequestHeaders.
172   // DISALLOW_COPY_AND_ASSIGN(HttpRequestHeaders);
173 };
174
175 }  // namespace net
176
177 #endif  // NET_HTTP_HTTP_REQUEST_HEADERS_H_