* Copyright (c) 1995-2003, Index Data
* See the file LICENSE for details.
*
- * $Id: seshigh.c,v 1.150 2003-03-20 21:15:00 adam Exp $
+ * $Id: seshigh.c,v 1.151 2003-03-24 22:26:50 adam Exp $
*/
/*
assoc->init->bend_scan = NULL;
assoc->init->bend_segment = NULL;
assoc->init->bend_fetch = NULL;
+ assoc->init->bend_explain = NULL;
+
assoc->init->charneg_request = NULL;
assoc->init->charneg_response = NULL;
+
assoc->init->decode = assoc->decode;
assoc->init->peer_name =
odr_strdup (assoc->encode, cs_addrstr(assoc->client_link));
}
}
+
+static void srw_bend_explain(association *assoc, request *req,
+ Z_SRW_explainRequest *srw_req,
+ Z_SRW_explainResponse *srw_res)
+{
+ yaz_log(LOG_LOG, "Got SRW ExplainRequest");
+ if (!assoc->init)
+ {
+ yaz_log(LOG_DEBUG, "srw_bend_init");
+ if (!srw_bend_init(assoc))
+ return;
+ }
+ if (assoc->init && assoc->init->bend_explain)
+ {
+ bend_explain_rr rr;
+
+ rr.stream = assoc->encode;
+ rr.decode = assoc->decode;
+ rr.print = assoc->print;
+ rr.explain_buf = 0;
+ (*assoc->init->bend_explain)(assoc->backend, &rr);
+ if (rr.explain_buf)
+ {
+ srw_res->explainData_buf = rr.explain_buf;
+ srw_res->explainData_len = strlen(rr.explain_buf);
+ }
+ }
+}
+
static int hex_digit (int ch)
{
if (ch >= '0' && ch <= '9')
memcpy (db, p0, p1 - p0);
db[p1 - p0] = '\0';
}
-
if (p1 && *p1 == '?' && p1[1])
{
Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_searchRetrieve_response);
if (sr->u.request->startRecord)
yaz_log(LOG_LOG, "startRecord=%d", *sr->u.request->startRecord);
sr->u.request->database = db;
- srw_bend_search(assoc, req, sr->u.request,
- res->u.response);
+ 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;
}
}
+ else
+ {
+ Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_explain_response);
+ Z_SRW_PDU *sr = yaz_srw_get(o, Z_SRW_explain_request);
+
+ srw_bend_explain(assoc, req, sr->u.explain_request,
+ res->u.explain_response);
+
+ if (res->u.explain_response->explainData_buf)
+ {
+ 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);
+ }
+ }
+ }
#ifdef DOCDIR
if (strlen(hreq->path) >= 5 && strlen(hreq->path) < 80 &&
!memcmp(hreq->path, "/doc/", 5))
}
}
#endif
+
+#if 0
if (!strcmp(hreq->path, "/"))
{
#ifdef DOCDIR
hres->content_len = strlen(hres->content_buf);
z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/html");
}
+#endif
+
if (!p)
{
p = z_get_HTTP_Response(o, 404);
{
const char *content_type = z_HTTP_header_lookup(hreq->headers,
"Content-Type");
- const char *soap_action = z_HTTP_header_lookup(hreq->headers,
- "SOAPAction");
- if (content_type && soap_action &&
- !yaz_strcmp_del("text/xml", content_type, "; "))
+ if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
{
Z_SOAP *soap_package = 0;
int ret = -1;
static Z_SOAP_Handler soap_handlers[2] = {
#if HAVE_XML2
{"http://www.loc.gov/zing/srw/v1.0/", 0,
- (Z_SOAP_fun) yaz_srw_codec},
+ (Z_SOAP_fun) yaz_srw_codec},
#endif
{0, 0, 0}
};
ret = z_soap_codec(assoc->decode, &soap_package,
&hreq->content_buf, &hreq->content_len,
soap_handlers);
-
#if HAVE_XML2
if (!ret && soap_package->which == Z_SOAP_generic &&
soap_package->u.generic->no == 0)
soap_package->u.generic->p = res;
http_code = 200;
}
+ else if (sr->which == Z_SRW_explain_request)
+ {
+ Z_SRW_PDU *res =
+ yaz_srw_get(assoc->encode, Z_SRW_explain_response);
+
+ srw_bend_explain(assoc, req, sr->u.explain_request,
+ res->u.explain_response);
+ if (!res->u.explain_response->explainData_buf)
+ {
+ z_soap_error(assoc->encode, soap_package,
+ "SOAP-ENV:Client", "Explain Not Supported", 0);
+ }
+ else
+ {
+ soap_package->u.generic->p = res;
+ http_code = 200;
+ }
+ }
+ else
+ {
+ z_soap_error(assoc->encode, soap_package,
+ "SOAP-ENV:Client", "Bad method", 0);
+ }
}
#endif
p = z_get_HTTP_Response(o, 200);
* Copyright (c) 2002-2003, Index Data.
* See the file LICENSE for details.
*
- * $Id: srw.c,v 1.11 2003-03-23 20:27:16 adam Exp $
+ * $Id: srw.c,v 1.12 2003-03-24 22:26:51 adam Exp $
*/
#include <yaz/srw.h>
{
Z_SRW_PDU **p = handler_data;
Z_SRW_explainResponse *res;
+ xmlNodePtr ptr = method->children;
*p = odr_malloc(o, sizeof(**p));
(*p)->which = Z_SRW_explain_response;
res->explainData_buf = 0;
res->explainData_len = 0;
res->explainPacking = Z_SRW_recordPacking_string;
- match_xsd_string_n(method, "explainResponse", o,
- &res->explainData_buf, &res->explainData_len);
+ for (; ptr; ptr = ptr->next)
+ {
+ match_xsd_string_n(ptr, "Explain", o,
+ &res->explainData_buf,
+ &res->explainData_len);
+ }
}
else
return -1;
xmlSetNs(ptr, ns_srw);
- if (res->explainData_buf)
- {
- xmlNodePtr t = xmlNewTextLen(res->explainData_buf,
- res->explainData_len);
- xmlAddChild(ptr, t);
- }
+ add_xsd_string_n(ptr, "Explain", res->explainData_buf,
+ res->explainData_len);
}
else
return -1;