X-Git-Url: http://git.indexdata.com/?p=yazproxy-moved-to-github.git;a=blobdiff_plain;f=src%2Fyaz-proxy-config.cpp;h=e0dbf5a24ba5e2d01a0432af6321c3baa693fdcd;hp=21497ec7a8e7547ed63202c554b49640391a2a58;hb=d2c4cf45aa3c566c99be2dc305e86371e59b509d;hpb=91f84eaf3ca73d717e7c462359127fd44e795bd9 diff --git a/src/yaz-proxy-config.cpp b/src/yaz-proxy-config.cpp index 21497ec..e0dbf5a 100644 --- a/src/yaz-proxy-config.cpp +++ b/src/yaz-proxy-config.cpp @@ -1,4 +1,4 @@ -/* $Id: yaz-proxy-config.cpp,v 1.7 2004-10-18 22:10:57 adam Exp $ +/* $Id: yaz-proxy-config.cpp,v 1.13 2005-01-18 10:49:22 adam Exp $ Copyright (c) 1998-2004, Index Data. This file is part of the yaz-proxy. @@ -21,14 +21,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include - -#if HAVE_XSLT -#include -#include -#include -#include -#endif +#include "proxyp.h" class Yaz_ProxyConfigP { friend class Yaz_ProxyConfig; @@ -47,7 +40,8 @@ class Yaz_ProxyConfigP { int *limit_bw, int *limit_pdu, int *limit_req, int *target_idletime, int *client_idletime, int *keepalive_limit_bw, int *keepalive_limit_pdu, - int *pre_init, const char **cql2rpn); + int *pre_init, const char **cql2rpn, + const char **authentication); void return_limit(xmlNodePtr ptr, int *limit_bw, int *limit_pdu, int *limit_req); int check_type_1(ODR odr, xmlNodePtr ptr, Z_RPNQuery *query, @@ -91,14 +85,18 @@ int Yaz_ProxyConfig::read_xml(const char *fname) if (!ndoc) { - yaz_log(LOG_WARN, "Config file %s not found or parse error", fname); + yaz_log(YLOG_WARN, "Config file %s not found or parse error", fname); return -1; // no good } + int noSubstitutions = xmlXIncludeProcess(ndoc); + if (noSubstitutions == -1) + yaz_log(YLOG_WARN, "XInclude processing failed on config %s", fname); + xmlNodePtr proxyPtr = xmlDocGetRootElement(ndoc); if (!proxyPtr || proxyPtr->type != XML_ELEMENT_NODE || strcmp((const char *) proxyPtr->name, "proxy")) { - yaz_log(LOG_WARN, "No proxy element in %s", fname); + yaz_log(YLOG_WARN, "No proxy element in %s", fname); xmlFreeDoc(ndoc); return -1; } @@ -176,7 +174,8 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, int *keepalive_limit_bw, int *keepalive_limit_pdu, int *pre_init, - const char **cql2rpn) + const char **cql2rpn, + const char **authentication) { *pre_init = 0; int no_url = 0; @@ -240,6 +239,13 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, if (t) *cql2rpn = t; } + if (ptr->type == XML_ELEMENT_NODE + && !strcmp((const char *) ptr->name, "authentication")) + { + const char *t = get_text(ptr); + if (t) + *authentication = t; + } } } #endif @@ -445,12 +451,47 @@ int Yaz_ProxyConfigP::check_schema(xmlNodePtr ptr, Z_RecordComposition *comp, } #endif +const char *Yaz_ProxyConfig::check_mime_type(const char *path) +{ + struct { + const char *mask; + const char *type; + } types[] = { + {".xml", "text/xml"}, + {".xsl", "text/xml"}, + {".tkl", "text/xml"}, + {".xsd", "text/xml"}, + {".html", "text/html"}, + {".jpg", "image/jpeg"}, + {".png", "image/png"}, + {".gif", "image/gif"}, + {0, "text/plain"}, + {0, 0}, + }; + int i; + size_t plen = strlen (path); + for (i = 0; types[i].type; i++) + if (types[i].mask == 0) + return types[i].type; + else + { + size_t mlen = strlen(types[i].mask); + if (plen > mlen && !memcmp(path+plen-mlen, types[i].mask, mlen)) + return types[i].type; + } + return "application/octet-stream"; +} + + int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, Odr_oid *syntax, Z_RecordComposition *comp, char **addinfo, char **stylesheet, char **schema, char **backend_type, - char **backend_charset) + char **backend_charset, + char **usemarcon_ini_stage1, + char **usemarcon_ini_stage2 + ) { if (stylesheet) { @@ -472,6 +513,16 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, xfree (*backend_charset); *backend_charset = 0; } + if (usemarcon_ini_stage1) + { + xfree (*usemarcon_ini_stage1); + *usemarcon_ini_stage1 = 0; + } + if (usemarcon_ini_stage2) + { + xfree (*usemarcon_ini_stage2); + *usemarcon_ini_stage2 = 0; + } #if HAVE_XSLT int syntax_has_matched = 0; xmlNodePtr ptr; @@ -492,6 +543,8 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, const char *match_identifier = 0; const char *match_backend_type = 0; const char *match_backend_charset = 0; + const char *match_usemarcon_ini_stage1 = 0; + const char *match_usemarcon_ini_stage2 = 0; struct _xmlAttr *attr; for (attr = ptr->properties; attr; attr = attr->next) { @@ -518,6 +571,14 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, attr->children && attr->children->type == XML_TEXT_NODE) match_backend_charset = (const char *) attr->children->content; + if (!strcmp((const char *) attr->name, "usemarconstage1") && + attr->children && attr->children->type == XML_TEXT_NODE) + match_usemarcon_ini_stage1 = (const char *) + attr->children->content; + if (!strcmp((const char *) attr->name, "usemarconstage2") && + attr->children && attr->children->type == XML_TEXT_NODE) + match_usemarcon_ini_stage2 = (const char *) + attr->children->content; } if (match_type) { @@ -565,6 +626,16 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, xfree(*backend_charset); *backend_charset = xstrdup(match_backend_charset); } + if (usemarcon_ini_stage1 && match_usemarcon_ini_stage1) + { + xfree(*usemarcon_ini_stage1); + *usemarcon_ini_stage1 = xstrdup(match_usemarcon_ini_stage1); + } + if (usemarcon_ini_stage1 && match_usemarcon_ini_stage2) + { + xfree(*usemarcon_ini_stage2); + *usemarcon_ini_stage2 = xstrdup(match_usemarcon_ini_stage2); + } if (match_marcxml) { return -1; @@ -680,7 +751,8 @@ int Yaz_ProxyConfig::get_target_no(int no, int *keepalive_limit_bw, int *keepalive_limit_pdu, int *pre_init, - const char **cql2rpn) + const char **cql2rpn, + const char **authentication) { #if HAVE_XSLT xmlNodePtr ptr; @@ -707,7 +779,7 @@ int Yaz_ProxyConfig::get_target_no(int no, limit_bw, limit_pdu, limit_req, target_idletime, client_idletime, keepalive_limit_bw, keepalive_limit_pdu, - pre_init, cql2rpn); + pre_init, cql2rpn, authentication); return 1; } i++; @@ -904,7 +976,8 @@ void Yaz_ProxyConfig::get_target_info(const char *name, int *keepalive_limit_bw, int *keepalive_limit_pdu, int *pre_init, - const char **cql2rpn) + const char **cql2rpn, + const char **authentication) { #if HAVE_XSLT xmlNodePtr ptr; @@ -940,7 +1013,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name, m_cp->return_target_info(ptr, url, limit_bw, limit_pdu, limit_req, target_idletime, client_idletime, keepalive_limit_bw, keepalive_limit_pdu, - pre_init, cql2rpn); + pre_init, cql2rpn, authentication); } #else *url = name;