X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Futil.cpp;h=f53a98ccd564137aab61aabd9413efb2cf600820;hb=665559cbc22546e8df69be33a7d492294cab9fb1;hp=dcd751ba4c1e5f04b3555ed17dedef71d67993e4;hpb=1e61b0aa05e2351e33d909f7503eaf936a2d9bb0;p=metaproxy-moved-to-github.git diff --git a/src/util.cpp b/src/util.cpp index dcd751b..f53a98c 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,24 +1,131 @@ -/* $Id: util.cpp,v 1.17 2006-06-10 14:29:13 adam Exp $ - Copyright (c) 2005-2006, Index Data. +/* This file is part of Metaproxy. + Copyright (C) 2005-2008 Index Data - See the LICENSE file for details - */ +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 this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include "config.hpp" +#include "util.hpp" #include #include #include -#include // for yaz_query_to_wrbuf() -#include "util.hpp" +#include +#include -//#include +#include namespace mp = metaproxy_1; // Doxygen doesn't like mp::util, so we use this instead namespace mp_util = metaproxy_1::util; +const char * +mp_util::record_composition_to_esn(Z_RecordComposition *comp) +{ + if (comp && comp->which == Z_RecordComp_complex) + { + if (comp->u.complex->generic + && comp->u.complex->generic->elementSpec + && (comp->u.complex->generic->elementSpec->which == + Z_ElementSpec_elementSetName)) + return comp->u.complex->generic->elementSpec->u.elementSetName; + } + else if (comp && comp->which == Z_RecordComp_simple && + comp->u.simple->which == Z_ElementSetNames_generic) + return comp->u.simple->u.generic; + return 0; +} + + + +std::string mp_util::http_header_value(const Z_HTTP_Header* header, + const std::string name) +{ + while (header && header->name + && std::string(header->name) != name) + header = header->next; + + if (header && header->name && std::string(header->name) == name + && header->value) + return std::string(header->value); + + return std::string(); +} + +std::string mp_util::http_headers_debug(const Z_HTTP_Request &http_req) +{ + std::string message("\n\n

" + "Metaproxy SRUtoZ3950 filter" + "

\n"); + + message += "

HTTP Info


\n"; + message += "

\n"; + message += "Method: " + std::string(http_req.method) + "
\n"; + message += "Version: " + std::string(http_req.version) + "
\n"; + message += "Path: " + std::string(http_req.path) + "
\n"; + + message += "Content-Type:" + + mp_util::http_header_value(http_req.headers, "Content-Type") + + "
\n"; + message += "Content-Length:" + + mp_util::http_header_value(http_req.headers, "Content-Length") + + "
\n"; + message += "

\n"; + + message += "

Headers


\n"; + message += "

\n"; + Z_HTTP_Header* header = http_req.headers; + while (header){ + message += "Header: " + + std::string(header->name) + ": " + + std::string(header->value) + "
\n"; + header = header->next; + } + message += "

