summaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_http_common.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-01-18 11:07:46 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-01-18 11:07:46 +0000
commitdc8ac5f2e7117530a72cb972405aa7aea15d8a06 (patch)
tree3c9bbe7ef44fa80e7cb14df506d9c513a6249aec /src/transport/plugin_transport_http_common.c
parent4e12d1273df471ee0e79c996601eb4bbe3f1231b (diff)
address parsing
Diffstat (limited to 'src/transport/plugin_transport_http_common.c')
-rw-r--r--src/transport/plugin_transport_http_common.c108
1 files changed, 79 insertions, 29 deletions
diff --git a/src/transport/plugin_transport_http_common.c b/src/transport/plugin_transport_http_common.c
index 0c9bfffc8..5c6d19791 100644
--- a/src/transport/plugin_transport_http_common.c
+++ b/src/transport/plugin_transport_http_common.c
@@ -27,13 +27,14 @@
#include "platform.h"
#include "gnunet_common.h"
#include "gnunet_transport_plugin.h"
+#include "plugin_transport_http_common.h"
struct SplittedHTTPAddress
{
- char *protocoll;
+ char *protocol;
char *host;
- char *port;
char *path;
+ int port;
};
struct SplittedHTTPAddress *
@@ -41,14 +42,17 @@ http_split_address (const char * addr)
{
struct SplittedHTTPAddress *sp;
char *src = GNUNET_strdup (addr);
- char *protocoll_start = NULL;
+ char *protocol_start = NULL;
char *host_start = NULL;
+ char *v6_end = NULL;
char *port_start = NULL;
char *path_start = NULL;
- protocoll_start = src;
+ protocol_start = src;
sp = GNUNET_malloc (sizeof (struct SplittedHTTPAddress));
+ /* Address string consists of protocol://host[:port]path*/
+
host_start = strstr (src, "://");
if (NULL == host_start)
{
@@ -58,47 +62,94 @@ http_split_address (const char * addr)
}
host_start[0] = '\0';
- sp->protocoll = GNUNET_strdup (protocoll_start);
+ sp->protocol = GNUNET_strdup (protocol_start);
host_start += strlen ("://");
if (strlen (host_start) == 0)
- if (NULL == host_start)
{
GNUNET_free (src);
+ GNUNET_free (sp->protocol);
GNUNET_free (sp);
return NULL;
}
- port_start = strstr (host_start, ":");
- if (NULL == port_start)
+
+ /* Find path start */
+ path_start = strchr (host_start, '/');
+ if (NULL != path_start)
{
- path_start = strstr (host_start, "/");
+ sp->path = GNUNET_strdup (path_start);
+ path_start[0] = '\0';
}
else
+ sp->path = GNUNET_strdup ("");
+
+ if (strlen(host_start) < 1)
{
- port_start[0] = '\0';
- port_start ++;
- sp->host = GNUNET_strdup (host_start);
- path_start = strstr (port_start, "/");
+ GNUNET_free (src);
+ GNUNET_free (sp->protocol);
+ GNUNET_free (sp->path);
+ GNUNET_free (sp);
+ return NULL;
}
- if (NULL == path_start)
- {
- if (NULL != port_start)
- sp->port = GNUNET_strdup (port_start);
- sp->path = NULL;
- }
- else
+ if (NULL != (port_start = strrchr (host_start, ':')))
{
- if (NULL != port_start)
+ /* *We COULD have a port, but also an IPv6 address! */
+ if (NULL != (v6_end = strchr(host_start, ']')))
+ {
+ if (v6_end < port_start)
+ {
+ /* IPv6 address + port */
+ port_start[0] = '\0';
+ port_start ++;
+ sp->port = atoi (port_start);
+ }
+ else
+ {
+ /* IPv6 address + no port */
+ if (0 == strcmp(sp->protocol, "https"))
+ sp->port = HTTPS_DEFAULT_PORT;
+ else if (0 == strcmp(sp->protocol, "http"))
+ sp->port = HTTP_DEFAULT_PORT;
+ }
+ }
+ else
{
- path_start[0] = '\0';
- sp->port = GNUNET_strdup (port_start);
- path_start[0] = '/';
+ /* No IPv6 address */
+ port_start[0] = '\0';
+ port_start ++;
+ sp->port = atoi (port_start);
}
- sp->path = GNUNET_strdup(path_start);
}
- GNUNET_free (src);
- fprintf (stderr, "protocoll: `%s', host `%s' port `%s' path `%s'\n", sp->protocoll, sp->host, sp->port, sp->path);
+ else
+ {
+ /* No ':' as port separator, default port for protocol */
+ if (0 == strcmp(sp->protocol, "https"))
+ sp->port = HTTPS_DEFAULT_PORT;
+ else if (0 == strcmp(sp->protocol, "http"))
+ sp->port = HTTP_DEFAULT_PORT;
+ else
+ {
+ GNUNET_break (0);
+ GNUNET_free (src);
+ GNUNET_free (sp->protocol);
+ GNUNET_free (sp->path);
+ GNUNET_free (sp);
+ return NULL;
+ }
+ }
+ if (strlen (host_start) > 0)
+ sp->host = GNUNET_strdup (host_start);
+ else
+ {
+ GNUNET_break (0);
+ GNUNET_free (src);
+ GNUNET_free (sp->protocol);
+ GNUNET_free (sp->path);
+ GNUNET_free (sp);
+ return NULL;
+ }
+ //fprintf (stderr, "addr: `%s' protocol: `%s', host `%s' port `%u' path `%s'\n", addr, sp->protocol, sp->host, sp->port, sp->path);
return sp;
}
@@ -133,7 +184,6 @@ http_common_plugin_address_pretty_printer (void *cls, const char *type,
asc (asc_cls, NULL);
return;
}
- http_split_address (addr);
asc (asc_cls, saddr);
asc (asc_cls, NULL);
}
@@ -314,7 +364,7 @@ http_common_address_get_size (const void *addr)
* @param addrlen2 address 2 length
* @return GNUNET_YES if equal, GNUNET_NO if not, GNUNET_SYSERR on error
*/
-int
+size_t
http_common_cmp_addresses (const void *addr1, size_t addrlen1, const void *addr2, size_t addrlen2)
{
const char *a1 = (const char *) addr1;