15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2005, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_BASE_HTTPCOMMON_INL_H__ 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_BASE_HTTPCOMMON_INL_H__ 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h" 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/httpcommon.h" 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base { 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Url 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<class CTYPE> 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Url<CTYPE>::do_set_url(const CTYPE* val, size_t len) { 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (ascnicmp(val, "http://", 7) == 0) { 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org val += 7; len -= 7; 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org secure_ = false; 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (ascnicmp(val, "https://", 8) == 0) { 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org val += 8; len -= 8; 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org secure_ = true; 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org clear(); 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const CTYPE* path = strchrn(val, len, static_cast<CTYPE>('/')); 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!path) { 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org path = val + len; 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t address_length = (path - val); 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org do_set_address(val, address_length); 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org do_set_full_path(path, len - address_length); 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<class CTYPE> 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Url<CTYPE>::do_set_address(const CTYPE* val, size_t len) { 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (const CTYPE* at = strchrn(val, len, static_cast<CTYPE>('@'))) { 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Everything before the @ is a user:password combo, so skip it. 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org len -= at - val + 1; 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org val = at + 1; 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (const CTYPE* colon = strchrn(val, len, static_cast<CTYPE>(':'))) { 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org host_.assign(val, colon - val); 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Note: In every case, we're guaranteed that colon is followed by a null, 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // or non-numeric character. 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org port_ = static_cast<uint16>(::strtoul(colon + 1, NULL, 10)); 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO: Consider checking for invalid data following port number. 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org host_.assign(val, len); 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org port_ = HttpDefaultPort(secure_); 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<class CTYPE> 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Url<CTYPE>::do_set_full_path(const CTYPE* val, size_t len) { 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const CTYPE* query = strchrn(val, len, static_cast<CTYPE>('?')); 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!query) { 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org query = val + len; 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t path_length = (query - val); 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (0 == path_length) { 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO: consider failing in this case. 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org path_.assign(1, static_cast<CTYPE>('/')); 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(val[0] == static_cast<CTYPE>('/')); 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org path_.assign(val, path_length); 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org query_.assign(query, len - path_length); 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<class CTYPE> 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Url<CTYPE>::do_get_url(string* val) const { 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CTYPE protocol[9]; 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org asccpyn(protocol, ARRAY_SIZE(protocol), secure_ ? "https://" : "http://"); 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org val->append(protocol); 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org do_get_address(val); 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org do_get_full_path(val); 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<class CTYPE> 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Url<CTYPE>::do_get_address(string* val) const { 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org val->append(host_); 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (port_ != HttpDefaultPort(secure_)) { 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CTYPE format[5], port[32]; 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org asccpyn(format, ARRAY_SIZE(format), ":%hu"); 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sprintfn(port, ARRAY_SIZE(port), format, port_); 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org val->append(port); 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<class CTYPE> 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Url<CTYPE>::do_get_full_path(string* val) const { 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org val->append(path_); 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org val->append(query_); 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<class CTYPE> 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool Url<CTYPE>::get_attribute(const string& name, string* value) const { 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (query_.empty()) 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string::size_type pos = query_.find(name, 1); 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (std::string::npos == pos) 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pos += name.length() + 1; 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if ((pos > query_.length()) || (static_cast<CTYPE>('=') != query_[pos-1])) 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string::size_type end = query_.find(static_cast<CTYPE>('&'), pos); 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (std::string::npos == end) { 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org end = query_.length(); 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org value->assign(query_.substr(pos, end - pos)); 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace talk_base 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // TALK_BASE_HTTPCOMMON_INL_H__ 149