Allow HTTP protocol on unix local socket
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 23 Oct 2012 11:36:29 +0000 (13:36 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 23 Oct 2012 11:40:48 +0000 (13:40 +0200)
Allow also Z39.50 database to be given for unix local socket.
The COMSTACK string for doing so is:
unix:<spec>:<uri>
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
src/zoom-c.c

index cf1d4b6..cec2fd3 100644 (file)
@@ -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;
 }
index 37c866c..2445215 100644 (file)
@@ -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);