X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsru_util.cpp;h=a2f4d517d47c48ef6634385ae44e5d1a41a991bd;hb=afbe35bc8d3bd669a15467619d2d7f945081979b;hp=881a86cd65ca4a84e371613eaa96de529d91e259;hpb=098f68aa472b0827a0dfdfda38a338cde577ef98;p=metaproxy-moved-to-github.git diff --git a/src/sru_util.cpp b/src/sru_util.cpp index 881a86c..a2f4d51 100644 --- a/src/sru_util.cpp +++ b/src/sru_util.cpp @@ -1,8 +1,23 @@ -/* $Id: sru_util.cpp,v 1.3 2006-12-28 13:26:06 marc Exp $ - Copyright (c) 2005-2006, Index Data. +/* $Id: sru_util.cpp,v 1.10 2007-05-09 21:23:09 adam Exp $ + Copyright (c) 2005-2007, Index Data. - See the LICENSE file for details -*/ +This file is part of Metaproxy. + +Metaproxy is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Metaproxy; see the file LICENSE. If not, write to the +Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. + */ #include "sru_util.hpp" #include "util.hpp" @@ -18,7 +33,7 @@ namespace mp = metaproxy_1; // Doxygen doesn't like mp::gdu, so we use this instead namespace mp_util = metaproxy_1::util; - +const std::string xmlns_explain("http://explain.z3950.org/dtd/2.0/"); bool mp_util::build_sru_debug_package(mp::Package &package) { @@ -35,26 +50,13 @@ bool mp_util::build_sru_debug_package(mp::Package &package) return false; } - -bool mp_util::build_simple_explain(mp::Package &package, - mp::odr &odr_en, - Z_SRW_PDU *sru_pdu_res, - Z_SRW_explainRequest - const *er_req) +mp_util::SRUServerInfo mp_util::get_sru_server_info(mp::Package &package) { - // 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; - - // getting database info - std::string database("Default"); - if (er_req && er_req->database) - database = er_req->database; + mp_util::SRUServerInfo sruinfo; // getting host and port info - std::string host = package.origin().listen_host(); - std::string port = mp_util::to_string(package.origin().listen_port()); + sruinfo.host = package.origin().listen_host(); + sruinfo.port = mp_util::to_string(package.origin().listen_port()); // overwriting host and port info if set from HTTP Host header Z_GDU *zgdu_req = package.request().get(); @@ -63,35 +65,85 @@ bool mp_util::build_simple_explain(mp::Package &package, Z_HTTP_Request* http_req = zgdu_req->u.HTTP_Request; if (http_req) { + std::string http_path = http_req->path; + + // taking out GET parameters + std::string::size_type ipath = http_path.rfind("?"); + if (ipath != std::string::npos) + http_path.assign(http_path, 0, ipath); + + // assign to database name + if (http_path.size() > 1){ + sruinfo.database.assign(http_path, 1, std::string::npos); + } + std::string http_host_address = mp_util::http_header_value(http_req->headers, "Host"); - std::string::size_type i = http_host_address.rfind(":"); - if (i != std::string::npos) + std::string::size_type iaddress = http_host_address.rfind(":"); + if (iaddress != std::string::npos) { - host.assign(http_host_address, 0, i); - port.assign(http_host_address, i + 1, std::string::npos); + sruinfo.host.assign(http_host_address, 0, iaddress); + sruinfo.port.assign(http_host_address, iaddress + 1, + std::string::npos); } } } + + //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, + metaproxy_1::odr &odr_en, + Z_SRW_PDU *sru_pdu_res, + SRUServerInfo sruinfo, + const xmlNode *explain, + Z_SRW_explainRequest const *er_req) +{ // building SRU explain record - std::string explain_xml - = mp_util::to_string( - "\n" - " \n" - " ") - + host - + mp_util::to_string("\n" - " ") - + port - + mp_util::to_string("\n" - " ") - + database - + mp_util::to_string("\n" - " \n" - "\n"); - + std::string explain_xml; + + if (explain == 0){ + explain_xml + = mp_util::to_string( + "\n" + " \n" + " ") + + sruinfo.host + + mp_util::to_string("\n" + " ") + + sruinfo.port + + mp_util::to_string("\n" + " ") + + sruinfo.database + + mp_util::to_string("\n" + " \n" + "\n"); + } + else { + // make new XML DOC with given explain node + xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); + xmlDocSetRootElement(doc, (xmlNode*)explain); + + xmlChar *xmlbuff; + int xmlbuffsz; + xmlDocDumpFormatMemory(doc, &xmlbuff, &xmlbuffsz, 1); + + explain_xml.assign((const char*)xmlbuff, 0, xmlbuffsz); + } + + + // 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; @@ -100,7 +152,7 @@ bool mp_util::build_simple_explain(mp::Package &package, sru_res->record.recordPosition = odr_intdup(odr_en, 1); sru_res->record.recordPacking = record_packing; - sru_res->record.recordSchema = "http://explain.z3950.org/dtd/2.0/"; + sru_res->record.recordSchema = (char *)xmlns_explain.c_str(); sru_res->record.recordData_len = 1 + explain_xml.size(); sru_res->record.recordData_buf = odr_strdupn(odr_en, (const char *)explain_xml.c_str(), @@ -184,7 +236,7 @@ bool mp_util::build_sru_response(mp::Package &package, mp::odr &odr_de, mp::odr &odr_en, Z_SRW_PDU *sru_pdu_res, - Z_SOAP *&soap, + Z_SOAP **soap, char *charset, char *stylesheet) { @@ -204,7 +256,7 @@ bool mp_util::build_sru_response(mp::Package &package, // checking if we got a SRU GET/POST/SOAP HTTP package // closing connection if we did not ... - if (0 == yaz_sru_decode(http_req, &sru_pdu_req, &soap, + if (0 == yaz_sru_decode(http_req, &sru_pdu_req, soap, odr_de, &charset, &(sru_pdu_res->u.response->diagnostics), &(sru_pdu_res->u.response->num_diagnostics))) @@ -217,7 +269,7 @@ bool mp_util::build_sru_response(mp::Package &package, } return sru_pdu_req; } - else if (0 == yaz_srw_decode(http_req, &sru_pdu_req, &soap, + else if (0 == yaz_srw_decode(http_req, &sru_pdu_req, soap, odr_de, &charset)) return sru_pdu_req; else