/* This file is part of Metaproxy.
- Copyright (C) 2005-2012 Index Data
+ Copyright (C) 2005-2013 Index Data
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
class Zoom::Searchable : boost::noncopyable {
public:
std::string authentication;
+ std::string authenticationMode;
std::string cfAuth;
std::string cfProxy;
std::string cfSubDB;
CCL_bibset bibset;
std::string element_transform;
std::string element_raw;
+ std::string element_passthru;
std::string proxy;
xsltStylesheetPtr explain_xsp;
xsltStylesheetPtr record_xsp;
}
yf::Zoom::Impl::Impl() :
- apdu_log(false), element_transform("pz2") , element_raw("raw"),
+ apdu_log(false), element_transform("pz2") , element_raw("raw") ,
+ element_passthru("F"),
zoom_timeout("40"), proxy_timeout(1)
{
bibset = ccl_qual_mk();
s->authentication = mp::xml::get_text(ptr);
}
else if (!strcmp((const char *) ptr->name,
+ "authenticationMode"))
+ {
+ s->authenticationMode = mp::xml::get_text(ptr);
+ }
+ else if (!strcmp((const char *) ptr->name,
"cfAuth"))
{
s->cfAuth = mp::xml::get_text(ptr);
element_transform = mp::xml::get_text(attr->children);
else if (!strcmp((const char *) attr->name, "element_raw"))
element_raw = mp::xml::get_text(attr->children);
+ else if (!strcmp((const char *) attr->name, "element_passthru"))
+ element_passthru = mp::xml::get_text(attr->children);
else if (!strcmp((const char *) attr->name, "proxy"))
proxy = mp::xml::get_text(attr->children);
else if (!strcmp((const char *) attr->name, "explain_xsl"))
"unable to open content config %s",
m_p->content_config_file.c_str());
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
- *addinfo = (char *) odr_malloc(odr, 60 + tmp_file.length());
- sprintf(*addinfo, "unable to open content config %s",
+ *addinfo = (char *) odr_malloc(odr, 70 + tmp_file.length());
+ sprintf(*addinfo, "zoom: unable to open content config %s",
m_p->content_config_file.c_str());
return false;
}
package.log("zoom", YLOG_WARN, "bad tmp_file %s", tmp_file.c_str());
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
*addinfo = (char *) odr_malloc(odr, 60 + tmp_file.length());
- sprintf(*addinfo, "bad format of content tmp_file: %s",
+ sprintf(*addinfo, "zoom: bad format of content tmp_file: %s",
tmp_file.c_str());
xfree(fname);
return false;
{
package.log("zoom", YLOG_WARN|YLOG_ERRNO, "create %s", fname);
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
- *addinfo = (char *) odr_malloc(odr, 40 + strlen(fname));
- sprintf(*addinfo, "Could not create %s", fname);
+ *addinfo = (char *) odr_malloc(odr, 50 + strlen(fname));
+ sprintf(*addinfo, "zoom: could not create %s", fname);
xfree(fname);
return false;
}
BackendPtr notfound;
char *msg = (char*) odr_malloc(odr, strlen(name) + 30);
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
- sprintf(msg, "Bad database argument: %s", name);
+ sprintf(msg, "zoom: bad database argument: %s", name);
*addinfo = msg;
return notfound;
}
if (!xsp_doc)
{
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
- *addinfo = (char *) odr_malloc(odr, 40);
- sprintf(*addinfo, "xmlParseMemory failed");
+ *addinfo = odr_strdup(odr, "zoom: xmlParseMemory failed "
+ "for literalTransform XSL");
BackendPtr b;
return b;
}
if (!xsp)
{
*error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST;
- *addinfo = odr_strdup(odr, "xsltParseStylesheetDoc failed");
+ *addinfo =
+ odr_strdup(odr,"zoom: xsltParseStylesheetDoc failed "
+ "for literalTransform XSL");
BackendPtr b;
xmlFreeDoc(xsp_doc);
return b;
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
*addinfo = (char *)
odr_malloc(odr, 40 + sptr->transform_xsl_fname.length());
- sprintf(*addinfo, "File could not be read: %s",
+ sprintf(*addinfo, "zoom: could not open file %s",
sptr->transform_xsl_fname.c_str());
BackendPtr b;
return b;
if (!xsp_doc)
{
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
- *addinfo = (char *) odr_malloc(odr, 40 + fname.length());
- sprintf(*addinfo, "xmlParseFile failed. File: %s", fname.c_str());
+ *addinfo = (char *) odr_malloc(odr, 50 + fname.length());
+ sprintf(*addinfo, "zoom: xmlParseFile failed for file %s",
+ fname.c_str());
BackendPtr b;
return b;
}
xsp = xsltParseStylesheetDoc(xsp_doc);
if (!xsp)
{
- *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST;
- *addinfo = odr_strdup(odr, "xsltParseStylesheetDoc failed");
+ *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
+ *addinfo = (char *) odr_malloc(odr, 50 + fname.length());
+ sprintf(*addinfo, "zoom: xsltParseStylesheetDoc failed "
+ "for file %s", fname.c_str());
BackendPtr b;
xmlFreeDoc(xsp_doc);
return b;
if (!cqlt)
{
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
- *addinfo = odr_strdup(odr, "Missing/invalid cql2rpn file");
+ *addinfo = odr_strdup(odr, "zoom: missing/invalid cql2rpn file");
BackendPtr b;
xsltFreeStylesheet(xsp);
return b;
if (sptr->query_encoding.length())
b->set_option("rpnCharset", sptr->query_encoding);
- if (sptr->extraArgs.length())
- b->set_option("extraArgs", sptr->extraArgs);
+ std::string extraArgs = sptr->extraArgs;
b->set_option("timeout", m_p->zoom_timeout.c_str());
}
else
{
- size_t found = authentication.find('/');
-
- if (sptr->sru.length() && found != std::string::npos)
- {
- b->set_option("user", authentication.substr(0, found));
- b->set_option("password", authentication.substr(found+1));
- }
+ if (sptr->sru.length() == 0)
+ b->set_option("user", authentication); /* Z39.50 */
else
- b->set_option("user", authentication);
+ {
+ std::string user;
+ std::string password;
+ std::string authtype = sptr->authenticationMode;
+
+ {
+ const char *cstr = authentication.c_str();
+ const char *cp1 = strchr(cstr, '/');
+ if (cp1)
+ {
+ password.assign(cp1 + 1);
+ user.assign(cstr, cp1 - cstr);
+ }
+ else
+ user.assign(cstr);
+ }
+ if (authtype.compare("url") == 0)
+ {
+ /* SRU URL encoding of auth stuff */
+ ODR o = odr_createmem(ODR_ENCODE);
+ char *path = 0;
+ const char *names[3];
+ const char *values[3];
+
+ names[0] = "x-username";
+ values[0] = user.c_str();
+ names[1] = "x-password";
+ values[1] = password.c_str();
+ names[2] = 0;
+ values[2] = 0;
+
+ yaz_array_to_uri(&path, o, (char **) names, (char **) values);
+ if (extraArgs.length())
+ extraArgs.append("&");
+ extraArgs.append(path);
+ odr_destroy(o);
+ }
+ else
+ {
+ b->set_option("user", user);
+ if (password.length())
+ b->set_option("password", password);
+ }
+ }
if (proxy.length())
b->set_option("proxy", proxy);
}
- std::string url;
+ if (extraArgs.length())
+ b->set_option("extraArgs", extraArgs);
+
+ std::string url(sptr->target);
if (sptr->sru.length())
{
- url = "http://" + sptr->target;
b->set_option("sru", sptr->sru);
-
+ if (url.find("://") == std::string::npos)
+ url = "http://" + url;
if (sptr->sru_version.length())
b->set_option("sru_version", sptr->sru_version);
}
- else
- {
- url = sptr->target;
- }
if (no_out_args)
{
char *x_args = 0;
if (enable_pz2_retrieval)
{
- element_set_name = 0;
- if (b->sptr->element_set.length())
- element_set_name = b->sptr->element_set.c_str();
+ if (element_set_name && !strcmp(element_set_name,
+ m_p->element_passthru.c_str()))
+ ;
+ else
+ {
+ element_set_name = 0;
+ if (b->sptr->element_set.length())
+ element_set_name = b->sptr->element_set.c_str();
+ }
}
b->set_option("elementSetName", element_set_name);
if (status)
{
error = YAZ_BIB1_MALFORMED_QUERY;
- const char *addinfo = "can not convert from RPN to CQL/SOLR";
+ const char *addinfo = "can not convert from RPN to CQL/Solr";
log_diagnostic(package, error, addinfo);
apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
package.response() = apdu_res;
{
// something fundamental broken in lookup.
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
- *addinfo = odr_strdup(odr, "Torus server unavailable or "
- "incorrectly configured");
+ *addinfo = odr_strdup(odr, "zoom: torus server unavailable or "
+ "incorrectly configured.");
return;
}
const xmlNode *ptr = xmlDocGetRootElement(doc);