X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ftorus.cpp;h=e286adf7e58b518600a20037f4b9ff6af36aca69;hb=056d8d0c4ee4b9e383463ecdde7aa84901909aa4;hp=924781a7d752db934d759327df47225937f2a005;hpb=c6105f042dd7591d8566fa590eb92476b2435bb5;p=metaproxy-moved-to-github.git diff --git a/src/torus.cpp b/src/torus.cpp index 924781a..e286adf 100644 --- a/src/torus.cpp +++ b/src/torus.cpp @@ -1,5 +1,5 @@ /* This file is part of Metaproxy. - Copyright (C) 2005-2011 Index Data + Copyright (C) 2005-2012 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 @@ -20,168 +20,86 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include -#include -#include -#include - +#include +#include +#include #include "torus.hpp" namespace mp = metaproxy_1; - -static Z_GDU *get_HTTP_Request_url(ODR odr, const char *url) +xmlDoc *mp::get_searchable(mp::Package &package, + std::string url_template, const std::string &db, + const std::string &query, + const std::string &realm, + const std::string &proxy) { - Z_GDU *p = z_get_HTTP_Request(odr); - const char *host = url; - const char *cp0 = strstr(host, "://"); - const char *cp1 = 0; - if (cp0) - cp0 = cp0+3; + // http://mk2.indexdata.com/torus2/searchable/records/?query=udb%3d%db + // or + // http://mk2.indexdata.com/torus2/searchable/records/?query=%query + xmlDoc *doc = 0; + size_t found; + + found = url_template.find("%query"); + if (found != std::string::npos) + url_template.replace(found, 6, mp::util::uri_encode(query)); else - cp0 = host; - - cp1 = strchr(cp0, '/'); - if (!cp1) - cp1 = cp0 + strlen(cp0); - - if (cp0 && cp1) { - char *h = (char*) odr_malloc(odr, cp1 - cp0 + 1); - memcpy (h, cp0, cp1 - cp0); - h[cp1-cp0] = '\0'; - z_HTTP_header_add(odr, &p->u.HTTP_Request->headers, "Host", h); - } - p->u.HTTP_Request->path = odr_strdup(odr, *cp1 ? cp1 : "/"); - return p; -} - -static WRBUF get_url(const char *uri, WRBUF username, WRBUF password, - int *code) -{ - int number_of_redirects = 0; - WRBUF result = 0; - ODR out = odr_createmem(ODR_ENCODE); - ODR in = odr_createmem(ODR_DECODE); - - while (1) - { - Z_HTTP_Response *res = 0; - const char *location = 0; - Z_GDU *gdu = get_HTTP_Request_url(out, uri); - yaz_log(YLOG_LOG, "GET %s", uri); - gdu->u.HTTP_Request->method = odr_strdup(out, "GET"); - if (username && password) - { - z_HTTP_header_add_basic_auth(out, &gdu->u.HTTP_Request->headers, - wrbuf_cstr(username), - wrbuf_cstr(password)); - } - z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, "Accept", - "application/xml"); - if (!z_GDU(out, &gdu, 0, 0)) - { - yaz_log(YLOG_WARN, "Can not encode HTTP request URL:%s", uri); - break; - } - void *add; - COMSTACK conn = cs_create_host(uri, 1, &add); - if (!conn) - yaz_log(YLOG_WARN, "Bad address for URL:%s", uri); - else if (cs_connect(conn, add) < 0) - yaz_log(YLOG_WARN, "Can not connect to URL:%s", uri); - else - { - int len; - char *buf = odr_getbuf(out, &len, 0); - - if (cs_put(conn, buf, len) < 0) - yaz_log(YLOG_WARN, "cs_put failed URL:%s", uri); - else - { - char *netbuffer = 0; - int netlen = 0; - int cs_res = cs_get(conn, &netbuffer, &netlen); - if (cs_res <= 0) - { - yaz_log(YLOG_WARN, "cs_get failed URL:%s", uri); - } - else - { - Z_GDU *gdu; - odr_setbuf(in, netbuffer, cs_res, 0); - if (!z_GDU(in, &gdu, 0, 0) - || gdu->which != Z_GDU_HTTP_Response) - { - yaz_log(YLOG_WARN, "HTTP decoding failed " - "URL:%s", uri); - } - else - { - res = gdu->u.HTTP_Response; - } - } - xfree(netbuffer); - } - cs_close(conn); - } - if (!res) - break; // ERROR - *code = res->code; - location = z_HTTP_header_lookup(res->headers, "Location"); - if (++number_of_redirects < 10 && - location && (*code == 301 || *code == 302 || *code == 307)) - { - odr_reset(out); - uri = odr_strdup(out, location); - odr_reset(in); - } - else + if (db.length() == 0) { - result = wrbuf_alloc(); - wrbuf_write(result, res->content_buf, res->content_len); - break; + package.log("zoom", YLOG_WARN, + "%query not defined in code == 200 && + http_response->content_buf) { - xmlFreeDoc(doc); - doc = 0; + package.log("zoom", YLOG_LOG, "Torus: %s OK", url_template.c_str()); + doc = xmlParseMemory(http_response->content_buf, + http_response->content_len); + } - if (url.length() == 0) - return; - - int code; - WRBUF w = get_url(url.c_str(), 0, 0, &code); - if (code == 200) + else { - doc = xmlParseMemory(wrbuf_buf(w), wrbuf_len(w)); - if (doc) - yaz_log(YLOG_LOG, "xmlParseMemory OK"); + package.log("zoom", YLOG_WARN, "Torus: %s FAIL", url_template.c_str()); + if (http_response) + { + package.log("zoom", YLOG_LOG, "HTTP code: %d", http_response->code); + } } - wrbuf_destroy(w); -} -xmlDoc *mp::Torus::get_doc() -{ + if (http_response && http_response->content_buf) + { + package.log("zoom", YLOG_LOG, "HTTP content"); + package.log_write(http_response->content_buf, + http_response->content_len); + } + yaz_url_destroy(url_p); return doc; }