\n"; + message += "\n\n"; + return message; +} + + +void mp_util::http_response(metaproxy_1::Package &package, + const std::string &content, + int http_code) +{ + + Z_GDU *zgdu_req = package.request().get(); + Z_GDU *zgdu_res = 0; + mp::odr odr; + zgdu_res + = odr.create_HTTP_Response(package.session(), + zgdu_req->u.HTTP_Request, + http_code); + + zgdu_res->u.HTTP_Response->content_len = content.size(); + zgdu_res->u.HTTP_Response->content_buf + = (char*) odr_malloc(odr, zgdu_res->u.HTTP_Response->content_len); + + strncpy(zgdu_res->u.HTTP_Response->content_buf, + content.c_str(), zgdu_res->u.HTTP_Response->content_len); + + //z_HTTP_header_add(odr, &hres->headers, + // "Content-Type", content_type.c_str()); + package.response() = zgdu_res; +} + + int mp_util::memcmp2(const void *buf1, int len1, const void *buf2, int len2) { @@ -121,7 +228,7 @@ std::string mp_util::zQueryToString(Z_Query *query) query_str = std::string(wrbuf_buf(w), wrbuf_len(w)); // destroy wrbuf - wrbuf_free(w, 1); + wrbuf_destroy(w); } } @@ -191,7 +298,7 @@ void mp_util::get_init_diagnostics( } } -int mp_util::get_vhost_otherinfo( +int mp_util::get_or_remove_vhost_otherinfo( Z_OtherInformation **otherInformation, bool remove_flag, std::list &vhosts) @@ -201,10 +308,10 @@ int mp_util::get_vhost_otherinfo( { // check virtual host const char *vhost = - yaz_oi_get_string_oidval(otherInformation, - VAL_PROXY, - cat /* categoryValue */, - remove_flag /* delete flag */); + yaz_oi_get_string_oid(otherInformation, + yaz_oid_userinfo_proxy, + cat /* categoryValue */, + remove_flag /* delete flag */); if (!vhost) break; vhosts.push_back(std::string(vhost)); @@ -213,21 +320,44 @@ int mp_util::get_vhost_otherinfo( return cat; } +void mp_util::get_vhost_otherinfo( + Z_OtherInformation *otherInformation, + std::list &vhosts) +{ + get_or_remove_vhost_otherinfo(&otherInformation, false, vhosts); +} + +int mp_util::remove_vhost_otherinfo( + Z_OtherInformation **otherInformation, + std::list &vhosts) +{ + return get_or_remove_vhost_otherinfo(otherInformation, true, vhosts); +} + void mp_util::set_vhost_otherinfo( Z_OtherInformation **otherInformation, ODR odr, const std::list &vhosts) { int cat; std::list::const_iterator it = vhosts.begin(); + for (cat = 1; it != vhosts.end() ; cat++, it++) { - yaz_oi_set_string_oidval(otherInformation, odr, - VAL_PROXY, cat, it->c_str()); + yaz_oi_set_string_oid(otherInformation, odr, + yaz_oid_userinfo_proxy, cat, it->c_str()); } } +void mp_util::set_vhost_otherinfo( + Z_OtherInformation **otherInformation, ODR odr, + const std::string vhost, const int cat) +{ + yaz_oi_set_string_oid(otherInformation, odr, + yaz_oid_userinfo_proxy, cat, vhost.c_str()); +} + void mp_util::split_zurl(std::string zurl, std::string &host, - std::list &db) + std::list &db) { const char *zurl_cstr = zurl.c_str(); const char *sep = strchr(zurl_cstr, '/'); @@ -296,8 +426,8 @@ mp::odr::operator ODR() const return m_odr; } -Z_APDU *mp::odr::create_close(Z_APDU *in_apdu, - int reason, const char *addinfo) +Z_APDU *mp::odr::create_close(const Z_APDU *in_apdu, + int reason, const char *addinfo) { Z_APDU *apdu = create_APDU(Z_APDU_close, in_apdu); @@ -307,20 +437,25 @@ Z_APDU *mp::odr::create_close(Z_APDU *in_apdu, return apdu; } -Z_APDU *mp::odr::create_APDU(int type, Z_APDU *in_apdu) +Z_APDU *mp::odr::create_APDU(int type, const Z_APDU *in_apdu) { return mp::util::create_APDU(m_odr, type, in_apdu); } -Z_APDU *mp_util::create_APDU(ODR odr, int type, Z_APDU *in_apdu) +Z_APDU *mp_util::create_APDU(ODR odr, int type, const Z_APDU *in_apdu) { Z_APDU *out_apdu = zget_APDU(odr, type); + transfer_referenceId(odr, in_apdu, out_apdu); + return out_apdu; +} - Z_ReferenceId **id_to = mp::util::get_referenceId(out_apdu); +void mp_util::transfer_referenceId(ODR odr, const Z_APDU *src, Z_APDU *dst) +{ + Z_ReferenceId **id_to = mp::util::get_referenceId(dst); *id_to = 0; - if (in_apdu) + if (src) { - Z_ReferenceId **id_from = mp::util::get_referenceId(in_apdu); + Z_ReferenceId **id_from = mp::util::get_referenceId(src); if (id_from && *id_from && id_to) { *id_to = (Z_ReferenceId*) odr_malloc (odr, sizeof(**id_to)); @@ -331,11 +466,10 @@ Z_APDU *mp_util::create_APDU(ODR odr, int type, Z_APDU *in_apdu) else if (id_to) *id_to = 0; } - return out_apdu; } -Z_APDU *mp::odr::create_initResponse(Z_APDU *in_apdu, - int error, const char *addinfo) +Z_APDU *mp::odr::create_initResponse(const Z_APDU *in_apdu, + int error, const char *addinfo) { Z_APDU *apdu = create_APDU(Z_APDU_initResponse, in_apdu); if (error) @@ -347,8 +481,8 @@ Z_APDU *mp::odr::create_initResponse(Z_APDU *in_apdu, return apdu; } -Z_APDU *mp::odr::create_searchResponse(Z_APDU *in_apdu, - int error, const char *addinfo) +Z_APDU *mp::odr::create_searchResponse(const Z_APDU *in_apdu, + int error, const char *addinfo) { Z_APDU *apdu = create_APDU(Z_APDU_searchResponse, in_apdu); if (error) @@ -364,8 +498,8 @@ Z_APDU *mp::odr::create_searchResponse(Z_APDU *in_apdu, return apdu; } -Z_APDU *mp::odr::create_presentResponse(Z_APDU *in_apdu, - int error, const char *addinfo) +Z_APDU *mp::odr::create_presentResponse(const Z_APDU *in_apdu, + int error, const char *addinfo) { Z_APDU *apdu = create_APDU(Z_APDU_presentResponse, in_apdu); if (error) @@ -381,8 +515,8 @@ Z_APDU *mp::odr::create_presentResponse(Z_APDU *in_apdu, return apdu; } -Z_APDU *mp::odr::create_scanResponse(Z_APDU *in_apdu, - int error, const char *addinfo) +Z_APDU *mp::odr::create_scanResponse(const Z_APDU *in_apdu, + int error, const char *addinfo) { Z_APDU *apdu = create_APDU(Z_APDU_scanResponse, in_apdu); Z_ScanResponse *res = apdu->u.scanResponse; @@ -409,7 +543,7 @@ Z_APDU *mp::odr::create_scanResponse(Z_APDU *in_apdu, } Z_GDU *mp::odr::create_HTTP_Response(mp::Session &session, - Z_HTTP_Request *hreq, int code) + Z_HTTP_Request *hreq, int code) { const char *response_version = "1.0"; bool keepalive = false; @@ -441,7 +575,7 @@ Z_GDU *mp::odr::create_HTTP_Response(mp::Session &session, return gdu; } -Z_ReferenceId **mp_util::get_referenceId(Z_APDU *apdu) +Z_ReferenceId **mp_util::get_referenceId(const Z_APDU *apdu) { switch (apdu->which) { @@ -499,8 +633,9 @@ Z_ReferenceId **mp_util::get_referenceId(Z_APDU *apdu) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil - * c-file-style: "stroustrup" * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +