Prefix URL with http:// if sru setting hints SRU/Solr mode YAZ-731
[yaz-moved-to-github.git] / src / zoom-c.c
index b162b6d..c3d7f0c 100644 (file)
@@ -370,6 +370,7 @@ ZOOM_API(void)
                             const char *host, int portnum)
 {
     const char *val;
+    const char *http_lead;
 
     initlog();
 
@@ -436,17 +437,25 @@ ZOOM_API(void)
     else
         c->lang = 0;
 
+    val = ZOOM_options_get(c->options, "sru");
+    if (val && *val && !strstr(host, "://"))
+        http_lead = "http://";
+    else
+        http_lead = "";
+    c->sru_mode = get_sru_mode_from_string(val);
+
     if (host)
     {
+        char hostn[128];
         xfree(c->host_port);
         if (portnum)
         {
-            char hostn[128];
             sprintf(hostn, "%.80s:%d", host, portnum);
-            c->host_port = xstrdup(hostn);
+            host = hostn;
         }
-        else
-            c->host_port = xstrdup(host);
+        c->host_port = xmalloc(strlen(host) + strlen(http_lead) + 1);
+        strcpy(c->host_port, http_lead);
+        strcat(c->host_port, host);
     }
 
     {
@@ -482,9 +491,6 @@ ZOOM_API(void)
         }
     }
 
-    val = ZOOM_options_get(c->options, "sru");
-    c->sru_mode = get_sru_mode_from_string(val);
-
     xfree(c->sru_version);
     val = ZOOM_options_get(c->options, "sru_version");
     c->sru_version = xstrdup(val ? val : "1.2");
@@ -1555,26 +1561,13 @@ static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres)
         {
             /* since redirect may change host we just reconnect. A smarter
                implementation might check whether it's the same server */
-            if (*location != '/')
-            {
-                /* full header */
-                do_connect_host(c, location);
-                send_HTTP_redirect(c, location);
-            }
-            else
-            {  /* relative header - same host */
-                char *args = 0;
-                char *nlocation = odr_malloc(c->odr_in, strlen(location)
-                                             + strlen(c->host_port) + 3);
-                strcpy(nlocation, c->host_port);
-                cs_get_host_args(nlocation, (const char **) &args);
-                if (!args || !*args)
-                    args = nlocation + strlen(nlocation);
-                else
-                    args--;
-                strcpy(args, location);
-                send_HTTP_redirect(c, nlocation);
-            }
+
+            int host_change = 0;
+            location = yaz_check_location(c->odr_in, c->host_port,
+                                          location, &host_change);
+            if (do_connect_host(c, location) == zoom_complete)
+                return;  /* connect failed.. */
+            send_HTTP_redirect(c, location);
             return;
         }
     }