From 0a41bd174bb83e032e5a0845e286bf1396b17f84 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 26 Jan 2007 14:49:21 +0000 Subject: [PATCH] Added support for configurable default/force target/vhost for module Z39.50 client module. --- NEWS | 3 ++ doc/z3950_client.xml | 37 ++++++++++++++++++++-- etc/config1.xml | 3 +- src/filter_z3950_client.cpp | 74 ++++++++++++++++++++++++++++--------------- xml/schema/metaproxy.rnc | 8 +++-- 5 files changed, 94 insertions(+), 31 deletions(-) diff --git a/NEWS b/NEWS index ff28c75..b7ec1cc 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +Added support for configurable default/force target/vhost for module Z39.50 +client module. + --- 1.0.8 2007/01/25 Implemented filter, session_shared, which optimizes usage of Z39.50 diff --git a/doc/z3950_client.xml b/doc/z3950_client.xml index 79d8bd0..2ad8f0a 100644 --- a/doc/z3950_client.xml +++ b/doc/z3950_client.xml @@ -4,7 +4,7 @@ %common; ]> - + z3950_client @@ -19,7 +19,39 @@ DESCRIPTION - This backend filter is a Z39.50 client. + This backend filter is a Z39.50 client. This modules + proxies all Z39.50 packages to a target. HTTP packages are ignored. + The address of the backend target (host) can be given as part of the + Initialize Request (Virtual host) or the default target may be specified + in the configuration. + + + + timeout + + + Specifies how long the client will wait for any request + before giving up. Default value is 30 seconds. + + + + default_target + + + Specifies the target (host) for the Z39.50 server to be used + if the Init Request does not indicate otherwise. + + + + force_target + + + Specifies the target (host) for the Z39.50 server to be used + always (regardless of Init Request vhost). + + + + @@ -29,6 +61,7 @@ 30 + z3950.indexdata.dk ]]> diff --git a/etc/config1.xml b/etc/config1.xml index 8746325..cdbf32f 100644 --- a/etc/config1.xml +++ b/etc/config1.xml @@ -1,5 +1,5 @@ - + @@ -9,6 +9,7 @@ 30 + z3950.indexdata.dk diff --git a/src/filter_z3950_client.cpp b/src/filter_z3950_client.cpp index 7711952..b93ecb2 100644 --- a/src/filter_z3950_client.cpp +++ b/src/filter_z3950_client.cpp @@ -1,4 +1,4 @@ -/* $Id: filter_z3950_client.cpp,v 1.29 2007-01-25 14:05:54 adam Exp $ +/* $Id: filter_z3950_client.cpp,v 1.30 2007-01-26 14:49:22 adam Exp $ Copyright (c) 2005-2007, Index Data. See the LICENSE file for details @@ -64,6 +64,8 @@ namespace metaproxy_1 { public: // number of seconds to wait before we give up request int m_timeout_sec; + std::string m_default_target; + std::string m_force_target; boost::mutex m_mutex; boost::condition m_cond_session_ready; std::map m_clients; @@ -226,34 +228,48 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) package.session().close(); return 0; } - std::list vhosts; - mp::util::remove_vhost_otherinfo(&apdu->u.initRequest->otherInfo, vhosts); - size_t no_vhosts = vhosts.size(); - if (no_vhosts == 0) + std::string target = m_force_target; + if (!target.length()) { - mp::odr odr; - package.response() = odr.create_initResponse( - apdu, - YAZ_BIB1_INIT_NEGOTIATION_OPTION_REQUIRED, - "z3950_client: No virtal host given"); - - package.session().close(); - return 0; - } - if (no_vhosts > 1) - { - mp::odr odr; - package.response() = odr.create_initResponse( - apdu, - YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP, - "z3950_client: Can not cope with multiple vhosts"); - package.session().close(); - return 0; + target = m_default_target; + std::list vhosts; + mp::util::remove_vhost_otherinfo(&apdu->u.initRequest->otherInfo, + vhosts); + size_t no_vhosts = vhosts.size(); + if (no_vhosts == 1) + { + std::list::const_iterator v_it = vhosts.begin(); + target = *v_it; + } + else if (no_vhosts == 0) + { + if (!target.length()) + { + // no default target. So we don't know where to connect + mp::odr odr; + package.response() = odr.create_initResponse( + apdu, + YAZ_BIB1_INIT_NEGOTIATION_OPTION_REQUIRED, + "z3950_client: No virtal host given"); + + package.session().close(); + return 0; + } + } + else if (no_vhosts > 1) + { + mp::odr odr; + package.response() = odr.create_initResponse( + apdu, + YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP, + "z3950_client: Can not cope with multiple vhosts"); + package.session().close(); + return 0; + } } - std::list::const_iterator v_it = vhosts.begin(); std::list dblist; std::string host; - mp::util::split_zurl(*v_it, host, dblist); + mp::util::split_zurl(target, host, dblist); if (dblist.size()) { @@ -374,6 +390,14 @@ void yf::Z3950Client::configure(const xmlNode *ptr) { m_p->m_timeout_sec = mp::xml::get_int(ptr->children, 30); } + else if (!strcmp((const char *) ptr->name, "default_target")) + { + m_p->m_default_target = mp::xml::get_text(ptr); + } + else if (!strcmp((const char *) ptr->name, "force_target")) + { + m_p->m_force_target = mp::xml::get_text(ptr); + } else { throw mp::filter::FilterException("Bad element " diff --git a/xml/schema/metaproxy.rnc b/xml/schema/metaproxy.rnc index 7759cf5..d7c14fa 100644 --- a/xml/schema/metaproxy.rnc +++ b/xml/schema/metaproxy.rnc @@ -1,7 +1,7 @@ # Metaproxy XML config file schemas -# $Id: metaproxy.rnc,v 1.17 2007-01-25 11:21:56 adam Exp $ +# $Id: metaproxy.rnc,v 1.18 2007-01-26 14:49:23 adam Exp $ # -# Copyright (c) 2005-2006, Index Data. +# Copyright (c) 2005-2007, Index Data. # # See the LICENSE file for details # @@ -190,7 +190,9 @@ filter_z3950_client = attribute type { "z3950_client" }, attribute id { xsd:NCName }?, attribute name { xsd:NCName }?, - element mp:timeout { xsd:integer }? + element mp:timeout { xsd:integer }?, + element mp:default_target { xsd:string }?, + element mp:force_target { xsd:string }? #filter_zeerex_explain = # attribute type { "zeerex_explain" }, -- 1.7.10.4