20 #include <metaproxy/util.hpp>
34 Z_GDU *zgdu_req = package.request().get();
35 if (zgdu_req && zgdu_req->which == Z_GDU_HTTP_Request)
37 Z_HTTP_Request* http_req = zgdu_req->u.HTTP_Request;
38 std::string content = mp_util::http_headers_debug(*http_req);
40 mp_util::http_response(package, content, http_code);
43 package.session().close();
52 sruinfo.
host =
"localhost";
56 Z_GDU *zgdu_req = package.request().get();
57 if (zgdu_req && zgdu_req->which == Z_GDU_HTTP_Request)
59 Z_HTTP_Request* http_req = zgdu_req->u.HTTP_Request;
62 std::string http_path = http_req->path;
65 std::string::size_type ipath = http_path.rfind(
"?");
66 if (ipath != std::string::npos)
67 http_path.assign(http_path, 0, ipath);
70 if (http_path.size() > 1)
71 sruinfo.
database.assign(http_path, 1, std::string::npos);
73 std::string http_host_address
74 = mp_util::http_header_value(http_req->headers,
"Host");
76 std::string::size_type iaddress = http_host_address.rfind(
":");
77 if (iaddress != std::string::npos)
79 sruinfo.
host.assign(http_host_address, 0, iaddress);
80 sruinfo.
port.assign(http_host_address, iaddress + 1,
95 metaproxy_1::odr &odr_en,
96 Z_SRW_PDU *sru_pdu_res,
98 const xmlNode *explain,
99 Z_SRW_explainRequest
const *er_req)
103 std::string explain_xml;
108 = mp_util::to_string(
110 " <serverInfo protocol='SRU'>\n"
113 + mp_util::to_string(
"</host>\n"
116 + mp_util::to_string(
"</port>\n"
119 + mp_util::to_string(
"</database>\n"
125 xmlNode *tmp = xmlCopyNode((xmlNode*) explain, 1);
126 xmlBufferPtr buf = xmlBufferCreate();
127 xmlNodeDump(buf, tmp->doc, tmp, 2, 1);
130 explain_xml.assign((
const char*)buf->content, 0, buf->use);
136 int record_packing = Z_SRW_recordPacking_XML;
137 if (er_req && er_req->recordPacking &&
's' == *(er_req->recordPacking))
138 record_packing = Z_SRW_recordPacking_string;
141 Z_SRW_explainResponse *sru_res = sru_pdu_res->u.explain_response;
145 sru_res->record.recordPosition = odr_intdup(odr_en, 1);
146 sru_res->record.recordPacking = record_packing;
147 sru_res->record.recordSchema = (
char *)
xmlns_explain.c_str();
148 sru_res->record.recordData_len = 1 + explain_xml.size();
149 sru_res->record.recordData_buf
150 = odr_strdupn(odr_en, (
const char *)explain_xml.c_str(),
151 1 + explain_xml.size());
160 const Z_SRW_PDU *sru_pdu_res,
162 const char *stylesheet)
172 Z_GDU *zgdu_req = package.request().get();
173 if (zgdu_req && zgdu_req->which == Z_GDU_HTTP_Request)
176 = odr_en.create_HTTP_Response(package.session(),
177 zgdu_req->u.HTTP_Request,
181 Z_HTTP_Response * http_res = zgdu_res->u.HTTP_Response;
184 std::string ctype(
"text/xml");
187 ctype +=
"; charset=";
191 z_HTTP_header_add(odr_en,
192 &http_res->headers,
"Content-Type", ctype.c_str());
195 static Z_SOAP_Handler soap_handlers[4] = {
196 {(
char *)YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec},
197 {(
char *)YAZ_XMLNS_SRU_v1_0, 0, (Z_SOAP_fun) yaz_srw_codec},
198 {(
char *)YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec},
204 if (stylesheet && *stylesheet ==
'\0')
209 soap->u.generic->p = (
void*) sru_pdu_res;
211 z_soap_codec_enc_xsl(odr_en, &soap,
212 &http_res->content_buf, &http_res->content_len,
213 soap_handlers, charset, stylesheet);
216 package.response() = zgdu_res;
219 package.session().close();
228 Z_SRW_diagnostic **diagnostic,
233 Z_GDU *zgdu_req = package.request().get();
234 Z_SRW_PDU *sru_pdu_req = 0;
239 if (!zgdu_req || !(zgdu_req->which == Z_GDU_HTTP_Request))
244 Z_HTTP_Request* http_req = zgdu_req->u.HTTP_Request;
250 if (0 == yaz_sru_decode(http_req, &sru_pdu_req, soap,
252 diagnostic, num_diagnostic))
256 else if (0 == yaz_srw_decode(http_req, &sru_pdu_req, soap,
262 package.session().close();
272 Z_SRW_PDU *sru_pdu_res,
273 Z_SRW_searchRetrieveRequest
const *sr_req)
277 yaz_add_srw_diagnostic(odr_en,
278 &(sru_pdu_res->u.response->diagnostics),
279 &(sru_pdu_res->u.response->num_diagnostics),
280 YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED,
282 yaz_add_srw_diagnostic(odr_en,
283 &(sru_pdu_res->u.response->diagnostics),
284 &(sru_pdu_res->u.response->num_diagnostics),
285 YAZ_SRW_QUERY_SYNTAX_ERROR,
286 "CQL query is empty");
299 Z_ElementSetNames *esn
300 = (Z_ElementSetNames *) odr_malloc(odr_en,
sizeof(Z_ElementSetNames));
301 esn->which = Z_ElementSetNames_generic;
302 esn->u.generic = odr_strdup(odr_en, schema);
311 switch (srw_pdu.which)
313 case Z_SRW_searchRetrieve_request:
314 os <<
" " <<
"searchRetrieveRequest";
316 Z_SRW_searchRetrieveRequest *sr = srw_pdu.u.request;
320 os <<
" " << (sr->database);
324 os <<
" " << *(sr->startRecord);
327 if (sr->maximumRecords)
328 os <<
" " << *(sr->maximumRecords);
331 if (sr->recordPacking)
332 os <<
" " << (sr->recordPacking);
336 if (sr->recordSchema)
337 os <<
" " << (sr->recordSchema);
340 os <<
" " << (sr->queryType ? sr->queryType :
"cql")
345 case Z_SRW_searchRetrieve_response:
346 os <<
" " <<
"searchRetrieveResponse";
348 Z_SRW_searchRetrieveResponse *sr = srw_pdu.u.response;
351 if (! (sr->num_diagnostics))
354 if (sr->numberOfRecords)
355 os <<
" " << *(sr->numberOfRecords);
359 os <<
" " << (sr->num_records);
362 if (sr->nextRecordPosition)
363 os <<
" " << *(sr->nextRecordPosition);
370 if (sr->diagnostics && sr->diagnostics->uri)
371 os <<
" " << (sr->diagnostics->uri);
374 if (sr->diagnostics && sr->diagnostics->message)
375 os <<
" " << (sr->diagnostics->message);
378 if (sr->diagnostics && sr->diagnostics->details)
379 os <<
" " << (sr->diagnostics->details);
388 case Z_SRW_explain_request:
389 os <<
" " <<
"explainRequest";
391 case Z_SRW_explain_response:
392 os <<
" " <<
"explainResponse";
394 case Z_SRW_scan_request:
395 os <<
" " <<
"scanRequest";
397 case Z_SRW_scan_response:
398 os <<
" " <<
"scanResponse";
400 case Z_SRW_update_request:
401 os <<
" " <<
"updateRequest";
403 case Z_SRW_update_response:
404 os <<
" " <<
"updateResponse";
407 os <<
" " <<
"UNKNOWN";
std::ostream & operator<<(std::ostream &os, Z_GDU &zgdu)
const std::string xmlns_explain("http://explain.z3950.org/dtd/2.0/")