#include "filter_zoom.hpp"
#include <yaz/zoom.h>
#include <yaz/yaz-version.h>
+#include <yaz/tpath.h>
#include <yaz/srw.h>
#include <metaproxy/package.hpp>
#include <metaproxy/util.hpp>
std::string record_encoding;
std::string transform_xsl_fname;
std::string urlRecipe;
+ std::string contentConnector;
bool use_turbomarc;
bool piggyback;
CCL_bibset ccl_bibset;
std::string m_frontend_database;
SearchablePtr sptr;
xsltStylesheetPtr xsp;
+ std::string content_session_id;
public:
Backend(SearchablePtr sptr);
~Backend();
std::map<std::string,std::string> fieldmap;
std::string xsldir;
std::string file_path;
+ std::string content_proxy_server;
+ std::string content_tmp_file;
CCL_bibset bibset;
std::string element_transform;
std::string element_raw;
{
s->cfSubDb = mp::xml::get_text(ptr);
}
+ else if (!strcmp((const char *) ptr->name,
+ "contentConnector"))
+ {
+ s->contentConnector = mp::xml::get_text(ptr);
+ }
else if (!strcmp((const char *) ptr->name, "udb"))
{
s->udb = mp::xml::get_text(ptr);
void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only,
const char *path)
{
+ content_tmp_file = "/tmp/mp_content_proxy.";
if (path && *path)
{
file_path = path;
- if (path[strlen(path)-1] != '/')
- file_path += "/";
}
for (ptr = ptr->children; ptr; ptr = ptr->next)
{
if (cql_field.length())
fieldmap[cql_field] = ccl_field;
}
+ else if (!strcmp((const char *) ptr->name, "contentProxy"))
+ {
+ const struct _xmlAttr *attr;
+ for (attr = ptr->properties; attr; attr = attr->next)
+ {
+ if (!strcmp((const char *) attr->name, "server"))
+ content_proxy_server = mp::xml::get_text(attr->children);
+ else if (!strcmp((const char *) attr->name, "tmp_file"))
+ content_tmp_file = mp::xml::get_text(attr->children);
+ else
+ throw mp::filter::FilterException(
+ "Bad attribute " + std::string((const char *)
+ attr->name));
+ }
+ }
else
{
throw mp::filter::FilterException
xsltStylesheetPtr xsp = 0;
if (sptr->transform_xsl_fname.length())
{
+ const char *path = 0;
+
+ if (m_p->xsldir.length())
+ path = m_p->xsldir.c_str();
+ else
+ path = m_p->file_path.c_str();
std::string fname;
- if (m_p->xsldir.length())
- fname = m_p->xsldir + "/" + sptr->transform_xsl_fname;
+ char fullpath[1024];
+ char *cp = yaz_filepath_resolve(sptr->transform_xsl_fname.c_str(),
+ path, 0, fullpath);
+ if (cp)
+ fname.assign(cp);
else
- fname = m_p->file_path + sptr->transform_xsl_fname;
+ {
+ *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",
+ sptr->transform_xsl_fname.c_str());
+ BackendPtr b;
+ return b;
+ }
xmlDoc *xsp_doc = xmlParseFile(fname.c_str());
if (!xsp_doc)
{
*error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
- *addinfo = (char *) odr_malloc(odr, 40 + strlen(fname.c_str()));
- sprintf(*addinfo, "xmlParseFile failed. File %s", fname.c_str());
+ *addinfo = (char *) odr_malloc(odr, 40 + fname.length());
+ sprintf(*addinfo, "xmlParseFile failed. File: %s", fname.c_str());
BackendPtr b;
return b;
}
db_args += "proxy=" + mp::util::uri_encode(sptr->cfProxy);
}
}
+ else
+ {
+ // user may specify backend authentication for CF target
+ const char *param_user = 0;
+ const char *param_password = 0;
+ char **names;
+ char **values;
+ int i;
+ int no_parms = yaz_uri_to_array(db_args.c_str(),
+ odr, &names, &values);
+ for (i = 0; i < no_parms; i++)
+ {
+ const char *name = names[i];
+ const char *value = values[i];
+ if (!strcmp(name, "user"))
+ param_user = value;
+ else if (!strcmp(name, "password"))
+ param_password = value;
+ }
+ if (param_user && param_password)
+ {
+ authentication = std::string(param_user)
+ + "/" + std::string(param_password);
+ }
+ }
+
if (sptr->cfSubDb.length())
{
if (db_args.length())
}
if (param_user && param_password)
{
- char *auth = (char*) odr_malloc(
- odr, strlen(param_user) + strlen(param_password) + 2);
- strcpy(auth, param_user);
- strcat(auth, "/");
- strcat(auth, param_password);
- b->set_option("user", auth);
+ authentication = std::string(param_user)
+ + "/" + std::string(param_password);
}
db_args.clear(); // no arguments to be passed (non-CF)
}
- else
- {
- // use authentication from Torus, if given
- if (authentication.length())
- b->set_option("user", authentication.c_str());
- }
+ if (authentication.length())
+ b->set_option("user", authentication.c_str());
}
if (sru_proxy)
b->set_option("proxy", sru_proxy);
+
+ if (b->sptr->contentConnector.length())
+ {
+ int fd;
+
+ char *fname = (char *) xmalloc(m_p->content_tmp_file.length() + 8);
+ strcpy(fname, m_p->content_tmp_file.c_str());
+ strcat(fname, "XXXXXX");
+ fd = mkstemp(fname);
+
+ if (fd == -1)
+ {
+ yaz_log(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);
+ xfree(fname);
+ BackendPtr backend_null;
+ return backend_null;
+ }
+ b->content_session_id.assign(fname + (strlen(fname) - 6));
+ WRBUF w = wrbuf_alloc();
+ wrbuf_puts(w, "#content_proxy\n");
+ if (authentication.length())
+ wrbuf_printf(w, "authentication: %s\n", authentication.c_str());
+ if (sru_proxy)
+ wrbuf_printf(w, "proxy: %s\n", sru_proxy);
+ if (sptr->cfAuth.length())
+ wrbuf_printf(w, "cfauth: %s\n", sptr->cfAuth.c_str());
+ if (sptr->cfProxy.length())
+ wrbuf_printf(w, "cfproxy: %s\n", sptr->cfProxy.c_str());
+
+ write(fd, wrbuf_buf(w), wrbuf_len(w));
+ close(fd);
+ yaz_log(YLOG_LOG, "file %s created\n", fname);
+ xfree(fname);
+ }
+
std::string url;
if (sptr->sru.length())
xmlDoc *doc = xmlParseMemory(rec_buf, rec_len);
std::string res =
mp::xml::url_recipe_handle(doc, b->sptr->urlRecipe);
+ if (res.length() && b->content_session_id.length())
+ {
+ size_t off = res.find_first_of("://");
+ if (off != std::string::npos)
+ {
+ char tmp[1024];
+ sprintf(tmp, "%s.%s/",
+ b->content_session_id.c_str(),
+ m_p->content_proxy_server.c_str());
+ res.insert(off + 3, tmp);
+ }
+ }
if (res.length())
{
xmlNode *ptr = xmlDocGetRootElement(doc);