X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;ds=sidebyside;f=src%2Futil.cpp;h=f0ea1d6da360b57a645bda9c05904e4e1c9b0de9;hb=219ffa015c0e35b03fae0788b0e8e6abcfde1a81;hp=461534741b47fad92cab20a31dff462d5dd32cf8;hpb=c93d8c8db5ae24e01775060677f8e8e9c2afff34;p=metaproxy-moved-to-github.git diff --git a/src/util.cpp b/src/util.cpp index 4615347..f0ea1d6 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,5 +1,5 @@ -/* $Id: util.cpp,v 1.20 2006-09-29 08:42:47 marc Exp $ - Copyright (c) 2005-2006, Index Data. +/* $Id: util.cpp,v 1.27 2007-04-13 09:57:51 adam Exp $ + Copyright (c) 2005-2007, Index Data. See the LICENSE file for details */ @@ -10,7 +10,8 @@ #include #include #include -#include // for yaz_query_to_wrbuf() +#include +#include #include @@ -19,6 +20,24 @@ 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) @@ -34,6 +53,65 @@ std::string mp_util::http_header_value(const Z_HTTP_Header* header, 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, @@ -138,7 +216,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); } } @@ -214,14 +292,17 @@ int mp_util::get_or_remove_vhost_otherinfo( std::list &vhosts) { int cat; + const int *oid_proxy = yaz_string_to_oid(yaz_oid_std(), + CLASS_USERINFO, + OID_STR_PROXY); for (cat = 1; ; cat++) { // 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, + oid_proxy, + cat /* categoryValue */, + remove_flag /* delete flag */); if (!vhost) break; vhosts.push_back(std::string(vhost)); @@ -250,15 +331,32 @@ void mp_util::set_vhost_otherinfo( { int cat; std::list::const_iterator it = vhosts.begin(); + + const int *oid_proxy = yaz_string_to_oid(yaz_oid_std(), + CLASS_USERINFO, + OID_STR_PROXY); + 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, + oid_proxy, cat, it->c_str()); } } +void mp_util::set_vhost_otherinfo( + Z_OtherInformation **otherInformation, ODR odr, + const std::string vhost, const int cat) +{ + const int *oid_proxy = yaz_string_to_oid(yaz_oid_std(), + CLASS_USERINFO, + OID_STR_PROXY); + + yaz_oi_set_string_oid(otherInformation, odr, + oid_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, '/');