- if (!strcmp(hreq->method, "GET"))
- {
- char *db = "Default";
- const char *p0 = hreq->path, *p1;
- const char *operation = 0;
-#if HAVE_XML2
- int ret = -1;
- char *charset = 0;
- Z_SOAP *soap_package = 0;
- static Z_SOAP_Handler soap_handlers[2] = {
- {"http://www.loc.gov/zing/srw/", 0,
- (Z_SOAP_fun) yaz_srw_codec},
- {0, 0, 0}
- };
-#endif
- if (*p0 == '/')
- p0++;
- p1 = strchr(p0, '?');
- if (!p1)
- p1 = p0 + strlen(p0);
- if (p1 != p0)
- {
- db = odr_malloc(assoc->decode, p1 - p0 + 1);
- memcpy (db, p0, p1 - p0);
- db[p1 - p0] = '\0';
- }
- if (p1)
- operation = yaz_uri_val(p1, "operation", o);
- if (!operation)
- operation = "explain";
-#if HAVE_XML2
- if (p1 && !strcmp(operation, "searchRetrieve"))
- {
- Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_searchRetrieve_response);
- Z_SRW_PDU *sr = yaz_srw_get(o, Z_SRW_searchRetrieve_request);
- char *query = yaz_uri_val(p1, "query", o);
- char *pQuery = yaz_uri_val(p1, "pQuery", o);
- char *sortKeys = yaz_uri_val(p1, "sortKeys", o);
-
- if (query)
- {
- sr->u.request->query_type = Z_SRW_query_type_cql;
- sr->u.request->query.cql = query;
- }
- if (pQuery)
- {
- sr->u.request->query_type = Z_SRW_query_type_pqf;
- sr->u.request->query.pqf = pQuery;
- }
- if (sortKeys)
- {
- sr->u.request->sort_type = Z_SRW_sort_type_sort;
- sr->u.request->sort.sortKeys = sortKeys;
- }
- sr->u.request->recordSchema = yaz_uri_val(p1, "recordSchema", o);
- sr->u.request->recordPacking = yaz_uri_val(p1, "recordPacking", o);
- if (!sr->u.request->recordPacking)
- sr->u.request->recordPacking = "xml";
- yaz_uri_val_int(p1, "maximumRecords", o,
- &sr->u.request->maximumRecords);
- yaz_uri_val_int(p1, "startRecord", o,
- &sr->u.request->startRecord);
- sr->u.request->database = db;
- srw_bend_search(assoc, req, sr->u.request, res->u.response);
-
- soap_package = odr_malloc(o, sizeof(*soap_package));
- soap_package->which = Z_SOAP_generic;
-
- soap_package->u.generic =
- odr_malloc(o, sizeof(*soap_package->u.generic));
-
- soap_package->u.generic->p = res;
- soap_package->u.generic->ns = soap_handlers[0].ns;
- soap_package->u.generic->no = 0;
-
- soap_package->ns = "SRU";
-
- p = z_get_HTTP_Response(o, 200);
- hres = p->u.HTTP_Response;
-
- ret = z_soap_codec_enc(assoc->encode, &soap_package,
- &hres->content_buf, &hres->content_len,
- soap_handlers, charset);
- if (!charset)
- z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
- else
- {
- char ctype[60];
- strcpy(ctype, "text/xml; charset=");
- strcat(ctype, charset);
- z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
- }
- }
- else if (p1 && !strcmp(operation, "explain"))
- {