Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 14 additions & 28 deletions src/filter_zeerex_explain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,13 @@ void yf::ZeeRexExplain::Impl::process(mp::Package &package)
Z_GDU *zgdu_req = package.request().get();

// ignoring all non HTTP_Request packages
if (!zgdu_req || !(zgdu_req->which == Z_GDU_HTTP_Request)){
if (zgdu_req == 0 || zgdu_req->which != Z_GDU_HTTP_Request)
{
package.move();
return;
}

// only working on HTTP_Request packages now

mp::odr odr_de(ODR_DECODE);
Z_SRW_PDU *sru_pdu_req = 0;

Expand All @@ -131,26 +131,24 @@ void yf::ZeeRexExplain::Impl::process(mp::Package &package)
std::map<std::string, const xmlNode *>::iterator idbexp;
idbexp = m_database_explain.find(sruinfo.database);

if (idbexp == m_database_explain.end()) {
if (idbexp == m_database_explain.end())
{
// need to emit error ?? or just let package pass ??
package.move();
return;
}
explainnode = idbexp->second;

// if SRU package could not be decoded, send minimal explain and
// close connection

Z_SOAP *soap = 0;
char *charset = 0;
char *stylesheet = 0;
Z_SRW_diagnostic *diagnostic = 0;
int num_diagnostic = 0;

if (! (sru_pdu_req = mp_util::decode_sru_request(
if ((sru_pdu_req = mp_util::decode_sru_request(
package, odr_de, odr_en,
&diagnostic, &num_diagnostic, &soap,
charset)))
charset)) == 0)
{
mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
sruinfo, explainnode);
Expand All @@ -159,33 +157,21 @@ void yf::ZeeRexExplain::Impl::process(mp::Package &package)
package.session().close();
return;
}


if (sru_pdu_req->which != Z_SRW_explain_request)
{
// Let pass all other SRU actions
// Let pass all other SRU actions
package.move();
return;
}
// except valid SRU explain request, construct ZeeRex Explain response
else
{
Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request;
Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request;

sru_pdu_res->u.explain_response->diagnostics = diagnostic;
sru_pdu_res->u.explain_response->num_diagnostics = num_diagnostic;
//mp_util::build_simple_explain(package, odr_en, sru_pdu_res,
// sruinfo, er_req);
mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
sruinfo, explainnode, er_req);
mp_util::build_sru_response(package, odr_en, soap,
sru_pdu_res, charset, stylesheet);
return;
}
sru_pdu_res->u.explain_response->diagnostics = diagnostic;
sru_pdu_res->u.explain_response->num_diagnostics = num_diagnostic;

// should never arrive here
package.session().close();
return;
mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
sruinfo, explainnode, er_req);
mp_util::build_sru_response(package, odr_en, soap,
sru_pdu_res, charset, stylesheet);
}


Expand Down
138 changes: 60 additions & 78 deletions src/sru_util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,29 +82,33 @@ mp_util::SRUServerInfo mp_util::get_sru_server_info(mp::Package &package)
}
}
}

//std::cout << "sruinfo.database " << sruinfo.database << "\n";
//std::cout << "sruinfo.host " << sruinfo.host << "\n";
//std::cout << "sruinfo.port " << sruinfo.port << "\n";

return sruinfo;
}


