A simple web service over HTTP library. Calls a HTTP server via GET, and returns the response wrapped in a XML parser. All calls are synchronous. Needs the NetServicesMin, DNSResolver, TcpLineStream and spxml libraries. The code for URL handling has been copied directly from the original NetServices library (Thanks to Donatien!).

Committer:
hlipka
Date:
Tue Jan 11 23:00:09 2011 +0000
Revision:
0:5e8527b638e1
initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hlipka 0:5e8527b638e1 1
hlipka 0:5e8527b638e1 2 /*
hlipka 0:5e8527b638e1 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
hlipka 0:5e8527b638e1 4
hlipka 0:5e8527b638e1 5 Permission is hereby granted, free of charge, to any person obtaining a copy
hlipka 0:5e8527b638e1 6 of this software and associated documentation files (the "Software"), to deal
hlipka 0:5e8527b638e1 7 in the Software without restriction, including without limitation the rights
hlipka 0:5e8527b638e1 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
hlipka 0:5e8527b638e1 9 copies of the Software, and to permit persons to whom the Software is
hlipka 0:5e8527b638e1 10 furnished to do so, subject to the following conditions:
hlipka 0:5e8527b638e1 11
hlipka 0:5e8527b638e1 12 The above copyright notice and this permission notice shall be included in
hlipka 0:5e8527b638e1 13 all copies or substantial portions of the Software.
hlipka 0:5e8527b638e1 14
hlipka 0:5e8527b638e1 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
hlipka 0:5e8527b638e1 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
hlipka 0:5e8527b638e1 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
hlipka 0:5e8527b638e1 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
hlipka 0:5e8527b638e1 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
hlipka 0:5e8527b638e1 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
hlipka 0:5e8527b638e1 21 THE SOFTWARE.
hlipka 0:5e8527b638e1 22 */
hlipka 0:5e8527b638e1 23
hlipka 0:5e8527b638e1 24 #include "url.h"
hlipka 0:5e8527b638e1 25
hlipka 0:5e8527b638e1 26 Url::Url() : m_port(0)
hlipka 0:5e8527b638e1 27 {
hlipka 0:5e8527b638e1 28
hlipka 0:5e8527b638e1 29 }
hlipka 0:5e8527b638e1 30
hlipka 0:5e8527b638e1 31 string Url::getProtocol()
hlipka 0:5e8527b638e1 32 {
hlipka 0:5e8527b638e1 33 return m_protocol;
hlipka 0:5e8527b638e1 34 }
hlipka 0:5e8527b638e1 35
hlipka 0:5e8527b638e1 36 string Url::getHost()
hlipka 0:5e8527b638e1 37 {
hlipka 0:5e8527b638e1 38 return m_host;
hlipka 0:5e8527b638e1 39 }
hlipka 0:5e8527b638e1 40
hlipka 0:5e8527b638e1 41 bool Url::getHostIp(IpAddr* ip)
hlipka 0:5e8527b638e1 42 {
hlipka 0:5e8527b638e1 43 unsigned int ipArr[4] = {0};
hlipka 0:5e8527b638e1 44 if ( sscanf(m_host.c_str(), "%u.%u.%u.%u", &ipArr[0], &ipArr[1], &ipArr[2], &ipArr[3]) != 4 )
hlipka 0:5e8527b638e1 45 {
hlipka 0:5e8527b638e1 46 return false;
hlipka 0:5e8527b638e1 47 }
hlipka 0:5e8527b638e1 48 *ip = IpAddr(ipArr[0], ipArr[1], ipArr[2], ipArr[3]);
hlipka 0:5e8527b638e1 49 return true;
hlipka 0:5e8527b638e1 50 }
hlipka 0:5e8527b638e1 51
hlipka 0:5e8527b638e1 52 uint16_t Url::getPort()
hlipka 0:5e8527b638e1 53 {
hlipka 0:5e8527b638e1 54 return m_port;
hlipka 0:5e8527b638e1 55 }
hlipka 0:5e8527b638e1 56
hlipka 0:5e8527b638e1 57 string Url::getPath()
hlipka 0:5e8527b638e1 58 {
hlipka 0:5e8527b638e1 59 return m_path;
hlipka 0:5e8527b638e1 60 }
hlipka 0:5e8527b638e1 61
hlipka 0:5e8527b638e1 62 void Url::setProtocol(string protocol)
hlipka 0:5e8527b638e1 63 {
hlipka 0:5e8527b638e1 64 m_protocol = protocol;
hlipka 0:5e8527b638e1 65 }
hlipka 0:5e8527b638e1 66
hlipka 0:5e8527b638e1 67 void Url::setHost(string host)
hlipka 0:5e8527b638e1 68 {
hlipka 0:5e8527b638e1 69 m_host = host;
hlipka 0:5e8527b638e1 70 }
hlipka 0:5e8527b638e1 71
hlipka 0:5e8527b638e1 72 void Url::setPort(uint16_t port)
hlipka 0:5e8527b638e1 73 {
hlipka 0:5e8527b638e1 74 m_port = port;
hlipka 0:5e8527b638e1 75 }
hlipka 0:5e8527b638e1 76
hlipka 0:5e8527b638e1 77 void Url::setPath(string path)
hlipka 0:5e8527b638e1 78 {
hlipka 0:5e8527b638e1 79 m_path = path;
hlipka 0:5e8527b638e1 80 }
hlipka 0:5e8527b638e1 81
hlipka 0:5e8527b638e1 82 void Url::fromString(string str)
hlipka 0:5e8527b638e1 83 {
hlipka 0:5e8527b638e1 84 //URI form [protocol://]host[:port]/path
hlipka 0:5e8527b638e1 85 int pos = 0;
hlipka 0:5e8527b638e1 86 int len = str.find("://");
hlipka 0:5e8527b638e1 87 if( len > 0)
hlipka 0:5e8527b638e1 88 {
hlipka 0:5e8527b638e1 89 m_protocol = str.substr(0, len);
hlipka 0:5e8527b638e1 90 pos += len + 3;
hlipka 0:5e8527b638e1 91 }
hlipka 0:5e8527b638e1 92 else
hlipka 0:5e8527b638e1 93 {
hlipka 0:5e8527b638e1 94 m_protocol = "";
hlipka 0:5e8527b638e1 95 }
hlipka 0:5e8527b638e1 96
hlipka 0:5e8527b638e1 97 bool isPort = false;
hlipka 0:5e8527b638e1 98 int cln_pos = str.find(":", pos);
hlipka 0:5e8527b638e1 99 int slash_pos = str.find("/", pos);
hlipka 0:5e8527b638e1 100 if( slash_pos == -1 )
hlipka 0:5e8527b638e1 101 {
hlipka 0:5e8527b638e1 102 slash_pos = str.length();
hlipka 0:5e8527b638e1 103 }
hlipka 0:5e8527b638e1 104 if( (cln_pos != -1) && (cln_pos < slash_pos) )
hlipka 0:5e8527b638e1 105 {
hlipka 0:5e8527b638e1 106 isPort = true;
hlipka 0:5e8527b638e1 107 len = cln_pos - pos;
hlipka 0:5e8527b638e1 108 }
hlipka 0:5e8527b638e1 109 else
hlipka 0:5e8527b638e1 110 {
hlipka 0:5e8527b638e1 111 len = slash_pos - pos;
hlipka 0:5e8527b638e1 112 }
hlipka 0:5e8527b638e1 113
hlipka 0:5e8527b638e1 114 m_host = str.substr(pos, len);
hlipka 0:5e8527b638e1 115
hlipka 0:5e8527b638e1 116 pos += len;
hlipka 0:5e8527b638e1 117 if( isPort )
hlipka 0:5e8527b638e1 118 {
hlipka 0:5e8527b638e1 119 pos+=1; //Do not keep :
hlipka 0:5e8527b638e1 120 unsigned int port = 0;
hlipka 0:5e8527b638e1 121 sscanf(str.substr(pos, cln_pos-pos).c_str(),"%u", &port);
hlipka 0:5e8527b638e1 122 m_port = (uint16_t)port;
hlipka 0:5e8527b638e1 123 pos = slash_pos;
hlipka 0:5e8527b638e1 124 }
hlipka 0:5e8527b638e1 125
hlipka 0:5e8527b638e1 126 m_path = str.substr(pos);
hlipka 0:5e8527b638e1 127 }
hlipka 0:5e8527b638e1 128
hlipka 0:5e8527b638e1 129 string Url::toString()
hlipka 0:5e8527b638e1 130 {
hlipka 0:5e8527b638e1 131 string url;
hlipka 0:5e8527b638e1 132 if( !m_protocol.empty() )
hlipka 0:5e8527b638e1 133 {
hlipka 0:5e8527b638e1 134 url.append(m_protocol);
hlipka 0:5e8527b638e1 135 url.append("://");
hlipka 0:5e8527b638e1 136 }
hlipka 0:5e8527b638e1 137 url.append(m_host);
hlipka 0:5e8527b638e1 138 if( m_port )
hlipka 0:5e8527b638e1 139 {
hlipka 0:5e8527b638e1 140 char c_port[6] = {0};
hlipka 0:5e8527b638e1 141 sprintf(c_port, "%d", m_port);
hlipka 0:5e8527b638e1 142 url.append(":");
hlipka 0:5e8527b638e1 143 url.append(c_port);
hlipka 0:5e8527b638e1 144 }
hlipka 0:5e8527b638e1 145 if(m_path[0]!='/')
hlipka 0:5e8527b638e1 146 {
hlipka 0:5e8527b638e1 147 url.append("/");
hlipka 0:5e8527b638e1 148 }
hlipka 0:5e8527b638e1 149 url.append(m_path);
hlipka 0:5e8527b638e1 150 return url;
hlipka 0:5e8527b638e1 151 }