From fe42f72dc30321041420cf2d1a83867b1c450f38 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 23 Oct 2012 13:36:29 +0200 Subject: [PATCH 1/1] Allow HTTP protocol on unix local socket Allow also Z39.50 database to be given for unix local socket. The COMSTACK string for doing so is: unix:: Examples: unix:/myfile:tcp:localhost:9999/mybase unix:/myfile:localhost:9999/mybase unix:/myfile:http://fakehost/mybase The fakehost is parsed in Host HTTP-header. --- src/comstack.c | 63 +++++++++++++++++++++++++++++++++++++++----------------- src/zoom-c.c | 9 +------- 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/comstack.c b/src/comstack.c index cf1d4b6..cec2fd3 100644 --- a/src/comstack.c +++ b/src/comstack.c @@ -68,7 +68,15 @@ void cs_get_host_args(const char *type_and_host, const char **args) { *args = ""; - if (*type_and_host && strncmp(type_and_host, "unix:", 5)) + if (!strncmp(type_and_host, "unix:", 5)) + { + const char *cp = strchr(type_and_host + 5, ':'); + if (cp) + type_and_host = cp + 1; + else + type_and_host += strlen(type_and_host); /* empty string */ + } + if (*type_and_host) { const char *cp; cp = strstr(type_and_host, "://"); @@ -87,22 +95,51 @@ static int cs_parse_host(const char *uri, const char **host, char **connect_host) { *connect_host = 0; + + *t = tcpip_type; if (strncmp(uri, "connect:", 8) == 0) { const char *cp = strchr(uri, ','); if (cp) { - size_t len = cp - (uri + 8); - *connect_host = (char *) xmalloc(len+1); - memcpy(*connect_host, uri + 8, len); + size_t len; + + uri += 8; + len = cp - uri; + *connect_host = (char *) xmalloc(len + 1); + memcpy(*connect_host, uri, len); + (*connect_host)[len] = '\0'; + uri = cp + 1; + } + } + else if (strncmp(uri, "unix:", 5) == 0) + { + const char *cp; + + uri += 5; + cp = strchr(uri, ':'); + if (cp) + { + size_t len = cp - uri; + *connect_host = (char *) xmalloc(len + 1); + memcpy(*connect_host, uri, len); (*connect_host)[len] = '\0'; - uri = cp+1; + uri = cp + 1; + } + else + { + *connect_host = xstrdup(uri); + uri += strlen(uri); /* set to "" */ } +#ifdef WIN32 + return 0; +#else + *t = unix_type; +#endif } if (strncmp (uri, "tcp:", 4) == 0) { - *t = tcpip_type; *host = uri + 4; *proto = PROTO_Z3950; } @@ -116,19 +153,8 @@ static int cs_parse_host(const char *uri, const char **host, return 0; #endif } - else if (strncmp (uri, "unix:", 5) == 0) - { -#ifndef WIN32 - *t = unix_type; - *host = uri + 5; - *proto = PROTO_Z3950; -#else - return 0; -#endif - } else if (strncmp(uri, "http:", 5) == 0) { - *t = tcpip_type; *host = uri + 5; while (**host == '/') (*host)++; @@ -148,9 +174,8 @@ static int cs_parse_host(const char *uri, const char **host, } else { - *proto = PROTO_Z3950; - *t = tcpip_type; *host = uri; + *proto = PROTO_Z3950; } return 1; } diff --git a/src/zoom-c.c b/src/zoom-c.c index 37c866c..2445215 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -329,14 +329,7 @@ char **ZOOM_connection_get_databases(ZOOM_connection con, ZOOM_options options, const char *cp = ZOOM_options_get(options, "databaseName"); if ((!cp || !*cp) && con->host_port) - { - if (strncmp(con->host_port, "unix:", 5) == 0) - cp = strchr(con->host_port+5, ':'); - else - cp = strchr(con->host_port, '/'); - if (cp) - cp++; - } + cs_get_host_args(con->host_port, &cp); if (!cp || !*cp) cp = "Default"; nmem_strsplit(odr_getmem(odr), "+", cp, &databaseNames, num); -- 1.7.10.4