bool mp_util::build_sru_explain(metaproxy_1::Package &package,
void mp_util::build_sru_explain(metaproxy_1::Package &package,
metaproxy_1::odr &odr_en,
Z_SRW_PDU *sru_pdu_res,
SRUServerInfo sruinfo,
const xmlNode *explain,
Z_SRW_explainRequest const *er_req)
{
// z3950'fy recordPacking
int record_packing = Z_SRW_recordPacking_XML;
if (er_req && er_req->recordPacking && 's' == *(er_req->recordPacking))
record_packing = Z_SRW_recordPacking_string;

// preparing explain record insert
Z_SRW_explainResponse *sru_res = sru_pdu_res->u.explain_response;

// building SRU explain record
std::string explain_xml;
// inserting one and only explain record
sru_res->record.recordPosition = odr_intdup(odr_en, 1);
sru_res->record.recordPacking = record_packing;
sru_res->record.recordSchema = odr_strdup(odr_en, xmlns_explain.c_str());

if (explain == 0)
if (explain == 0 || explain->doc == 0)
{
explain_xml
std::string explain_xml
= mp_util::to_string(
"<explain xmlns=\"" + xmlns_explain + "\">\n"
" <serverInfo protocol='SRU'>\n"
Expand All @@ -119,39 +123,22 @@ bool mp_util::build_sru_explain(metaproxy_1::Package &package,
+ mp_util::to_string("</database>\n"
" </serverInfo>\n"
"</explain>\n");

sru_res->record.recordData_len = explain_xml.size();
sru_res->record.recordData_buf = odr_strdup(odr_en, explain_xml.c_str());
}
else
{
xmlNode *tmp = xmlCopyNode((xmlNode*) explain, 1);
xmlNode *tmp = xmlCopyNode((xmlNode *) explain, 1);
xmlBufferPtr buf = xmlBufferCreate();
xmlNodeDump(buf, tmp->doc, tmp, 2, 1);
xmlFreeNode(tmp);

explain_xml.assign((const char*)buf->content, 0, buf->use);
sru_res->record.recordData_len = buf->use;
sru_res->record.recordData_buf = odr_strdupn(odr_en, (const char *) buf->content, buf->use);
xmlBufferFree(buf);
}


// z3950'fy recordPacking
int record_packing = Z_SRW_recordPacking_XML;
if (er_req && er_req->recordPacking && 's' == *(er_req->recordPacking))
record_packing = Z_SRW_recordPacking_string;

// preparing explain record insert
Z_SRW_explainResponse *sru_res = sru_pdu_res->u.explain_response;

// inserting one and only explain record

sru_res->record.recordPosition = odr_intdup(odr_en, 1);
sru_res->record.recordPacking = record_packing;
sru_res->record.recordSchema = odr_strdup(odr_en, xmlns_explain.c_str());
sru_res->record.recordData_len = explain_xml.size();
sru_res->record.recordData_buf = odr_strdupn(odr_en, (const char *)explain_xml.c_str(), explain_xml.size());

return true;
}


bool mp_util::build_sru_response(mp::Package &package,
mp::odr &odr_en,
Z_SOAP *soap,
Expand All @@ -160,57 +147,56 @@ bool mp_util::build_sru_response(mp::Package &package,
const char *stylesheet)
{
Z_GDU *zgdu_req = package.request().get();
if (zgdu_req && zgdu_req->which == Z_GDU_HTTP_Request)
if (zgdu_req && zgdu_req->which != Z_GDU_HTTP_Request)
{
Z_GDU *zgdu_res //= z_get_HTTP_Response(odr_en, 200);
= odr_en.create_HTTP_Response(package.session(),
zgdu_req->u.HTTP_Request,
200);
package.session().close();
return false;
}

// adding HTTP response code and headers
Z_HTTP_Response * http_res = zgdu_res->u.HTTP_Response;
//http_res->code = http_code;
Z_GDU *zgdu_res //= z_get_HTTP_Response(odr_en, 200);
= odr_en.create_HTTP_Response(package.session(),
zgdu_req->u.HTTP_Request,
200);

std::string ctype("text/xml");
if (charset)
{
ctype += "; charset=";
ctype += charset;
}
// adding HTTP response code and headers
Z_HTTP_Response * http_res = zgdu_res->u.HTTP_Response;
//http_res->code = http_code;

z_HTTP_header_add(odr_en,
&http_res->headers, "Content-Type", ctype.c_str());
std::string ctype("text/xml");
if (charset)
{
ctype += "; charset=";
ctype += charset;
}

// packaging Z_SOAP into HTML response
static Z_SOAP_Handler soap_handlers[4] = {
{(char *)YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec},
{(char *)YAZ_XMLNS_SRU_v1_0, 0, (Z_SOAP_fun) yaz_srw_codec},
{(char *)YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec},
{0, 0, 0}
};
z_HTTP_header_add(odr_en,
&http_res->headers, "Content-Type", ctype.c_str());

// packaging Z_SOAP into HTML response
static Z_SOAP_Handler soap_handlers[4] = {
{(char *)YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec},
{(char *)YAZ_XMLNS_SRU_v1_0, 0, (Z_SOAP_fun) yaz_srw_codec},
{(char *)YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec},
{0, 0, 0}
};

// empty stylesheet means NO stylesheet
if (stylesheet && *stylesheet == '\0')
stylesheet = 0;

// encoding SRU package
// empty stylesheet means NO stylesheet
if (stylesheet && *stylesheet == '\0')
stylesheet = 0;

soap->u.generic->p = (void*) sru_pdu_res;
//int ret =
z_soap_codec_enc_xsl(odr_en, &soap,
&http_res->content_buf, &http_res->content_len,
soap_handlers, charset, stylesheet);
// encoding SRU package
soap->u.generic->p = (void*) sru_pdu_res;
//int ret =
z_soap_codec_enc_xsl(odr_en, &soap,
&http_res->content_buf, &http_res->content_len,
soap_handlers, charset, stylesheet);

package.response() = zgdu_res;
return true;
}
package.session().close();
return false;
package.response() = zgdu_res;
return true;
}



Z_SRW_PDU * mp_util::decode_sru_request(mp::Package &package,
mp::odr &odr_de,
mp::odr &odr_en,
Expand All @@ -225,10 +211,8 @@ Z_SRW_PDU * mp_util::decode_sru_request(mp::Package &package,
//assert((zgdu_req->which == Z_GDU_HTTP_Request));

//ignoring all non HTTP_Request packages
if (!zgdu_req || !(zgdu_req->which == Z_GDU_HTTP_Request))
{
if (zgdu_req == 0 || zgdu_req->which != Z_GDU_HTTP_Request)
return 0;
}

Z_HTTP_Request* http_req = zgdu_req->u.HTTP_Request;
if (! http_req)
Expand All @@ -244,12 +228,10 @@ Z_SRW_PDU * mp_util::decode_sru_request(mp::Package &package,
}
else if (0 == yaz_srw_decode(http_req, &sru_pdu_req, soap,
odr_de, &charset))
return sru_pdu_req;
else
{
package.session().close();
return 0;
return sru_pdu_req;
}
package.session().close();
return 0;
}

Expand Down
13 changes: 1 addition & 12 deletions src/sru_util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,25 +39,14 @@ namespace metaproxy_1 {

class SRUServerInfo;

// std::string sru_protocol(const Z_HTTP_Request &http_req);
// std::string debug_http(const Z_HTTP_Request &http_req);
// void http_response(mp::Package &package,
// const std::string &content,
// int http_code = 200);

bool build_sru_debug_package(metaproxy_1::Package &package);

SRUServerInfo get_sru_server_info(metaproxy_1::Package &package);
// Z_SRW_explainRequest
//const *er_req);

// bool build_simple_explain(metaproxy_1::Package &package,
// metaproxy_1::odr &odr_en,
// Z_SRW_PDU *sru_pdu_res,
// SRUServerInfo sruinfo,
// Z_SRW_explainRequest const *er_req = 0);

bool build_sru_explain(metaproxy_1::Package &package,
void build_sru_explain(metaproxy_1::Package &package,
metaproxy_1::odr &odr_en,
Z_SRW_PDU *sru_pdu_res,
SRUServerInfo sruinfo,
Expand Down