From 298c3c20d481cfce45efa87c69dacdd34861cf05 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 11 Nov 2011 12:17:16 +0100 Subject: [PATCH] zoom: allow Torus realm to be set via database args Database argument realm=x, will subsitute %realm in Torus url with the realm given. If not set, it will use new realm attribute for torus element in configuration. Implements bug #4826. --- src/filter_zoom.cpp | 146 ++++++++++++++++++++++++-------------------- src/torus.cpp | 10 ++- src/torus.hpp | 1 + xml/schema/filter_zoom.rnc | 1 + 4 files changed, 90 insertions(+), 68 deletions(-) diff --git a/src/filter_zoom.cpp b/src/filter_zoom.cpp index 6c9cabf..4a2bd55 100644 --- a/src/filter_zoom.cpp +++ b/src/filter_zoom.cpp @@ -157,6 +157,7 @@ namespace metaproxy_1 { boost::mutex m_mutex; boost::condition m_cond_session_ready; std::string torus_url; + std::string default_realm; std::map fieldmap; std::string xsldir; std::string file_path; @@ -558,6 +559,8 @@ void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only, { if (!strcmp((const char *) attr->name, "url")) torus_url = mp::xml::get_text(attr->children); + else if (!strcmp((const char *) attr->name, "realm")) + default_realm = mp::xml::get_text(attr->children); else if (!strcmp((const char *) attr->name, "xsldir")) xsldir = mp::xml::get_text(attr->children); else if (!strcmp((const char *) attr->name, "element_transform")) @@ -653,6 +656,75 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( } else torus_db = database; + + std::string authentication; + std::string proxy; + std::string realm = m_p->default_realm; + + const char *param_user = 0; + const char *param_password = 0; + const char *param_proxy = 0; + char *x_args = 0; // all x-args to be passed to backend + + if (db_args.length()) + { + char **names; + char **values; + int no_parms = yaz_uri_to_array(db_args.c_str(), + odr, &names, &values); + const char **x_names = (const char **) + odr_malloc(odr, (1 + no_parms) * sizeof(*x_names)); + const char **x_values = (const char **) + odr_malloc(odr, (1 + no_parms) * sizeof(*x_values)); + int no_x_names = 0; + int i; + for (i = 0; i < no_parms; i++) + { + const char *name = names[i]; + const char *value = values[i]; + assert(name); + assert(value); + if (!strcmp(name, "user")) + param_user = value; + else if (!strcmp(name, "password")) + param_password = value; + else if (!strcmp(name, "proxy")) + param_proxy = value; + else if (!strcmp(name, "cproxysession")) + ; + else if (!strcmp(name, "realm")) + realm = value; + else if (name[0] == 'x' && name[1] == '-') + { + x_names[no_x_names] = name; + x_values[no_x_names] = value; + no_x_names++; + } + else + { + BackendPtr notfound; + char *msg = (char*) odr_malloc(odr, strlen(name) + 30); + *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; + sprintf(msg, "Bad database argument: %s", name); + *addinfo = msg; + return notfound; + } + } + if (no_x_names) + { + x_names[no_x_names] = 0; // terminate list + yaz_array_to_uri(&x_args, odr, (char **) x_names, + (char **) x_values); + } + if (param_user) + { + authentication = std::string(param_user); + if (param_password) + authentication += "/" + std::string(param_password); + } + if (param_proxy) + proxy = param_proxy; + } SearchablePtr sptr; @@ -662,7 +734,8 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( sptr = it->second; else if (m_p->torus_url.length() > 0) { - xmlDoc *doc = mp::get_searchable(m_p->torus_url, torus_db, m_p->proxy); + xmlDoc *doc = mp::get_searchable(m_p->torus_url, torus_db, realm, + m_p->proxy); if (!doc) { *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST; @@ -792,73 +865,12 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( maximumRecords > 0 */ b->set_option("piggyback", sptr->piggyback ? "1" : "0"); - std::string authentication = sptr->authentication; - std::string proxy = sptr->cfProxy; - - const char *param_user = 0; - const char *param_password = 0; - const char *param_proxy = 0; - char *x_args = 0; // all x-args to be passed to backend - - if (db_args.length()) - { - - char **names; - char **values; - int no_parms = yaz_uri_to_array(db_args.c_str(), - odr, &names, &values); - const char **x_names = (const char **) - odr_malloc(odr, (1 + no_parms) * sizeof(*x_names)); - const char **x_values = (const char **) - odr_malloc(odr, (1 + no_parms) * sizeof(*x_values)); - int no_x_names = 0; - int i; - for (i = 0; i < no_parms; i++) - { - const char *name = names[i]; - const char *value = values[i]; - assert(name); - assert(value); - if (!strcmp(name, "user")) - param_user = value; - else if (!strcmp(name, "password")) - param_password = value; - else if (!strcmp(name, "proxy")) - param_proxy = value; - else if (!strcmp(name, "cproxysession")) - ; - else if (name[0] == 'x' && name[1] == '-') - { - x_names[no_x_names] = name; - x_values[no_x_names] = value; - no_x_names++; - } - else - { - BackendPtr notfound; - char *msg = (char*) odr_malloc(odr, strlen(name) + 30); - *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - sprintf(msg, "Bad database argument: %s", name); - *addinfo = msg; - return notfound; - } - } - if (no_x_names) - { - x_names[no_x_names] = 0; // terminate list - yaz_array_to_uri(&x_args, odr, (char **) x_names, - (char **) x_values); - } - if (param_user) - { - authentication = std::string(param_user); - if (param_password) - authentication += "/" + std::string(param_password); - } - if (param_proxy) - proxy = param_proxy; - } + if (authentication.length() == 0) + authentication = sptr->authentication; + if (proxy.length() == 0) + proxy = sptr->cfProxy; + if (sptr->cfAuth.length()) { // A CF target diff --git a/src/torus.cpp b/src/torus.cpp index f3661f9..d6bcd03 100644 --- a/src/torus.cpp +++ b/src/torus.cpp @@ -20,6 +20,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include +#include #include #include #include "torus.hpp" @@ -27,6 +28,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA namespace mp = metaproxy_1; xmlDoc *mp::get_searchable(std::string url_template, const std::string &db, + const std::string &realm, const std::string &proxy) { // http://newmk2.indexdata.com/torus2/searchable.ebsco/records/?query=udb=aberdeenUni @@ -35,7 +37,11 @@ xmlDoc *mp::get_searchable(std::string url_template, const std::string &db, found = url_template.find("%db"); if (found != std::string::npos) - url_template.replace(found, found+3, mp::util::uri_encode(db)); + url_template.replace(found, 3, mp::util::uri_encode(db)); + + found = url_template.find("%realm"); + if (found != std::string::npos) + url_template.replace(found, 6, mp::util::uri_encode(realm)); Z_HTTP_Header *http_headers = 0; mp::odr odr; @@ -57,6 +63,8 @@ xmlDoc *mp::get_searchable(std::string url_template, const std::string &db, http_response->content_buf) doc = xmlParseMemory(http_response->content_buf, http_response->content_len); + else + yaz_log(YLOG_WARN, "Could not fetch %s", url_template.c_str()); yaz_url_destroy(url_p); return doc; } diff --git a/src/torus.hpp b/src/torus.hpp index aa99149..4904de9 100644 --- a/src/torus.hpp +++ b/src/torus.hpp @@ -25,6 +25,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA namespace metaproxy_1 { xmlDoc *get_searchable(std::string url_template, const std::string &db, + const std::string &realm, const std::string &proxy); } diff --git a/xml/schema/filter_zoom.rnc b/xml/schema/filter_zoom.rnc index 144efd1..679eade 100644 --- a/xml/schema/filter_zoom.rnc +++ b/xml/schema/filter_zoom.rnc @@ -8,6 +8,7 @@ filter_zoom = attribute name { xsd:NCName }?, element mp:torus { attribute url { xsd:string }, + attribute realm { xsd:string }, attribute xsldir { xsd:string }?, attribute element_transform { xsd:string }?, attribute element_raw { xsd:string }?, -- 1.7.10.4