You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2014/04/01 16:00:47 UTC
svn commit: r1583673 - in /qpid/proton/trunk: proton-c/src/
proton-c/src/posix/ proton-c/src/tests/
proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/
proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/
Author: tross
Date: Tue Apr 1 14:00:47 2014
New Revision: 1583673
URL: http://svn.apache.org/r1583673
Log:
PROTON-548 - Added IPv6 url syntax to C and Java URL parsers. Added IPv6 handling to C driver.
Modified:
qpid/proton/trunk/proton-c/src/posix/io.c
qpid/proton/trunk/proton-c/src/tests/parse-url.c
qpid/proton/trunk/proton-c/src/util.c
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java
qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java
Modified: qpid/proton/trunk/proton-c/src/posix/io.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/posix/io.c?rev=1583673&r1=1583672&r2=1583673&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/posix/io.c (original)
+++ qpid/proton/trunk/proton-c/src/posix/io.c Tue Apr 1 14:00:47 2014
@@ -119,7 +119,7 @@ static void pn_configure_sock(pn_io_t *i
}
}
-static inline int pn_create_socket(void);
+static inline int pn_create_socket(int af);
pn_socket_t pn_listen(pn_io_t *io, const char *host, const char *port)
{
@@ -130,7 +130,7 @@ pn_socket_t pn_listen(pn_io_t *io, const
return PN_INVALID_SOCKET;
}
- pn_socket_t sock = pn_create_socket();
+ pn_socket_t sock = pn_create_socket(addr->ai_family);
if (sock == PN_INVALID_SOCKET) {
pn_i_error_from_errno(io->error, "pn_create_socket");
return PN_INVALID_SOCKET;
@@ -170,7 +170,7 @@ pn_socket_t pn_connect(pn_io_t *io, cons
return PN_INVALID_SOCKET;
}
- pn_socket_t sock = pn_create_socket();
+ pn_socket_t sock = pn_create_socket(addr->ai_family);
if (sock == PN_INVALID_SOCKET) {
pn_i_error_from_errno(io->error, "pn_create_socket");
return PN_INVALID_SOCKET;
@@ -195,7 +195,7 @@ pn_socket_t pn_connect(pn_io_t *io, cons
pn_socket_t pn_accept(pn_io_t *io, pn_socket_t socket, char *name, size_t size)
{
struct sockaddr_in addr = {0};
- addr.sin_family = AF_INET;
+ addr.sin_family = AF_UNSPEC;
socklen_t addrlen = sizeof(addr);
pn_socket_t sock = accept(socket, (struct sockaddr *) &addr, &addrlen);
if (sock == PN_INVALID_SOCKET) {
@@ -224,8 +224,8 @@ ssize_t pn_send(pn_io_t *io, pn_socket_t
return count;
}
-static inline int pn_create_socket(void) {
- return socket(AF_INET, SOCK_STREAM, getprotobyname("tcp")->p_proto);
+static inline int pn_create_socket(int af) {
+ return socket(af, SOCK_STREAM, getprotobyname("tcp")->p_proto);
}
#elif defined(SO_NOSIGPIPE)
ssize_t pn_send(pn_io_t *io, pn_socket_t socket, const void *buf, size_t size) {
@@ -234,8 +234,8 @@ ssize_t pn_send(pn_io_t *io, pn_socket_t
return count;
}
-static inline int pn_create_socket(void) {
- int sock = socket(AF_INET, SOCK_STREAM, getprotobyname("tcp")->p_proto);
+static inline int pn_create_socket(int af) {
+ int sock = socket(af, SOCK_STREAM, getprotobyname("tcp")->p_proto);
if (sock == -1) return sock;
int optval = 1;
Modified: qpid/proton/trunk/proton-c/src/tests/parse-url.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/tests/parse-url.c?rev=1583673&r1=1583672&r2=1583673&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/tests/parse-url.c (original)
+++ qpid/proton/trunk/proton-c/src/tests/parse-url.c Tue Apr 1 14:00:47 2014
@@ -74,6 +74,19 @@ int main(int argc, char **argv)
assert(test_url_parse("user:1243^&^:pw@host:423", 0, "user", "1243^&^:pw", "host", "423", 0));
assert(test_url_parse("user:1243^&^:pw@host:423/Foo.bar:90087", 0, "user", "1243^&^:pw", "host", "423", "Foo.bar:90087"));
assert(test_url_parse("user:1243^&^:pw@host:423/Foo.bar:90087@somewhere", 0, "user", "1243^&^:pw", "host", "423", "Foo.bar:90087@somewhere"));
+ assert(test_url_parse("[::1]", 0, 0, 0, "::1", 0, 0));
+ assert(test_url_parse("[::1]:amqp", 0, 0, 0, "::1", "amqp", 0));
+ assert(test_url_parse("user@[::1]", 0, "user", 0, "::1", 0, 0));
+ assert(test_url_parse("user@[::1]:amqp", 0, "user", 0, "::1", "amqp", 0));
+ assert(test_url_parse("user:1243^&^:pw@[::1]:amqp", 0, "user", "1243^&^:pw", "::1", "amqp", 0));
+ assert(test_url_parse("user:1243^&^:pw@[::1]:amqp/Foo.bar:90087", 0, "user", "1243^&^:pw", "::1", "amqp", "Foo.bar:90087"));
+ assert(test_url_parse("user:1243^&^:pw@[::1:amqp/Foo.bar:90087", 0, "user", "1243^&^:pw", "[", ":1:amqp", "Foo.bar:90087"));
+ assert(test_url_parse("user:1243^&^:pw@::1]:amqp/Foo.bar:90087", 0, "user", "1243^&^:pw", "", ":1]:amqp", "Foo.bar:90087"));
+ assert(test_url_parse("amqp://user@[::1]", "amqp", "user", 0, "::1", 0, 0));
+ assert(test_url_parse("amqp://user@[::1]:amqp", "amqp", "user", 0, "::1", "amqp", 0));
+ assert(test_url_parse("amqp://user@[1234:52:0:1260:f2de:f1ff:fe59:8f87]:amqp", "amqp", "user", 0, "1234:52:0:1260:f2de:f1ff:fe59:8f87", "amqp", 0));
+ assert(test_url_parse("amqp://user:1243^&^:pw@[::1]:amqp", "amqp", "user", "1243^&^:pw", "::1", "amqp", 0));
+ assert(test_url_parse("amqp://user:1243^&^:pw@[::1]:amqp/Foo.bar:90087", "amqp", "user", "1243^&^:pw", "::1", "amqp", "Foo.bar:90087"));
assert(test_url_parse("amqp://host", "amqp", 0, 0, "host", 0, 0));
assert(test_url_parse("amqp://user@host", "amqp", "user", 0, "host", 0, 0));
assert(test_url_parse("amqp://user@host/path:%", "amqp", "user", 0, "host", 0, "path:%"));
Modified: qpid/proton/trunk/proton-c/src/util.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/util.c?rev=1583673&r1=1583672&r2=1583673&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/util.c (original)
+++ qpid/proton/trunk/proton-c/src/util.c Tue Apr 1 14:00:47 2014
@@ -141,8 +141,17 @@ void pni_parse_url(char *url, char **sch
}
*host = url;
+ char *open = (*url == '[') ? url : 0;
+ if (open) {
+ char *close = strchr(open, ']');
+ if (close) {
+ *host = open + 1;
+ *close = '\0';
+ url = close + 1;
+ }
+ }
- char *colon = strchr(*host, ':');
+ char *colon = strchr(url, ':');
if (colon) {
*colon = '\0';
*port = colon + 1;
Modified: qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java?rev=1583673&r1=1583672&r2=1583673&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java (original)
+++ qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java Tue Apr 1 14:00:47 2014
@@ -87,12 +87,24 @@ class Address
hp = uphp;
}
- int colon = hp.indexOf(':');
- if (colon >= 0) {
- _host = hp.substring(0, colon);
- _port = hp.substring(colon + 1);
- } else {
- _host = hp;
+ if (hp.startsWith("[")) {
+ int close = hp.indexOf(']');
+ if (close >= 0) {
+ _host = hp.substring(1, close);
+ if (hp.substring(close + 1).startsWith(":")) {
+ _port = hp.substring(close + 2);
+ }
+ }
+ }
+
+ if (_host == null) {
+ int colon = hp.indexOf(':');
+ if (colon >= 0) {
+ _host = hp.substring(0, colon);
+ _port = hp.substring(colon + 1);
+ } else {
+ _host = hp;
+ }
}
if (_host.startsWith("~")) {
Modified: qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java?rev=1583673&r1=1583672&r2=1583673&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java (original)
+++ qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java Tue Apr 1 14:00:47 2014
@@ -24,7 +24,20 @@ public class AddressTest {
testParse("user@host", null, "user", null, "host", null, null);
testParse("user:1243^&^:pw@host:423", null, "user", "1243^&^:pw", "host", "423", null);
testParse("user:1243^&^:pw@host:423/Foo.bar:90087", null, "user", "1243^&^:pw", "host", "423", "Foo.bar:90087");
- testParse("user:1243^&^:pw@host:423/Foo.bar:90087@somewhere", null, "user", "1243^&^:pw", "host", "423", "Foo.bar:90087@somewhere");
+ testParse("user:1243^&^:pw@host:423/Foo.bar:90087@somewhere", null, "user", "1243^&^:pw", "host", "423", "Foo.bar:90087@somewhere");
+ testParse("[::1]", null, null, null, "::1", null, null);
+ testParse("[::1]:amqp", null, null, null, "::1", "amqp", null);
+ testParse("user@[::1]", null, "user", null, "::1", null, null);
+ testParse("user@[::1]:amqp", null, "user", null, "::1", "amqp", null);
+ testParse("user:1243^&^:pw@[::1]:amqp", null, "user", "1243^&^:pw", "::1", "amqp", null);
+ testParse("user:1243^&^:pw@[::1]:amqp/Foo.bar:90087", null, "user", "1243^&^:pw", "::1", "amqp", "Foo.bar:90087");
+ testParse("user:1243^&^:pw@[::1:amqp/Foo.bar:90087", null, "user", "1243^&^:pw", "[", ":1:amqp", "Foo.bar:90087");
+ testParse("user:1243^&^:pw@::1]:amqp/Foo.bar:90087", null, "user", "1243^&^:pw", "", ":1]:amqp", "Foo.bar:90087");
+ testParse("amqp://user@[::1]", "amqp", "user", null, "::1", null, null);
+ testParse("amqp://user@[::1]:amqp", "amqp", "user", null, "::1", "amqp", null);
+ testParse("amqp://user@[1234:52:0:1260:f2de:f1ff:fe59:8f87]:amqp", "amqp", "user", null, "1234:52:0:1260:f2de:f1ff:fe59:8f87", "amqp", null);
+ testParse("amqp://user:1243^&^:pw@[::1]:amqp", "amqp", "user", "1243^&^:pw", "::1", "amqp", null);
+ testParse("amqp://user:1243^&^:pw@[::1]:amqp/Foo.bar:90087", "amqp", "user", "1243^&^:pw", "::1", "amqp", "Foo.bar:90087");
testParse("amqp://host", "amqp", null, null, "host", null, null);
testParse("amqp://user@host", "amqp", "user", null, "host", null, null);
testParse("amqp://user@host/path:%", "amqp", "user", null, "host", null, "path:%");
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org