X-Git-Url: http://git.indexdata.com/?p=yazproxy-moved-to-github.git;a=blobdiff_plain;f=src%2Fyaz-proxy-config.cpp;h=dbf03a58fb42e5e30c9220e16e08642c9fa01a0f;hp=5bc04fc204c31f1b0500b65bcd4eaf4d8e7a6960;hb=b276287e0e21b0bb267c5d5a7d87254ee1f5e29f;hpb=32c6e333211e98fe4ad78fb86f2c9acd444ca24f diff --git a/src/yaz-proxy-config.cpp b/src/yaz-proxy-config.cpp index 5bc04fc..dbf03a5 100644 --- a/src/yaz-proxy-config.cpp +++ b/src/yaz-proxy-config.cpp @@ -1,7 +1,7 @@ -/* $Id: yaz-proxy-config.cpp,v 1.23 2005-09-26 09:25:06 adam Exp $ - Copyright (c) 1998-2005, Index Data. +/* $Id: yaz-proxy-config.cpp,v 1.30 2006-04-06 16:25:21 adam Exp $ + Copyright (c) 1998-2006, Index Data. -This file is part of the yaz-proxy. +This file is part of the yazproxy. 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 @@ -39,21 +39,23 @@ 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 *limit_connect, + int *limit_search, int *target_idletime, int *client_idletime, 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_search, int *limit_connect); + 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); 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); @@ -101,7 +103,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))) { @@ -164,6 +166,18 @@ 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 @@ -171,26 +185,25 @@ void Yaz_ProxyConfigP::return_limit(xmlNodePtr ptr, int *limit_bw, int *limit_pdu, int *limit_req, - int *limit_search, - int *limit_connect) + 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); @@ -204,13 +217,6 @@ void Yaz_ProxyConfigP::return_limit(xmlNodePtr ptr, if (t) *limit_search = atoi(t); } - if (ptr->type == XML_ELEMENT_NODE - && !strcmp((const char *) ptr->name, "connect")) - { - const char *t = get_text(ptr); - if (t) - *limit_connect = atoi(t); - } } } #endif @@ -222,7 +228,6 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, int *limit_pdu, int *limit_req, int *limit_search, - int *limit_connect, int *target_idletime, int *client_idletime, int *keepalive_limit_bw, @@ -231,20 +236,21 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, 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); @@ -254,19 +260,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); + &dummy, &dummy); } if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "limit")) return_limit(ptr, limit_bw, limit_pdu, limit_req, - limit_search, limit_connect); + limit_search); if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "target-timeout")) { @@ -278,7 +284,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); @@ -289,28 +295,35 @@ 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, "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); @@ -364,15 +377,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; - + if (el->which == Z_AttributeValue_numeric && el->value.numeric) value = el->value.numeric; - + xmlNodePtr ptr; for(ptr = ptrl->children; ptr; ptr = ptr->next) { @@ -400,7 +413,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); @@ -412,7 +425,7 @@ int Yaz_ProxyConfigP::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, } else continue; - + if (match_error) { if (*addinfo_str) @@ -468,7 +481,7 @@ int Yaz_ProxyConfig::check_query(ODR odr, const char *name, Z_Query *query, { #if HAVE_XSLT xmlNodePtr ptr; - + ptr = m_cp->find_target_node(name, 0); if (ptr) { @@ -499,7 +512,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; @@ -536,6 +549,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}, }; @@ -561,7 +576,7 @@ void Yaz_ProxyConfig::target_authentication(const char *name, xmlNodePtr ptr = m_cp->find_target_node(name, 0); if (!ptr) return ; - + for (ptr = ptr->children; ptr; ptr = ptr->next) if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "target-authentication")) @@ -576,7 +591,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 = @@ -602,7 +619,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)); @@ -702,7 +719,7 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, #if HAVE_XSLT int syntax_has_matched = 0; xmlNodePtr ptr; - + ptr = m_cp->find_target_node(name, 0); if (!ptr) return 0; @@ -854,7 +871,7 @@ xmlNodePtr Yaz_ProxyConfigP::find_target_db(xmlNodePtr ptr, const char *db) { if (attr->children && attr->children->type==XML_TEXT_NODE - && attr->children->content + && attr->children->content && (!strcmp((const char *) attr->children->content, db) || !strcmp((const char *) attr->children->content, "*"))) @@ -863,7 +880,7 @@ xmlNodePtr Yaz_ProxyConfigP::find_target_db(xmlNodePtr ptr, const char *db) } return ptr; } - + xmlNodePtr Yaz_ProxyConfigP::find_target_node(const char *name, const char *db) { xmlNodePtr ptr; @@ -874,7 +891,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) { // ? @@ -899,7 +916,7 @@ 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, @@ -922,7 +939,6 @@ int Yaz_ProxyConfig::get_target_no(int no, int *limit_pdu, int *limit_req, int *limit_search, - int *limit_connect, int *target_idletime, int *client_idletime, int *max_clients, @@ -933,7 +949,8 @@ 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 xmlNodePtr ptr; @@ -958,11 +975,12 @@ int Yaz_ProxyConfig::get_target_no(int no, m_cp->return_target_info( ptr, url, limit_bw, limit_pdu, limit_req, - limit_search, limit_connect, + limit_search, target_idletime, client_idletime, 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++; @@ -978,16 +996,43 @@ 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 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) { + *max_connect = 0; + *limit_connect = 0; #if 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); @@ -1006,6 +1051,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 == ',') @@ -1015,7 +1062,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); @@ -1026,6 +1073,42 @@ 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) + { + yaz_log(YLOG_WARN, "0 Unknown element %s in yazproxy config", + ptr->name); + } } #endif } @@ -1065,7 +1148,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) @@ -1094,12 +1177,12 @@ const char *Yaz_ProxyConfig::get_explain_name(const char *db, { 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; @@ -1130,16 +1213,16 @@ char *Yaz_ProxyConfig::get_explain_doc(ODR odr, const char *name, if (m_cp->get_explain_ptr(0 /* host */, 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; @@ -1154,7 +1237,6 @@ void Yaz_ProxyConfig::get_target_info(const char *name, int *limit_pdu, int *limit_req, int *limit_search, - int *limit_connect, int *target_idletime, int *client_idletime, int *max_clients, @@ -1164,7 +1246,8 @@ 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 xmlNodePtr ptr; @@ -1198,12 +1281,13 @@ 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, limit_connect, + limit_search, target_idletime, client_idletime, keepalive_limit_bw, keepalive_limit_pdu, pre_init, cql2rpn, negotiation_charset, negotiation_lang, - target_charset); + target_charset, + default_client_query_charset); } #else *url = name;