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=8b98f1139c8b929fcdbfdc0401e21aa347ba204a;hb=36b087dfdcfd7d098d170ea72b29a1b0690032d2;hpb=d7f41f16caf965adb1a5ffcdaa937787dfcc030a diff --git a/src/yaz-proxy-config.cpp b/src/yaz-proxy-config.cpp index 8b98f11..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.22 2005-06-25 15:58:33 adam Exp $ - Copyright (c) 1998-2005, Index Data. - -This file is part of the yaz-proxy. +/* 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,15 +12,15 @@ 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 #include #include "proxyp.h" +#include class Yaz_ProxyConfigP { friend class Yaz_ProxyConfig; @@ -31,7 +29,7 @@ class Yaz_ProxyConfigP { int mycmp(const char *hay, const char *item, size_t len); int match_list(int v, const char *m); int atoi_l(const char **cp); -#if HAVE_XSLT +#if YAZ_HAVE_XSLT void load_modules(void); int check_schema(xmlNodePtr ptr, Z_RecordComposition *comp, const char *schema_identifier); @@ -39,25 +37,29 @@ class Yaz_ProxyConfigP { xmlNodePtr m_proxyPtr; void return_target_info(xmlNodePtr ptr, const char **url, 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, const char **negotiation_lang, - const char **target_charset); + const char **target_charset, + const char **default_client_query_charset); void return_limit(xmlNodePtr ptr, - int *limit_bw, int *limit_pdu, int *limit_req); + int *limit_bw, int *limit_pdu, int *limit_req, + 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, Z_AttributeList *attrs, 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(); @@ -66,7 +68,7 @@ class Yaz_ProxyConfigP { Yaz_ProxyConfigP::Yaz_ProxyConfigP() : m_modules() { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT m_docPtr = 0; m_proxyPtr = 0; #endif @@ -74,7 +76,7 @@ Yaz_ProxyConfigP::Yaz_ProxyConfigP() : m_modules() Yaz_ProxyConfigP::~Yaz_ProxyConfigP() { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT if (m_docPtr) xmlFreeDoc(m_docPtr); #endif @@ -90,7 +92,7 @@ Yaz_ProxyConfig::~Yaz_ProxyConfig() delete m_cp; } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT void Yaz_ProxyConfigP::load_modules() { if (!m_proxyPtr) @@ -99,7 +101,7 @@ void Yaz_ProxyConfigP::load_modules() for (ptr = m_proxyPtr->children; ptr; ptr = ptr->next) { const char *fname; - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "module") && (fname = get_text(ptr))) { @@ -111,7 +113,7 @@ void Yaz_ProxyConfigP::load_modules() int Yaz_ProxyConfig::read_xml(const char *fname) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlDocPtr ndoc = xmlParseFile(fname); if (!ndoc) @@ -146,7 +148,7 @@ int Yaz_ProxyConfig::read_xml(const char *fname) #endif } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT const char *Yaz_ProxyConfigP::get_text(xmlNodePtr ptr) { for(ptr = ptr->children; ptr; ptr = ptr->next) @@ -162,69 +164,92 @@ const char *Yaz_ProxyConfigP::get_text(xmlNodePtr ptr) } return 0; } + +void Yaz_ProxyConfigP::get_period(xmlNodePtr ptr, int *period) +{ + struct _xmlAttr *attr; + *period = 60; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!strcmp((const char *) attr->name, "period") && + attr->children && attr->children->type == XML_TEXT_NODE) + *period = atoi((const char *) attr->children->content); + } +} #endif -#if HAVE_XSLT +#if YAZ_HAVE_XSLT void Yaz_ProxyConfigP::return_limit(xmlNodePtr ptr, - int *limit_bw, - int *limit_pdu, - int *limit_req) + int *limit_bw, + int *limit_pdu, + int *limit_req, + int *limit_search) { for (ptr = ptr->children; ptr; ptr = ptr->next) { - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "bandwidth")) { const char *t = get_text(ptr); if (t) *limit_bw = atoi(t); } - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "retrieve")) { const char *t = get_text(ptr); if (t) *limit_req = atoi(t); } - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "pdu")) { const char *t = get_text(ptr); if (t) *limit_pdu = atoi(t); } + if (ptr->type == XML_ELEMENT_NODE + && !strcmp((const char *) ptr->name, "search")) + { + const char *t = get_text(ptr); + if (t) + *limit_search = atoi(t); + } } } #endif -#if HAVE_XSLT +#if YAZ_HAVE_XSLT void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, const char **url, 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, const char **negotiation_lang, - const char **target_charset) + const char **target_charset, + const char **default_client_query_charset) { *pre_init = 0; int no_url = 0; ptr = ptr->children; for (; ptr; ptr = ptr->next) { - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "preinit")) { const char *v = get_text(ptr); *pre_init = v ? atoi(v) : 1; } - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "url")) { const char *t = get_text(ptr); @@ -234,18 +259,19 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, url[no_url] = 0; } } - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "keepalive")) { int dummy; *keepalive_limit_bw = 500000; *keepalive_limit_pdu = 1000; return_limit(ptr, keepalive_limit_bw, keepalive_limit_pdu, - &dummy); + &dummy, &dummy); } if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "limit")) - return_limit(ptr, limit_bw, limit_pdu, limit_req); + return_limit(ptr, limit_bw, limit_pdu, limit_req, + limit_search); if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "target-timeout")) { @@ -257,7 +283,7 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, *target_idletime = 0; } } - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "client-timeout")) { const char *t = get_text(ptr); @@ -268,28 +294,44 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, *client_idletime = 0; } } - if (ptr->type == XML_ELEMENT_NODE + 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); if (t) *cql2rpn = t; } - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "target-charset")) { const char *t = get_text(ptr); if (t && target_charset) *target_charset = t; } - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE + && !strcmp((const char *) ptr->name, "default-client-charset")) + { + const char *t = get_text(ptr); + if (t && default_client_query_charset) + *default_client_query_charset = t; + } + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "negotiation-charset")) { const char *t = get_text(ptr); if (t) *negotiation_charset = t; } - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "negotiation-lang")) { const char *t = get_text(ptr); @@ -334,7 +376,7 @@ int Yaz_ProxyConfigP::match_list(int v, const char *m) return 0; } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int Yaz_ProxyConfigP::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, Z_AttributeList *attrs, char **addinfo) @@ -343,15 +385,15 @@ int Yaz_ProxyConfigP::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, for (i = 0; inum_attributes; i++) { Z_AttributeElement *el = attrs->attributes[i]; - + 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; - + xmlNodePtr ptr; for(ptr = ptrl->children; ptr; ptr = ptr->next) { @@ -379,7 +421,7 @@ int Yaz_ProxyConfigP::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, char addinfo_str[20]; if (!match_list(type, match_type)) continue; - + *addinfo_str = '\0'; if (!strcmp(match_type, "*")) sprintf (addinfo_str, "%d", type); @@ -387,11 +429,11 @@ 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; - + if (match_error) { if (*addinfo_str) @@ -407,7 +449,7 @@ int Yaz_ProxyConfigP::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, } #endif -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int Yaz_ProxyConfigP::check_type_1_structure(ODR odr, xmlNodePtr ptr, Z_RPNStructure *q, char **addinfo) @@ -433,7 +475,7 @@ int Yaz_ProxyConfigP::check_type_1_structure(ODR odr, xmlNodePtr ptr, } #endif -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int Yaz_ProxyConfigP::check_type_1(ODR odr, xmlNodePtr ptr, Z_RPNQuery *query, char **addinfo) { @@ -445,10 +487,10 @@ int Yaz_ProxyConfigP::check_type_1(ODR odr, xmlNodePtr ptr, Z_RPNQuery *query, int Yaz_ProxyConfig::check_query(ODR odr, const char *name, Z_Query *query, char **addinfo) { -#if HAVE_XSLT +#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) @@ -458,7 +500,7 @@ int Yaz_ProxyConfig::check_query(ODR odr, const char *name, Z_Query *query, return 0; } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int Yaz_ProxyConfigP::check_schema(xmlNodePtr ptr, Z_RecordComposition *comp, const char *schema_identifier) { @@ -478,7 +520,7 @@ int Yaz_ProxyConfigP::check_schema(xmlNodePtr ptr, Z_RecordComposition *comp, // Check each name element for (; ptr; ptr = ptr->next) { - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "name")) { xmlNodePtr tptr = ptr->children; @@ -515,6 +557,8 @@ const char *Yaz_ProxyConfig::check_mime_type(const char *path) {".jpg", "image/jpeg"}, {".png", "image/png"}, {".gif", "image/gif"}, + {".css", "text/css"}, + {".pdf", "application/pdf"}, {0, "text/plain"}, {0, 0}, }; @@ -536,11 +580,11 @@ const char *Yaz_ProxyConfig::check_mime_type(const char *path) void Yaz_ProxyConfig::target_authentication(const char *name, ODR odr, Z_InitRequest *req) { -#if HAVE_XSLT - xmlNodePtr ptr = m_cp->find_target_node(name, 0); +#if YAZ_HAVE_XSLT + xmlNodePtr ptr = m_cp->find_target_node(name); if (!ptr) return ; - + for (ptr = ptr->children; ptr; ptr = ptr->next) if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "target-authentication")) @@ -555,7 +599,9 @@ void Yaz_ProxyConfig::target_authentication(const char *name, } const char *t = m_cp->get_text(ptr); if (!t || !strcmp(type, "none")) + { req->idAuthentication = 0; + } else if (!strcmp(type, "anonymous")) { req->idAuthentication = @@ -581,7 +627,7 @@ void Yaz_ProxyConfig::target_authentication(const char *name, *password = '\0'; *user = '\0'; sscanf(t, "%63[^:]:%63[^:]:%63s", user, group, password); - + req->idAuthentication = (Z_IdAuthentication *) odr_malloc (odr, sizeof(*req->idAuthentication)); @@ -607,9 +653,9 @@ int Yaz_ProxyConfig::client_authentication(const char *name, const char *peer_IP) { int ret = YAZPROXY_RET_NOT_ME; -#if HAVE_XSLT +#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) @@ -638,6 +684,44 @@ int Yaz_ProxyConfig::client_authentication(const char *name, return 1; } +int Yaz_ProxyConfig::global_client_authentication(const char *user, + const char *group, + const char *password, + const char *peer_IP) +{ + int ret = YAZPROXY_RET_NOT_ME; +#if YAZ_HAVE_XSLT + if (!m_cp->m_proxyPtr) + return 1; + xmlNodePtr ptr; + for (ptr = m_cp->m_proxyPtr->children; ptr; ptr = ptr->next) + { + if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "client-authentication")) + { + struct _xmlAttr *attr; + const char *module_name = 0; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!strcmp((const char *) attr->name, "module") && + attr->children && attr->children->type == XML_TEXT_NODE) + module_name = (const char *) attr->children->content; + } + ret = m_cp->m_modules.authenticate(module_name, + NULL, ptr, + user, group, password, + peer_IP + ); + if (ret != YAZPROXY_RET_NOT_ME) + break; + } + } +#endif + if (ret == YAZPROXY_RET_PERM) + return 0; + return 1; +} + int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, Odr_oid *syntax, Z_RecordComposition *comp, char **addinfo, @@ -678,11 +762,11 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, xfree (*usemarcon_ini_stage2); *usemarcon_ini_stage2 = 0; } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT 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) @@ -746,8 +830,10 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, } else if (syntax) { - int match_oid[OID_SIZE]; - oid_name_to_oid(CLASS_RECSYN, match_type, match_oid); + Odr_oid *match_oid + = yaz_string_to_oid_odr(yaz_oid_std(), + CLASS_RECSYN, match_type, + odr); if (oid_oidcmp(match_oid, syntax) == 0) match = 1; } @@ -801,8 +887,8 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, return 25; if (syntax) { - char dotoid_str[100]; - oid_to_dotstring(syntax, dotoid_str); + char dotoid_str[OID_STR_MAX]; + oid_oid_to_dotstring(syntax, dotoid_str); *addinfo = odr_strdup(odr, dotoid_str); } return atoi(match_error); @@ -815,36 +901,12 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, return 0; } -#if 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) + +#if YAZ_HAVE_XSLT + +xmlNodePtr Yaz_ProxyConfigP::find_target_node(const char *name) { + /* db seems always to be passed as NULL */ xmlNodePtr ptr; if (!m_proxyPtr) return 0; @@ -853,7 +915,7 @@ xmlNodePtr Yaz_ProxyConfigP::find_target_node(const char *name, const char *db) if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "target")) { - // default one ? + // default one ? if (!name) { // ? @@ -864,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 @@ -878,13 +938,13 @@ xmlNodePtr Yaz_ProxyConfigP::find_target_node(const char *name, const char *db) { if (attr->children && attr->children->type==XML_TEXT_NODE - && attr->children->content + && attr->children->content && (!strcmp((const char *) attr->children->content, name) || !strcmp((const char *) attr->children->content, "*"))) { - return find_target_db(ptr, db); + return ptr; } } } @@ -900,8 +960,10 @@ int Yaz_ProxyConfig::get_target_no(int no, int *limit_bw, int *limit_pdu, int *limit_req, + int *limit_search, int *target_idletime, int *client_idletime, + int *max_sockets, int *max_clients, int *keepalive_limit_bw, int *keepalive_limit_pdu, @@ -910,9 +972,10 @@ int Yaz_ProxyConfig::get_target_no(int no, const char **authentication, const char **negotiation_charset, const char **negotiation_lang, - const char **target_charset) + const char **target_charset, + const char **default_client_query_charset) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr ptr; if (!m_cp->m_proxyPtr) return 0; @@ -935,10 +998,13 @@ int Yaz_ProxyConfig::get_target_no(int no, 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, target_charset); + negotiation_charset, negotiation_lang, target_charset, + default_client_query_charset); return 1; } i++; @@ -954,16 +1020,45 @@ int Yaz_ProxyConfigP::mycmp(const char *hay, const char *item, size_t len) return 0; } +int Yaz_ProxyConfig::get_file_access_info(const char *path) +{ +#if YAZ_HAVE_XSLT + xmlNodePtr ptr; + if (!m_cp->m_proxyPtr) + return 0; + for (ptr = m_cp->m_proxyPtr->children; ptr; ptr = ptr->next) + { + if (ptr->type == XML_ELEMENT_NODE + && !strcmp((const char *) ptr->name, "docpath")) + { + const char *docpath = m_cp->get_text(ptr); + size_t docpath_len = strlen(docpath); + if (docpath_len < strlen(path) && path[docpath_len] == '/' + && !memcmp(docpath, path, docpath_len)) + return 1; + } + } +#endif + return 0; +} + void Yaz_ProxyConfig::get_generic_info(int *log_mask, - int *max_clients) + int *max_clients, + int *max_connect, + int *limit_connect, + int *period_connect, + int *num_msg_threads) { -#if HAVE_XSLT + *max_connect = 0; + *limit_connect = 0; + *num_msg_threads = 0; +#if YAZ_HAVE_XSLT xmlNodePtr ptr; if (!m_cp->m_proxyPtr) return; for (ptr = m_cp->m_proxyPtr->children; ptr; ptr = ptr->next) { - if (ptr->type == XML_ELEMENT_NODE + if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "log")) { const char *v = m_cp->get_text(ptr); @@ -982,6 +1077,8 @@ void Yaz_ProxyConfig::get_generic_info(int *log_mask, *log_mask |= PROXY_LOG_REQ_CLIENT; if (m_cp->mycmp(v, "server-requests", len)) *log_mask |= PROXY_LOG_REQ_SERVER; + if (m_cp->mycmp(v, "client-ip", len)) + *log_mask |= PROXY_LOG_IP_CLIENT; if (isdigit(*v)) *log_mask |= atoi(v); if (*cp == ',') @@ -991,7 +1088,7 @@ void Yaz_ProxyConfig::get_generic_info(int *log_mask, v = cp; } } - if (ptr->type == XML_ELEMENT_NODE && + else if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "max-clients")) { const char *t = m_cp->get_text(ptr); @@ -1002,12 +1099,63 @@ void Yaz_ProxyConfig::get_generic_info(int *log_mask, *max_clients = 1; } } + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "period-connect")) + { + const char *t = m_cp->get_text(ptr); + if (t) + *period_connect = atoi(t); + } + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "max-connect")) + { + const char *t = m_cp->get_text(ptr); + if (t) + { + *max_connect = atoi(t); + } + } + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "limit-connect")) + { + const char *t = m_cp->get_text(ptr); + if (t) + { + *limit_connect = atoi(t); + } + } + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "target")) + ; + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "docpath")) + ; + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "module")) + ; + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "client-authentication")) + ; + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "threads")) + { + const char *t = m_cp->get_text(ptr); + if (t) + { + *num_msg_threads = atoi(t); + } + } + else if (ptr->type == XML_ELEMENT_NODE) + { + yaz_log(YLOG_WARN, "0 Unknown element %s in yazproxy config", + ptr->name); + } } #endif } -#if HAVE_XSLT -int Yaz_ProxyConfigP::get_explain_ptr(const char *host, const char *db, +#if YAZ_HAVE_XSLT +int Yaz_ProxyConfigP::get_explain_ptr(const char *db, xmlNodePtr *ptr_target, xmlNodePtr *ptr_explain) { @@ -1021,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) @@ -1041,7 +1202,7 @@ int Yaz_ProxyConfigP::get_explain_ptr(const char *host, const char *db, if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "database")) break; - + if (!ptr) continue; for (ptr = ptr->children; ptr; ptr = ptr->next) @@ -1054,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; @@ -1063,19 +1226,19 @@ int Yaz_ProxyConfigP::get_explain_ptr(const char *host, const char *db, const char *Yaz_ProxyConfig::get_explain_name(const char *db, const char **backend_db) { -#if HAVE_XSLT +#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; const char *name = 0; - + for (attr = ptr_target->properties; attr; attr = attr->next) if (!strcmp((const char *) attr->name, "name") && attr->children && attr->children->type==XML_TEXT_NODE - && attr->children->content + && attr->children->content && attr->children->content[0]) { name = (const char *)attr->children->content; @@ -1099,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 HAVE_XSLT +#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; } @@ -1129,8 +1302,10 @@ void Yaz_ProxyConfig::get_target_info(const char *name, int *limit_bw, int *limit_pdu, int *limit_req, + int *limit_search, int *target_idletime, int *client_idletime, + int *max_sockets, int *max_clients, int *keepalive_limit_bw, int *keepalive_limit_pdu, @@ -1138,9 +1313,10 @@ void Yaz_ProxyConfig::get_target_info(const char *name, const char **cql2rpn, const char **negotiation_charset, const char **negotiation_lang, - const char **target_charset) + const char **target_charset, + const char **default_client_query_charset) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr ptr; if (!m_cp->m_proxyPtr) { @@ -1163,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) @@ -1172,11 +1348,14 @@ void Yaz_ProxyConfig::get_target_info(const char *name, url[1] = 0; } 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, - target_charset); + target_charset, + default_client_query_charset); } #else *url = name; @@ -1188,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