+ yaz_sru_get_encode(gdu->u.HTTP_Request, sr, out, charset);
+ }
+ 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, wrbuf_cstr(cur_host), path);
+}
+
+static int send_SRW_redirect(const char *uri)
+{
+ const char *username = 0;
+ const char *password = 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");
+
+ yaz_cookies_request(yaz_cookies, out, gdu->u.HTTP_Request);
+ 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)
+{
+ Z_SRW_PDU *sr = 0;
+
+ /* regular requestse .. */
+ sr = yaz_srw_get_pdu(out, Z_SRW_scan_request, sru_version);
+
+ switch (queryType)
+ {
+ case QueryType_CQL:
+ sr->u.scan_request->queryType = "cql";
+ sr->u.scan_request->scanClause = encode_SRW_term(out, arg);