summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/Url.cpp
diff options
context:
space:
mode:
authorStephen D. Huston <shuston@apache.org>2011-10-20 18:42:46 +0000
committerStephen D. Huston <shuston@apache.org>2011-10-20 18:42:46 +0000
commit5eb354b338bb8d8fcd35b6ac3fb33f8103e757c3 (patch)
treef24776684c025fbed6a0431bf3d6811f0a1aae7a /cpp/src/qpid/Url.cpp
parent718ff5b34dd1e87eb79fa4c61fec668d1dc33103 (diff)
downloadqpid-python-5eb354b338bb8d8fcd35b6ac3fb33f8103e757c3.tar.gz
Merge trunk to QPID-2519 branch
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/QPID-2519@1186990 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/Url.cpp')
-rw-r--r--cpp/src/qpid/Url.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/cpp/src/qpid/Url.cpp b/cpp/src/qpid/Url.cpp
index ab796f4642..f699b60c17 100644
--- a/cpp/src/qpid/Url.cpp
+++ b/cpp/src/qpid/Url.cpp
@@ -156,11 +156,12 @@ class UrlParser {
return false;
}
- // TODO aconway 2008-11-20: this does not fully implement
- // http://www.ietf.org/rfc/rfc3986.txt. Works for DNS names and
- // ipv4 literals but won't handle ipv6.
+ // A liberal interpretation of http://www.ietf.org/rfc/rfc3986.txt.
+ // Works for DNS names and and ipv4 and ipv6 literals
//
bool host(string& h) {
+ if (ip6literal(h)) return true;
+
const char* start=i;
while (unreserved() || pctEncoded())
;
@@ -169,6 +170,22 @@ class UrlParser {
return true;
}
+ // This is a bit too liberal for IPv6 literal addresses, but probably good enough
+ bool ip6literal(string& h) {
+ if (literal("[")) {
+ const char* start = i;
+ while (hexDigit() || literal(":") || literal("."))
+ ;
+ const char* end = i;
+ if ( end-start < 2 ) return false; // Smallest valid address is "::"
+ if (literal("]")) {
+ h.assign(start, end);
+ return true;
+ }
+ }
+ return false;
+ }
+
bool unreserved() { return (::isalnum(*i) || ::strchr("-._~", *i)) && advance(); }
bool pctEncoded() { return literal("%") && hexDigit() && hexDigit(); }