- if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
- {
- Z_SOAP *soap_package = 0;
- ODR o = c->odr_in;
- Z_SOAP_Handler soap_handlers[2] = {
- {"http://www.loc.gov/zing/srw/", 0,
- (Z_SOAP_fun) yaz_srw_codec},
- {0, 0, 0}
- };
- ret = z_soap_codec(o, &soap_package,
- &hres->content_buf, &hres->content_len,
- soap_handlers);
- if (!ret && soap_package->which == Z_SOAP_generic &&
- soap_package->u.generic->no == 0)
- {
- Z_SRW_PDU *sr = (Z_SRW_PDU*) soap_package->u.generic->p;
- if (sr->which == Z_SRW_searchRetrieve_response)
- handle_srw_response(c, sr->u.response);
- else
- ret = -1;
- }
- else if (!ret && (soap_package->which == Z_SOAP_fault
- || soap_package->which == Z_SOAP_error))
- {
- set_HTTP_error(c, hres->code,
- soap_package->u.fault->fault_code,
- soap_package->u.fault->fault_string);
- }
+ if (!c->tasks || c->tasks->which != ZOOM_TASK_SCAN)
+ return;
+ scan = c->tasks->u.scan.scan;
+
+ if (res->num_diagnostics > 0)
+ set_SRU_error(c, &res->diagnostics[0]);
+
+ scan->scan_response = 0;
+ scan->srw_scan_response = res;
+ nmem_transfer(odr_getmem(scan->odr), nmem);
+
+ ZOOM_options_set_int(scan->options, "number", res->num_terms);
+ nmem_destroy(nmem);
+}
+#endif
+
+#if YAZ_HAVE_XML2
+static Z_GDU *get_HTTP_Request_url(ODR odr, const char *url)
+{
+ Z_GDU *p = z_get_HTTP_Request(odr);
+ const char *host = url;
+ const char *cp0 = strstr(host, "://");
+ const char *cp1 = 0;
+ if (cp0)
+ cp0 = cp0+3;
+ else
+ cp0 = host;
+
+ cp1 = strchr(cp0, '/');
+ if (!cp1)
+ cp1 = cp0 + strlen(cp0);
+
+ if (cp0 && cp1)
+ {
+ char *h = (char*) odr_malloc(odr, cp1 - cp0 + 1);
+ memcpy (h, cp0, cp1 - cp0);
+ h[cp1-cp0] = '\0';
+ z_HTTP_header_add(odr, &p->u.HTTP_Request->headers, "Host", h);
+ }
+ p->u.HTTP_Request->path = odr_strdup(odr, *cp1 ? cp1 : "/");
+ return p;
+}
+
+static zoom_ret send_SRW_redirect(ZOOM_connection c, const char *uri,
+ Z_HTTP_Response *cookie_hres)
+{
+ struct Z_HTTP_Header *h;
+ Z_GDU *gdu = get_HTTP_Request_url(c->odr_out, uri);
+ char *combined_cookies;
+ int combined_cookies_len = 0;
+
+ gdu->u.HTTP_Request->method = odr_strdup(c->odr_out, "GET");
+ z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers, "Accept",
+ "text/xml");
+
+ for (h = cookie_hres->headers; h; h = h->next)
+ {
+ if (!strcmp(h->name, "Set-Cookie"))
+ {
+ char *cp;
+
+ if (!(cp = strchr(h->value, ';')))
+ cp = h->value + strlen(h->value);
+ if (cp - h->value >= 1) {
+ combined_cookies = xrealloc(combined_cookies, combined_cookies_len + cp - h->value + 3);
+ memcpy(combined_cookies+combined_cookies_len, h->value, cp - h->value);
+ combined_cookies[combined_cookies_len + cp - h->value] = '\0';
+ strcat(combined_cookies,"; ");
+ combined_cookies_len = strlen(combined_cookies);
+ }
+ }
+ }
+
+ if (combined_cookies_len)
+ {
+ z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
+ "Cookie", combined_cookies);
+ xfree(combined_cookies);
+ }
+
+ if (c->user && c->password)
+ {
+ z_HTTP_header_add_basic_auth(c->odr_out, &gdu->u.HTTP_Request->headers,
+ c->user, c->password);
+ }
+ if (!z_GDU(c->odr_out, &gdu, 0, 0))
+ return zoom_complete;
+ if (c->odr_print)
+ z_GDU(c->odr_print, &gdu, 0, 0);
+ c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
+
+ odr_reset(c->odr_out);
+ return do_write(c);
+}
+
+static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres)
+{
+ zoom_ret cret = zoom_complete;
+ int ret = -1;
+ const char *addinfo = 0;
+ const char *connection_head = z_HTTP_header_lookup(hres->headers,
+ "Connection");
+ const char *location;
+
+ ZOOM_connection_set_mask(c, 0);
+ yaz_log(log_details, "%p handle_http", c);
+
+ if ((hres->code == 301 || hres->code == 302) && c->sru_mode == zoom_sru_get
+ && (location = z_HTTP_header_lookup(hres->headers, "Location")))
+ {
+ c->no_redirects++;
+ if (c->no_redirects > 10)
+ {
+ set_HTTP_error(c, hres->code, 0, 0);
+ c->no_redirects = 0;
+ do_close(c);
+ }