28using namespace NSROOT;
30URIParser::URIParser(
const std::string& location)
32 size_t len = location.length();
33 m_buffer =
new char[len + 1];
34 strncpy(m_buffer, location.c_str(), len);
36 URIScan(m_buffer, &m_parts);
39URIParser::~URIParser()
46void URIParser::URIScan(
char *uri, URI_t *parts)
49 char *after_scheme = uri;
50 memset(parts,
'\0',
sizeof(URI_t));
53 if ((p = strchr(uri,
' ')) !=
nullptr)
57 for (p = after_scheme; *p; p++)
59 if (*p ==
'/' || *p ==
'#' || *p ==
'?')
66 if (toupper(after_scheme[0]) ==
'U'
67 && toupper(after_scheme[1]) ==
'R'
68 && toupper(after_scheme[2]) ==
'L')
71 parts->scheme =
nullptr;
75 parts->scheme = after_scheme;
93 if ((p = strchr(parts->host,
'/')) !=
nullptr)
98 parts->absolute = p + 1;
101 if ((p = strchr(parts->host,
'@')) !=
nullptr)
105 parts->user = parts->host;
108 if ((p = strchr(parts->user,
':')) !=
nullptr)
116 if ((p = strchr(parts->host,
']')) !=
nullptr)
122 parts->port = (unsigned) atoi(p + 2);
127 if ((p = strchr(parts->host,
':')) !=
nullptr)
132 parts->port = (unsigned) atoi(p + 1);
139 parts->absolute = p + 1;
145 parts->relative = (*after_scheme) ? after_scheme :
nullptr;
150 after_scheme = parts->relative;
151 else if (parts->absolute)
152 after_scheme = parts->absolute;
155 if ((p = strchr(after_scheme,
'#')) !=
nullptr)
158 parts->fragment = ++p;
162 if ((p = strchr(after_scheme,
'?')) !=
nullptr)