+ else if (!yaz_matchstr(sru_method, "post"))
+ {
+ yaz_sru_post_encode(gdu->u.HTTP_Request, sr, out, charset);
+ }
+ else if (!yaz_matchstr(sru_method, "soap"))
+ {
+ yaz_sru_soap_encode(gdu->u.HTTP_Request, sr, out, charset);
+ }
+ else if (!yaz_matchstr(sru_method, "solr"))
+ {
+ yaz_solr_encode_request(gdu->u.HTTP_Request, sr, out, charset);
+ }
+
+ return send_gdu(gdu);
+}
+
+static int send_srw(Z_SRW_PDU *sr)
+{
+ char *path = yaz_encode_sru_dbpath_odr(out, databaseNames[0]);
+ return send_srw_host_path(sr, cur_host, path);
+}
+
+static int send_SRW_redirect(const char *uri, Z_HTTP_Response *cookie_hres)
+{
+ const char *username = 0;
+ const char *password = 0;
+ struct Z_HTTP_Header *h;
+ char *combined_cookies = 0;
+ int combined_cookies_len = 0;
+ Z_GDU *gdu = get_HTTP_Request_url(out, uri);
+
+ gdu->u.HTTP_Request->method = odr_strdup(out, "GET");
+ z_HTTP_header_add(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(out, &gdu->u.HTTP_Request->headers, "Cookie", combined_cookies);
+ xfree(combined_cookies);
+ }
+
+ if (auth)
+ {
+ if (auth->which == Z_IdAuthentication_open)
+ {
+ char **darray;
+ int num;
+ nmem_strsplit(out->mem, "/", auth->u.open, &darray, &num);
+ if (num >= 1)
+ username = darray[0];
+ if (num >= 2)
+ password = darray[1];
+ }
+ else if (auth->which == Z_IdAuthentication_idPass)
+ {
+ username = auth->u.idPass->userId;
+ password = auth->u.idPass->password;
+ }
+ }
+
+ if (username && password)
+ {
+ z_HTTP_header_add_basic_auth(out, &gdu->u.HTTP_Request->headers,
+ username, password);
+ }
+
+ return send_gdu(gdu);
+}
+#endif
+
+#if YAZ_HAVE_XML2
+static char *encode_SRW_term(ODR o, const char *q)
+{
+ const char *in_charset = "ISO-8859-1";
+ WRBUF w = wrbuf_alloc();
+ yaz_iconv_t cd;
+ char *res;
+ if (outputCharset)
+ in_charset = outputCharset;
+ cd = yaz_iconv_open("UTF-8", in_charset);
+ if (!cd)
+ {
+ wrbuf_destroy(w);
+ return odr_strdup(o, q);
+ }
+ wrbuf_iconv_write(w, cd, q, strlen(q));
+ if (wrbuf_len(w))
+ res = odr_strdup(o, wrbuf_cstr(w));
+ else
+ res = odr_strdup(o, q);
+ yaz_iconv_close(cd);
+ wrbuf_destroy(w);
+ return res;
+}
+
+
+static int send_SRW_scanRequest(const char *arg, Odr_int *pos, int num)
+{