diff --git a/src/filter_zeerex_explain.cpp b/src/filter_zeerex_explain.cpp index a61b5c7..ed905eb 100644 --- a/src/filter_zeerex_explain.cpp +++ b/src/filter_zeerex_explain.cpp @@ -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; @@ -131,26 +131,24 @@ void yf::ZeeRexExplain::Impl::process(mp::Package &package) std::map::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); @@ -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); } diff --git a/src/sru_util.cpp b/src/sru_util.cpp index aa1b212..ceb50e9 100644 --- a/src/sru_util.cpp +++ b/src/sru_util.cpp @@ -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( "\n" " \n" @@ -119,39 +123,22 @@ bool mp_util::build_sru_explain(metaproxy_1::Package &package, + mp_util::to_string("\n" " \n" "\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, @@ -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, @@ -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) @@ -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; } diff --git a/src/sru_util.hpp b/src/sru_util.hpp index a6a9b53..d801d1c 100644 --- a/src/sru_util.hpp +++ b/src/sru_util.hpp @@ -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,