X-Git-Url: http://git.indexdata.com/?p=yazproxy-moved-to-github.git;a=blobdiff_plain;f=src%2Fyaz-proxy-config.cpp;h=47b79b5620d0e2bd72e820382cdddefccbf7ff4a;hp=b59d88ad32bfacfd12ccb21e7d6fb96541eb04a0;hb=224b7274aec587e4154761688815d003d0327d2a;hpb=0bfdd4ef69c5f6b002f271ac25b1192597805502 diff --git a/src/yaz-proxy-config.cpp b/src/yaz-proxy-config.cpp index b59d88a..47b79b5 100644 --- a/src/yaz-proxy-config.cpp +++ b/src/yaz-proxy-config.cpp @@ -1,7 +1,5 @@ -/* $Id: yaz-proxy-config.cpp,v 1.37 2007-05-08 12:05:09 adam Exp $ - Copyright (c) 1998-2007, Index Data. - -This file is part of the yazproxy. +/* This file is part of YAZ proxy + Copyright (C) 1998-2009 Index Data YAZ proxy 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 @@ -14,10 +12,9 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with YAZ proxy; see the file LICENSE. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. - */ +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include @@ -42,6 +39,7 @@ class Yaz_ProxyConfigP { int *limit_bw, int *limit_pdu, int *limit_req, int *limit_search, int *target_idletime, int *client_idletime, + int *max_sockets, int *keepalive_limit_bw, int *keepalive_limit_pdu, int *pre_init, const char **cql2rpn, const char **negotiation_charset, @@ -53,8 +51,7 @@ class Yaz_ProxyConfigP { int *limit_search); int check_type_1(ODR odr, xmlNodePtr ptr, Z_RPNQuery *query, char **addinfo); - xmlNodePtr find_target_node(const char *name, const char *db); - xmlNodePtr find_target_db(xmlNodePtr ptr, const char *db); + xmlNodePtr find_target_node(const char *name); const char *get_text(xmlNodePtr ptr); void get_period(xmlNodePtr ptr, int *period); int check_type_1_attributes(ODR odr, xmlNodePtr ptr, @@ -62,7 +59,7 @@ class Yaz_ProxyConfigP { char **addinfo); int check_type_1_structure(ODR odr, xmlNodePtr ptr, Z_RPNStructure *q, char **addinfo); - int get_explain_ptr(const char *host, const char *db, + int get_explain_ptr(const char *db, xmlNodePtr *ptr_target, xmlNodePtr *ptr_explain); #endif Yaz_ProxyConfigP(); @@ -231,6 +228,7 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, int *limit_search, int *target_idletime, int *client_idletime, + int *max_sockets, int *keepalive_limit_bw, int *keepalive_limit_pdu, int *pre_init, @@ -297,6 +295,15 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, } } if (ptr->type == XML_ELEMENT_NODE + && !strcmp((const char *) ptr->name, "max-sockets")) + { + const char *t = get_text(ptr); + if (t && max_sockets) + { + *max_sockets = atoi(t); + } + } + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "cql2rpn")) { const char *t = get_text(ptr); @@ -382,7 +389,7 @@ int Yaz_ProxyConfigP::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, if (!el->attributeType) continue; int type = *el->attributeType; - int *value = 0; + Odr_int *value = 0; if (el->which == Z_AttributeValue_numeric && el->value.numeric) value = el->value.numeric; @@ -422,7 +429,7 @@ int Yaz_ProxyConfigP::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, { if (!match_list(*value, match_value)) continue; - sprintf (addinfo_str, "%d", *value); + sprintf (addinfo_str, ODR_INT_PRINTF, *value); } else continue; @@ -483,7 +490,7 @@ int Yaz_ProxyConfig::check_query(ODR odr, const char *name, Z_Query *query, #if YAZ_HAVE_XSLT xmlNodePtr ptr; - ptr = m_cp->find_target_node(name, 0); + ptr = m_cp->find_target_node(name); if (ptr) { if (query->which == Z_Query_type_1 || query->which == Z_Query_type_101) @@ -574,7 +581,7 @@ void Yaz_ProxyConfig::target_authentication(const char *name, ODR odr, Z_InitRequest *req) { #if YAZ_HAVE_XSLT - xmlNodePtr ptr = m_cp->find_target_node(name, 0); + xmlNodePtr ptr = m_cp->find_target_node(name); if (!ptr) return ; @@ -648,7 +655,7 @@ int Yaz_ProxyConfig::client_authentication(const char *name, int ret = YAZPROXY_RET_NOT_ME; #if YAZ_HAVE_XSLT xmlNodePtr ptr; - ptr = m_cp->find_target_node(name, 0); + ptr = m_cp->find_target_node(name); if (!ptr) return 1; for (ptr = ptr->children; ptr; ptr = ptr->next) @@ -759,7 +766,7 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, int syntax_has_matched = 0; xmlNodePtr ptr; - ptr = m_cp->find_target_node(name, 0); + ptr = m_cp->find_target_node(name); if (!ptr) return 0; for(ptr = ptr->children; ptr; ptr = ptr->next) @@ -894,36 +901,12 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, return 0; } + #if YAZ_HAVE_XSLT -xmlNodePtr Yaz_ProxyConfigP::find_target_db(xmlNodePtr ptr, const char *db) -{ - xmlNodePtr dptr; - if (!db) - return ptr; - if (!ptr) - return 0; - for (dptr = ptr->children; dptr; dptr = dptr->next) - if (dptr->type == XML_ELEMENT_NODE && - !strcmp((const char *) dptr->name, "database")) - { - struct _xmlAttr *attr; - for (attr = dptr->properties; attr; attr = attr->next) - if (!strcmp((const char *) attr->name, "name")) - { - if (attr->children - && attr->children->type==XML_TEXT_NODE - && attr->children->content - && (!strcmp((const char *) attr->children->content, db) - || !strcmp((const char *) attr->children->content, - "*"))) - return dptr; - } - } - return ptr; -} -xmlNodePtr Yaz_ProxyConfigP::find_target_node(const char *name, const char *db) +xmlNodePtr Yaz_ProxyConfigP::find_target_node(const char *name) { + /* db seems always to be passed as NULL */ xmlNodePtr ptr; if (!m_proxyPtr) return 0; @@ -943,9 +926,7 @@ xmlNodePtr Yaz_ProxyConfigP::find_target_node(const char *name, const char *db) { xmlChar *t = attr->children->content; if (!t || *t == '1') - { - return find_target_db(ptr, db); - } + return ptr; } } else @@ -963,7 +944,7 @@ xmlNodePtr Yaz_ProxyConfigP::find_target_node(const char *name, const char *db) || !strcmp((const char *) attr->children->content, "*"))) { - return find_target_db(ptr, db); + return ptr; } } } @@ -982,6 +963,7 @@ int Yaz_ProxyConfig::get_target_no(int no, int *limit_search, int *target_idletime, int *client_idletime, + int *max_sockets, int *max_clients, int *keepalive_limit_bw, int *keepalive_limit_pdu, @@ -1018,6 +1000,7 @@ int Yaz_ProxyConfig::get_target_no(int no, limit_bw, limit_pdu, limit_req, limit_search, target_idletime, client_idletime, + max_sockets, keepalive_limit_bw, keepalive_limit_pdu, pre_init, cql2rpn, negotiation_charset, negotiation_lang, target_charset, @@ -1172,7 +1155,7 @@ void Yaz_ProxyConfig::get_generic_info(int *log_mask, } #if YAZ_HAVE_XSLT -int Yaz_ProxyConfigP::get_explain_ptr(const char *host, const char *db, +int Yaz_ProxyConfigP::get_explain_ptr(const char *db, xmlNodePtr *ptr_target, xmlNodePtr *ptr_explain) { @@ -1186,6 +1169,19 @@ int Yaz_ProxyConfigP::get_explain_ptr(const char *host, const char *db, if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "target")) { + int db_match_on_name = 0; + struct _xmlAttr *attr; + + for (attr = ptr->properties; attr; attr = attr->next) + if (!strcmp((const char *) attr->name, "name")) + { + if (attr->children + && attr->children->type==XML_TEXT_NODE + && attr->children->content + && (!strcmp((const char *) attr->children->content, + db))) + db_match_on_name = 1; + } *ptr_target = ptr; xmlNodePtr ptr = (*ptr_target)->children; for (; ptr; ptr = ptr->next) @@ -1219,6 +1215,8 @@ int Yaz_ProxyConfigP::get_explain_ptr(const char *host, const char *db, return 1; } } + if (db_match_on_name) + return 1; } } return 0; @@ -1230,7 +1228,7 @@ const char *Yaz_ProxyConfig::get_explain_name(const char *db, { #if YAZ_HAVE_XSLT xmlNodePtr ptr_target, ptr_explain; - if (m_cp->get_explain_ptr(0, db, &ptr_target, &ptr_explain) + if (m_cp->get_explain_ptr(db, &ptr_target, &ptr_explain) && ptr_target) { struct _xmlAttr *attr; @@ -1264,28 +1262,38 @@ const char *Yaz_ProxyConfig::get_explain_name(const char *db, } char *Yaz_ProxyConfig::get_explain_doc(ODR odr, const char *name, - const char *db, int *len) + const char *db, int *len, + int *http_status) { #if YAZ_HAVE_XSLT xmlNodePtr ptr_target, ptr_explain; - if (m_cp->get_explain_ptr(0 /* host */, db, &ptr_target, &ptr_explain)) + if (m_cp->get_explain_ptr(db, &ptr_target, &ptr_explain)) { - xmlNodePtr ptr2 = xmlCopyNode(ptr_explain, 1); - - xmlDocPtr doc = xmlNewDoc((const xmlChar *) "1.0"); - - xmlDocSetRootElement(doc, ptr2); - - xmlChar *buf_out; - xmlDocDumpMemory(doc, &buf_out, len); - char *content = (char*) odr_malloc(odr, *len); - memcpy(content, buf_out, *len); - - xmlFree(buf_out); - xmlFreeDoc(doc); - return content; + if (!ptr_explain) + { + *http_status = 500; + return 0; + } + else + { + xmlNodePtr ptr2 = xmlCopyNode(ptr_explain, 1); + + xmlDocPtr doc = xmlNewDoc((const xmlChar *) "1.0"); + + xmlDocSetRootElement(doc, ptr2); + + xmlChar *buf_out; + xmlDocDumpMemory(doc, &buf_out, len); + char *content = (char*) odr_malloc(odr, *len); + memcpy(content, buf_out, *len); + + xmlFree(buf_out); + xmlFreeDoc(doc); + return content; + } } #endif + *http_status = 404; return 0; } @@ -1297,6 +1305,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name, int *limit_search, int *target_idletime, int *client_idletime, + int *max_sockets, int *max_clients, int *keepalive_limit_bw, int *keepalive_limit_pdu, @@ -1330,7 +1339,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name, } } } - ptr = m_cp->find_target_node(name, 0); + ptr = m_cp->find_target_node(name); if (ptr) { if (name) @@ -1341,6 +1350,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name, m_cp->return_target_info(ptr, url, limit_bw, limit_pdu, limit_req, limit_search, target_idletime, client_idletime, + max_sockets, keepalive_limit_bw, keepalive_limit_pdu, pre_init, cql2rpn, negotiation_charset, negotiation_lang, @@ -1357,6 +1367,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab