147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_HTTPCOMMON_INL_H__ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_HTTPCOMMON_INL_H__ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/common.h" 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/httpcommon.h" 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Url 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate<class CTYPE> 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Url<CTYPE>::do_set_url(const CTYPE* val, size_t len) { 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (ascnicmp(val, "http://", 7) == 0) { 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org val += 7; len -= 7; 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org secure_ = false; 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else if (ascnicmp(val, "https://", 8) == 0) { 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org val += 8; len -= 8; 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org secure_ = true; 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else { 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org clear(); 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return; 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const CTYPE* path = strchrn(val, len, static_cast<CTYPE>('/')); 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!path) { 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path = val + len; 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t address_length = (path - val); 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do_set_address(val, address_length); 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do_set_full_path(path, len - address_length); 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate<class CTYPE> 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Url<CTYPE>::do_set_address(const CTYPE* val, size_t len) { 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (const CTYPE* at = strchrn(val, len, static_cast<CTYPE>('@'))) { 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Everything before the @ is a user:password combo, so skip it. 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org len -= at - val + 1; 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org val = at + 1; 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (const CTYPE* colon = strchrn(val, len, static_cast<CTYPE>(':'))) { 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org host_.assign(val, colon - val); 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Note: In every case, we're guaranteed that colon is followed by a null, 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // or non-numeric character. 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org port_ = static_cast<uint16>(::strtoul(colon + 1, NULL, 10)); 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // TODO: Consider checking for invalid data following port number. 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else { 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org host_.assign(val, len); 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org port_ = HttpDefaultPort(secure_); 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate<class CTYPE> 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Url<CTYPE>::do_set_full_path(const CTYPE* val, size_t len) { 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const CTYPE* query = strchrn(val, len, static_cast<CTYPE>('?')); 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!query) { 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org query = val + len; 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t path_length = (query - val); 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (0 == path_length) { 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // TODO: consider failing in this case. 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path_.assign(1, static_cast<CTYPE>('/')); 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else { 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(val[0] == static_cast<CTYPE>('/')); 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org path_.assign(val, path_length); 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org query_.assign(query, len - path_length); 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate<class CTYPE> 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Url<CTYPE>::do_get_url(string* val) const { 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CTYPE protocol[9]; 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org asccpyn(protocol, ARRAY_SIZE(protocol), secure_ ? "https://" : "http://"); 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org val->append(protocol); 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do_get_address(val); 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do_get_full_path(val); 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate<class CTYPE> 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Url<CTYPE>::do_get_address(string* val) const { 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org val->append(host_); 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (port_ != HttpDefaultPort(secure_)) { 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CTYPE format[5], port[32]; 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org asccpyn(format, ARRAY_SIZE(format), ":%hu"); 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sprintfn(port, ARRAY_SIZE(port), format, port_); 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org val->append(port); 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate<class CTYPE> 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Url<CTYPE>::do_get_full_path(string* val) const { 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org val->append(path_); 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org val->append(query_); 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate<class CTYPE> 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool Url<CTYPE>::get_attribute(const string& name, string* value) const { 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (query_.empty()) 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string::size_type pos = query_.find(name, 1); 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (std::string::npos == pos) 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org pos += name.length() + 1; 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if ((pos > query_.length()) || (static_cast<CTYPE>('=') != query_[pos-1])) 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string::size_type end = query_.find(static_cast<CTYPE>('&'), pos); 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (std::string::npos == end) { 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org end = query_.length(); 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org value->assign(query_.substr(pos, end - pos)); 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return true; 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_HTTPCOMMON_INL_H__ 132