1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef WEBRTC_BASE_HTTPCOMMON_H__
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WEBRTC_BASE_HTTPCOMMON_H__
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <map>
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <string>
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <vector>
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/basictypes.h"
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/common.h"
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/scoped_ptr.h"
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/stringutils.h"
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/stream.h"
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass CryptString;
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass SocketAddress;
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Constants
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgenum HttpCode {
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_OK = 200,
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_NON_AUTHORITATIVE = 203,
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_NO_CONTENT = 204,
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_PARTIAL_CONTENT = 206,
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_MULTIPLE_CHOICES = 300,
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_MOVED_PERMANENTLY = 301,
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_FOUND = 302,
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_SEE_OTHER = 303,
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_NOT_MODIFIED = 304,
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_MOVED_TEMPORARILY = 307,
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_BAD_REQUEST = 400,
46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_UNAUTHORIZED = 401,
47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_FORBIDDEN = 403,
48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_NOT_FOUND = 404,
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_PROXY_AUTHENTICATION_REQUIRED = 407,
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_GONE = 410,
51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_INTERNAL_SERVER_ERROR = 500,
53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_NOT_IMPLEMENTED = 501,
54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HC_SERVICE_UNAVAILABLE = 503,
55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgenum HttpVersion {
58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HVER_1_0, HVER_1_1, HVER_UNKNOWN,
59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HVER_LAST = HVER_UNKNOWN
60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgenum HttpVerb {
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HV_GET, HV_POST, HV_PUT, HV_DELETE, HV_CONNECT, HV_HEAD,
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HV_LAST = HV_HEAD
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgenum HttpError {
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_NONE,
69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_PROTOCOL,            // Received non-valid HTTP data
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_DISCONNECTED,        // Connection closed unexpectedly
71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_OVERFLOW,            // Received too much data for internal buffers
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_CONNECT_FAILED,      // The socket failed to connect.
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_SOCKET_ERROR,        // An error occurred on a connected socket
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_SHUTDOWN,            // Http object is being destroyed
75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_OPERATION_CANCELLED, // Connection aborted locally
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_AUTH,                // Proxy Authentication Required
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_CERTIFICATE_EXPIRED, // During SSL negotiation
78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_STREAM,              // Problem reading or writing to the document
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_CACHE,               // Problem reading from cache
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HE_DEFAULT
81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgenum HttpHeader {
84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_AGE,
85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_CACHE_CONTROL,
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_CONNECTION,
87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_CONTENT_DISPOSITION,
88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_CONTENT_LENGTH,
89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_CONTENT_RANGE,
90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_CONTENT_TYPE,
91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_COOKIE,
92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_DATE,
93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_ETAG,
94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_EXPIRES,
95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_HOST,
96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_IF_MODIFIED_SINCE,
97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_IF_NONE_MATCH,
98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_KEEP_ALIVE,
99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_LAST_MODIFIED,
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_LOCATION,
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_PROXY_AUTHENTICATE,
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_PROXY_AUTHORIZATION,
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_PROXY_CONNECTION,
104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_RANGE,
105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_SET_COOKIE,
106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_TE,
107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_TRAILERS,
108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_TRANSFER_ENCODING,
109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_UPGRADE,
110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_USER_AGENT,
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_WWW_AUTHENTICATE,
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HH_LAST = HH_WWW_AUTHENTICATE
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1150c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmconst uint16_t HTTP_DEFAULT_PORT = 80;
1160c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmconst uint16_t HTTP_SECURE_PORT = 443;
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Utility Functions
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orginline HttpError mkerr(HttpError err, HttpError def_err = HE_DEFAULT) {
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return (err != HE_NONE) ? err : def_err;
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst char* ToString(HttpVersion version);
127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool FromString(HttpVersion& version, const std::string& str);
128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst char* ToString(HttpVerb verb);
130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool FromString(HttpVerb& verb, const std::string& str);
131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgconst char* ToString(HttpHeader header);
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool FromString(HttpHeader& header, const std::string& str);
134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1350c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströminline bool HttpCodeIsInformational(uint32_t code) {
1360c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  return ((code / 100) == 1);
1370c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström}
1380c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströminline bool HttpCodeIsSuccessful(uint32_t code) {
1390c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  return ((code / 100) == 2);
1400c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström}
1410c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströminline bool HttpCodeIsRedirection(uint32_t code) {
1420c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  return ((code / 100) == 3);
1430c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström}
1440c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströminline bool HttpCodeIsClientError(uint32_t code) {
1450c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  return ((code / 100) == 4);
1460c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström}
1470c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströminline bool HttpCodeIsServerError(uint32_t code) {
1480c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  return ((code / 100) == 5);
1490c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström}
150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1510c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool HttpCodeHasBody(uint32_t code);
1520c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool HttpCodeIsCacheable(uint32_t code);
153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool HttpHeaderIsEndToEnd(HttpHeader header);
154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool HttpHeaderIsCollapsible(HttpHeader header);
155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct HttpData;
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool HttpShouldKeepAlive(const HttpData& data);
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtypedef std::pair<std::string, std::string> HttpAttribute;
160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtypedef std::vector<HttpAttribute> HttpAttributeList;
161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid HttpComposeAttributes(const HttpAttributeList& attributes, char separator,
162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           std::string* composed);
163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid HttpParseAttributes(const char * data, size_t len,
164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                         HttpAttributeList& attributes);
165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool HttpHasAttribute(const HttpAttributeList& attributes,
166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                      const std::string& name,
167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                      std::string* value);
168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool HttpHasNthAttribute(HttpAttributeList& attributes,
169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                         size_t index,
170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                         std::string* name,
171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                         std::string* value);
172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Convert RFC1123 date (DoW, DD Mon YYYY HH:MM:SS TZ) to unix timestamp
174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool HttpDateToSeconds(const std::string& date, time_t* seconds);
175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1760c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströminline uint16_t HttpDefaultPort(bool secure) {
177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return secure ? HTTP_SECURE_PORT : HTTP_DEFAULT_PORT;
178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Returns the http server notation for a given address
181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string HttpAddress(const SocketAddress& address, bool secure);
182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// functional for insensitive std::string compare
184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct iless {
185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool operator()(const std::string& lhs, const std::string& rhs) const {
186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return (::_stricmp(lhs.c_str(), rhs.c_str()) < 0);
187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// put quotes around a string and escape any quotes inside it
191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string quote(const std::string& str);
192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Url
195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate<class CTYPE>
198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Url {
199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgpublic:
200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  typedef typename Traits<CTYPE>::string string;
201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // TODO: Implement Encode/Decode
203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static int Encode(const CTYPE* source, CTYPE* destination, size_t len);
204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static int Encode(const string& source, string& destination);
205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static int Decode(const CTYPE* source, CTYPE* destination, size_t len);
206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static int Decode(const string& source, string& destination);
207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Url(const string& url) { do_set_url(url.c_str(), url.size()); }
2090c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  Url(const string& path, const string& host, uint16_t port = HTTP_DEFAULT_PORT)
2100c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström      : host_(host), port_(port), secure_(HTTP_SECURE_PORT == port) {
2110c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström    set_full_path(path);
2120c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  }
213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool valid() const { return !host_.empty(); }
215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void clear() {
216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    host_.clear();
217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    port_ = HTTP_DEFAULT_PORT;
218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    secure_ = false;
219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    path_.assign(1, static_cast<CTYPE>('/'));
220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    query_.clear();
221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void set_url(const string& val) {
224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    do_set_url(val.c_str(), val.size());
225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  string url() const {
227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    string val; do_get_url(&val); return val;
228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void set_address(const string& val) {
231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    do_set_address(val.c_str(), val.size());
232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  string address() const {
234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    string val; do_get_address(&val); return val;
235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void set_full_path(const string& val) {
238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    do_set_full_path(val.c_str(), val.size());
239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  string full_path() const {
241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    string val; do_get_full_path(&val); return val;
242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void set_host(const string& val) { host_ = val; }
245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  const string& host() const { return host_; }
246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
2470c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  void set_port(uint16_t val) { port_ = val; }
2480c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint16_t port() const { return port_; }
249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void set_secure(bool val) { secure_ = val; }
251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool secure() const { return secure_; }
252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void set_path(const string& val) {
254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (val.empty()) {
255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      path_.assign(1, static_cast<CTYPE>('/'));
256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    } else {
257f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      ASSERT(val[0] == static_cast<CTYPE>('/'));
258f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      path_ = val;
259f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
261f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  const string& path() const { return path_; }
262f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
263f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void set_query(const string& val) {
264f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(val.empty() || (val[0] == static_cast<CTYPE>('?')));
265f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    query_ = val;
266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  const string& query() const { return query_; }
268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool get_attribute(const string& name, string* value) const;
270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
271f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgprivate:
272f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void do_set_url(const CTYPE* val, size_t len);
273f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void do_set_address(const CTYPE* val, size_t len);
274f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void do_set_full_path(const CTYPE* val, size_t len);
275f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
276f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void do_get_url(string* val) const;
277f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void do_get_address(string* val) const;
278f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void do_get_full_path(string* val) const;
279f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
280f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  string host_, path_, query_;
2810c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint16_t port_;
282f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool secure_;
283f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
284f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
285f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
286f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// HttpData
287f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
288f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
289f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct HttpData {
290f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  typedef std::multimap<std::string, std::string, iless> HeaderMap;
291f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  typedef HeaderMap::const_iterator const_iterator;
292f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  typedef HeaderMap::iterator iterator;
293f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
294f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HttpVersion version;
295f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  scoped_ptr<StreamInterface> document;
296f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
29767186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  HttpData();
298f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
299f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  enum HeaderCombine { HC_YES, HC_NO, HC_AUTO, HC_REPLACE, HC_NEW };
300f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void changeHeader(const std::string& name, const std::string& value,
301f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                    HeaderCombine combine);
302f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline void addHeader(const std::string& name, const std::string& value,
303f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                        bool append = true) {
304f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    changeHeader(name, value, append ? HC_AUTO : HC_NO);
305f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
306f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline void setHeader(const std::string& name, const std::string& value,
307f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                        bool overwrite = true) {
308f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    changeHeader(name, value, overwrite ? HC_REPLACE : HC_NEW);
309f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
310f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Returns count of erased headers
311f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  size_t clearHeader(const std::string& name);
312f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Returns iterator to next header
313f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  iterator clearHeader(iterator header);
314f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
315f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // keep in mind, this may not do what you want in the face of multiple headers
316f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool hasHeader(const std::string& name, std::string* value) const;
317f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
318f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline const_iterator begin() const {
319f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.begin();
320f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
321f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline const_iterator end() const {
322f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.end();
323f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
324f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline iterator begin() {
325f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.begin();
326f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
327f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline iterator end() {
328f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.end();
329f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
330f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline const_iterator begin(const std::string& name) const {
331f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.lower_bound(name);
332f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
333f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline const_iterator end(const std::string& name) const {
334f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.upper_bound(name);
335f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
336f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline iterator begin(const std::string& name) {
337f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.lower_bound(name);
338f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
339f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline iterator end(const std::string& name) {
340f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.upper_bound(name);
341f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
342f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
343f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Convenience methods using HttpHeader
344f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline void changeHeader(HttpHeader header, const std::string& value,
345f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           HeaderCombine combine) {
346f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    changeHeader(ToString(header), value, combine);
347f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
348f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline void addHeader(HttpHeader header, const std::string& value,
349f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                        bool append = true) {
350f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    addHeader(ToString(header), value, append);
351f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
352f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline void setHeader(HttpHeader header, const std::string& value,
353f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                        bool overwrite = true) {
354f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    setHeader(ToString(header), value, overwrite);
355f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
356f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline void clearHeader(HttpHeader header) {
357f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    clearHeader(ToString(header));
358f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
359f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline bool hasHeader(HttpHeader header, std::string* value) const {
360f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return hasHeader(ToString(header), value);
361f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
362f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline const_iterator begin(HttpHeader header) const {
363f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.lower_bound(ToString(header));
364f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
365f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline const_iterator end(HttpHeader header) const {
366f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.upper_bound(ToString(header));
367f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
368f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline iterator begin(HttpHeader header) {
369f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.lower_bound(ToString(header));
370f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
371f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  inline iterator end(HttpHeader header) {
372f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return headers_.upper_bound(ToString(header));
373f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
374f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
375f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void setContent(const std::string& content_type, StreamInterface* document);
376f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void setDocumentAndLength(StreamInterface* document);
377f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
378f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual size_t formatLeader(char* buffer, size_t size) const = 0;
379f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual HttpError parseLeader(const char* line, size_t len) = 0;
380f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
381f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgprotected:
38267186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org virtual ~HttpData();
383f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void clear(bool release_document);
384f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void copy(const HttpData& src);
385f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
386f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgprivate:
387f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HeaderMap headers_;
388f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
389f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
390f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct HttpRequestData : public HttpData {
391f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HttpVerb verb;
392f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string path;
393f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
394f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HttpRequestData() : verb(HV_GET) { }
395f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
396f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void clear(bool release_document);
397f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void copy(const HttpRequestData& src);
398f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
39967186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  size_t formatLeader(char* buffer, size_t size) const override;
40067186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  HttpError parseLeader(const char* line, size_t len) override;
401f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
402f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool getAbsoluteUri(std::string* uri) const;
403f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool getRelativeUri(std::string* host, std::string* path) const;
404f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
405f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
406f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct HttpResponseData : public HttpData {
4070c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint32_t scode;
408f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string message;
409f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
410f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HttpResponseData() : scode(HC_INTERNAL_SERVER_ERROR) { }
411f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void clear(bool release_document);
412f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void copy(const HttpResponseData& src);
413f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
414f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Convenience methods
4150c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  void set_success(uint32_t scode = HC_OK);
4160c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  void set_success(const std::string& content_type,
4170c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström                   StreamInterface* document,
4180c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström                   uint32_t scode = HC_OK);
419f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void set_redirect(const std::string& location,
4200c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström                    uint32_t scode = HC_MOVED_TEMPORARILY);
4210c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  void set_error(uint32_t scode);
422f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
42367186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  size_t formatLeader(char* buffer, size_t size) const override;
42467186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  HttpError parseLeader(const char* line, size_t len) override;
425f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
426f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
427f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct HttpTransaction {
428f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HttpRequestData request;
429f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HttpResponseData response;
430f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
431f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
432f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
433f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Http Authentication
434f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
435f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
436f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct HttpAuthContext {
437f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  std::string auth_method;
438f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HttpAuthContext(const std::string& auth) : auth_method(auth) { }
439f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual ~HttpAuthContext() { }
440f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
441f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
442f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgenum HttpAuthResult { HAR_RESPONSE, HAR_IGNORE, HAR_CREDENTIALS, HAR_ERROR };
443f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
444f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 'context' is used by this function to record information between calls.
445f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Start by passing a null pointer, then pass the same pointer each additional
446f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// call.  When the authentication attempt is finished, delete the context.
447f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgHttpAuthResult HttpAuthenticate(
448f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  const char * challenge, size_t len,
449f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  const SocketAddress& server,
450f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  const std::string& method, const std::string& uri,
451f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  const std::string& username, const CryptString& password,
452f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HttpAuthContext *& context, std::string& response, std::string& auth_method);
453f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
454f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//////////////////////////////////////////////////////////////////////
455f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
456f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc
457f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
458f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // WEBRTC_BASE_HTTPCOMMON_H__
459