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