X-Git-Url: http://git.indexdata.com/?p=yazproxy-moved-to-github.git;a=blobdiff_plain;f=include%2Fyazproxy%2Fproxy.h;h=5f015fefd7217bfa8e1176645865a1c8daf091c7;hp=c39a42108e7b08feee8d426b21aed71e28c4a402;hb=8acbd42b3c2cc8fec0c3e1da777415cd6ba66820;hpb=3f57a94d4bb1753d013d5bf450af407d6a32d36d diff --git a/include/yazproxy/proxy.h b/include/yazproxy/proxy.h index c39a421..5f015fe 100644 --- a/include/yazproxy/proxy.h +++ b/include/yazproxy/proxy.h @@ -1,39 +1,37 @@ -/* $Id: proxy.h,v 1.2 2004-04-11 11:58:34 adam Exp $ - Copyright (c) 1998-2004, Index Data. +/* $Id: proxy.h,v 1.34 2006-04-13 00:02:23 adam Exp $ + Copyright (c) 1998-2006, Index Data. -This file is part of the yaz-proxy. +This file is part of the yazproxy. -Zebra is free software; you can redistribute it and/or modify it under +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 Software Foundation; either version 2, or (at your option) any later version. -Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +YAZ proxy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 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 Zebra; see the file LICENSE.proxy. If not, write to the +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. */ -#if HAVE_GETTIMEOFDAY -#include -#endif -#include -#include -#include -#include +#ifndef YAZ_PROXY_H_INCLUDED +#define YAZ_PROXY_H_INCLUDED + +#include +#include +#include +#include +#include #include +#include +#include #include -#if HAVE_XSLT -#include -#include -#include -#include -#endif +#include class Yaz_Proxy; @@ -43,159 +41,41 @@ class Yaz_Proxy; #define PROXY_LOG_APDU_SERVER 2 #define PROXY_LOG_REQ_CLIENT 4 #define PROXY_LOG_REQ_SERVER 8 +#define PROXY_LOG_IP_CLIENT 16 -struct Yaz_RecordCache_Entry; - -class YAZ_EXPORT Yaz_ProxyConfig { -public: - Yaz_ProxyConfig(); - ~Yaz_ProxyConfig(); - int read_xml(const char *fname); - - int get_target_no(int no, - const char **name, - const char **url, - int *limit_bw, - int *limit_pdu, - int *limit_req, - int *target_idletime, - int *client_idletime, - int *max_clients, - int *keepalive_limit_bw, - int *keepalive_limit_pdu, - int *pre_init, - const char **cql2rpn); - - void get_generic_info(int *log_mask, int *max_clients); +class Yaz_usemarcon; +class Yaz_ProxyConfig; +class Yaz_ProxyClient; +class Yaz_CharsetConverter; - void get_target_info(const char *name, const char **url, - int *limit_bw, int *limit_pdu, int *limit_req, - int *target_idletime, int *client_idletime, - int *max_clients, - int *keepalive_limit_bw, int *keepalive_limit_pdu, - int *pre_init, - const char **cql2rpn); - - int check_query(ODR odr, const char *name, Z_Query *query, char **addinfo); - int check_syntax(ODR odr, const char *name, - Odr_oid *syntax, Z_RecordComposition *comp, - char **addinfo, char **stylesheet, char **schema); - char *get_explain(ODR odr, const char *name, const char *db, - int *len); -private: - void operator=(const Yaz_ProxyConfig &conf); - int mycmp(const char *hay, const char *item, size_t len); -#if HAVE_XSLT - int check_schema(xmlNodePtr ptr, Z_RecordComposition *comp, - const char *schema_identifier); - xmlDocPtr m_docPtr; - xmlNodePtr m_proxyPtr; - void return_target_info(xmlNodePtr ptr, const char **url, - 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); - 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, - 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); - 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); -#endif - int m_copy; - int match_list(int v, const char *m); - int atoi_l(const char **cp); -}; - -class YAZ_EXPORT Yaz_RecordCache { - public: - Yaz_RecordCache (); - ~Yaz_RecordCache (); - void add (ODR o, Z_NamePlusRecordList *npr, int start, int hits); - - int lookup (ODR o, Z_NamePlusRecordList **npr, int start, int num, - Odr_oid *syntax, Z_RecordComposition *comp); - void clear(); - - void copy_searchRequest(Z_SearchRequest *sr); - void copy_presentRequest(Z_PresentRequest *pr); - void set_max_size(int sz); - private: - NMEM m_mem; - Yaz_RecordCache_Entry *m_entries; - Z_SearchRequest *m_searchRequest; - Z_PresentRequest *m_presentRequest; - int match (Yaz_RecordCache_Entry *entry, - Odr_oid *syntax, int offset, - Z_RecordComposition *comp); - int m_max_size; -}; - -/// Private class -class YAZ_EXPORT Yaz_ProxyClient : public Yaz_Z_Assoc { - friend class Yaz_Proxy; - Yaz_ProxyClient(IYaz_PDU_Observable *the_PDU_Observable, - Yaz_Proxy *parent); - ~Yaz_ProxyClient(); - void recv_GDU(Z_GDU *apdu, int len); - void recv_Z_PDU(Z_APDU *apdu, int len); - void recv_HTTP_response(Z_HTTP_Response *apdu, int len); - IYaz_PDU_Observer* sessionNotify - (IYaz_PDU_Observable *the_PDU_Observable, int fd); - void shutdown(); - Yaz_Proxy *m_server; - void failNotify(); - void timeoutNotify(); - void connectNotify(); - int send_to_target(Z_APDU *apdu); - const char *get_session_str(); - char *m_cookie; - Yaz_ProxyClient *m_next; - Yaz_ProxyClient **m_prev; - int m_init_flag; - Yaz_Z_Query *m_last_query; - Yaz_Z_Databases m_last_databases; - char *m_last_resultSetId; - int m_last_ok; - int m_last_resultCount; - int m_sr_transform; - int m_seqno; - int m_waiting; - int m_resultSetStartPoint; - int m_bytes_sent; - int m_bytes_recv; - int m_pdu_recv; - ODR m_init_odr; - Z_APDU *m_initResponse; - Z_Options *m_initResponse_options; - Z_ProtocolVersion *m_initResponse_version; - int m_initResponse_preferredMessageSize; - int m_initResponse_maximumRecordSize; - Yaz_RecordCache m_cache; - void pre_init_client(); - int m_target_idletime; - Yaz_Proxy *m_root; +enum YAZ_Proxy_MARCXML_mode { + none, + marcxml }; +class Msg_Thread; /// Information Retrieval Proxy Server. -class YAZ_EXPORT Yaz_Proxy : public Yaz_Z_Assoc { +class YAZ_EXPORT Yaz_Proxy : public yazpp_1::Z_Assoc { + friend class Proxy_Msg; private: + char *m_peername; + int m_ref_count; + bool m_main_ptr_dec; char *get_cookie(Z_OtherInformation **otherInfo); char *get_proxy(Z_OtherInformation **otherInfo); + void get_charset_and_lang_negotiation(Z_OtherInformation **otherInfo, + char **charstes, char **langs, int *selected); + void HTTP_Forwarded(Z_GDU *z_gdu); + void connect_stat(bool &block, int &reduce); Yaz_ProxyClient *get_client(Z_APDU *apdu, const char *cookie, - const char *proxy_host); + const char *proxy_host); + void srw_get_client(const char *db, const char **backend_db); Z_APDU *result_set_optimize(Z_APDU *apdu); - void shutdown(); - + void releaseClient(); Yaz_ProxyClient *m_client; - IYaz_PDU_Observable *m_PDU_Observable; + yazpp_1::IPDU_Observable *m_PDU_Observable; + yazpp_1::ISocketObservable *m_socket_observable; Yaz_ProxyClient *m_clientPool; Yaz_Proxy *m_parent; int m_seqno; @@ -205,48 +85,71 @@ class YAZ_EXPORT Yaz_Proxy : public Yaz_Z_Assoc { int m_keepalive_limit_pdu; int m_client_idletime; int m_target_idletime; + int m_debug_mode; char *m_proxyTarget; char *m_default_target; - char *m_proxy_authentication; + char *m_proxy_negotiation_charset; + char *m_proxy_negotiation_lang; + char *m_proxy_negotiation_default_charset; long m_seed; char *m_optimize; int m_session_no; // sequence for each client session - char m_session_str[30]; // session string (time:session_no) + char m_session_str[200]; // session string (time:session_no) Yaz_ProxyConfig *m_config; char *m_config_fname; int m_bytes_sent; int m_bytes_recv; int m_bw_max; + + yazpp_1::GDU *m_timeout_gdu; + enum timeout_mode { + timeout_busy, + timeout_normal, + timeout_reduce, + timeout_xsl + } m_timeout_mode; + + int m_max_connect; + int m_max_connect_period; + int m_limit_connect; + int m_limit_connect_period; + int m_search_max; Yaz_bw m_bw_stat; int m_pdu_max; Yaz_bw m_pdu_stat; - Z_GDU *m_bw_hold_PDU; int m_max_record_retrieve; + Yaz_bw m_search_stat; + void handle_max_record_retrieve(Z_APDU *apdu); void display_diagrecs(Z_DiagRec **pp, int num); Z_Records *create_nonSurrogateDiagnostics(ODR o, int error, - const char *addinfo); + const char *addinfo); Z_APDU *handle_query_validation(Z_APDU *apdu); Z_APDU *handle_query_transformation(Z_APDU *apdu); + Z_APDU *handle_target_charset_conversion(Z_APDU *apdu); Z_APDU *handle_syntax_validation(Z_APDU *apdu); + + void handle_charset_lang_negotiation(Z_APDU *apdu); + const char *load_balance(const char **url); int m_reconfig_flag; Yaz_ProxyConfig *check_reconfigure(); int m_request_no; - int m_invalid_session; - int m_marcxml_flag; -#if HAVE_XSLT - xsltStylesheetPtr m_stylesheet_xsp; -#else - void *m_stylesheet_xsp; -#endif + int m_flag_invalid_session; + YAZ_Proxy_MARCXML_mode m_marcxml_mode; + void *m_stylesheet_xsp; // Really libxslt's xsltStylesheetPtr int m_stylesheet_offset; Z_APDU *m_stylesheet_apdu; Z_NamePlusRecordList *m_stylesheet_nprl; char *m_schema; - void convert_to_marcxml(Z_NamePlusRecordList *p); + char *m_backend_type; + char *m_backend_charset; + int m_frontend_type; + void convert_to_frontend_type(Z_NamePlusRecordList *p); + void convert_to_marcxml(Z_NamePlusRecordList *p, const char *charset); + void convert_records_charset(Z_NamePlusRecordList *p, const char *charset); int convert_xsl(Z_NamePlusRecordList *p, Z_APDU *apdu); void convert_xsl_delay(); Z_APDU *m_initRequest_apdu; @@ -254,6 +157,11 @@ class YAZ_EXPORT Yaz_Proxy : public Yaz_Z_Assoc { int m_initRequest_maximumRecordSize; Z_Options *m_initRequest_options; Z_ProtocolVersion *m_initRequest_version; + char **m_initRequest_oi_negotiation_charsets; + int m_initRequest_oi_negotiation_num_charsets; + char **m_initRequest_oi_negotiation_langs; + int m_initRequest_oi_negotiation_num_langs; + int m_initRequest_oi_negotiation_selected; NMEM m_initRequest_mem; Z_APDU *m_apdu_invalid_session; NMEM m_mem_invalid_session; @@ -268,45 +176,70 @@ class YAZ_EXPORT Yaz_Proxy : public Yaz_Z_Assoc { Z_APDU *m_s2z_present_apdu; char *m_s2z_stylesheet; char *m_soap_ns; + int file_access(Z_HTTP_Request *hreq); int send_to_srw_client_error(int error, const char *add); int send_to_srw_client_ok(int hits, Z_Records *records, int start); int send_http_response(int code); - int send_srw_response(Z_SRW_PDU *srw_pdu); + int send_srw_response(Z_SRW_PDU *srw_pdu, int http_code = 200); + int send_srw_search_response(Z_SRW_diagnostic *diagnostics, + int num_diagnostics, + int http_code = 200); int send_srw_explain_response(Z_SRW_diagnostic *diagnostics, - int num_diagnostics); + int num_diagnostics); int z_to_srw_diag(ODR o, Z_SRW_searchRetrieveResponse *srw_res, - Z_DefaultDiagFormat *ddf); + Z_DefaultDiagFormat *ddf); int m_http_keepalive; const char *m_http_version; - Yaz_cql2rpn m_cql2rpn; -#if HAVE_GETTIMEOFDAY - struct timeval m_time_tv; -#endif + yazpp_1::Yaz_cql2rpn m_cql2rpn; + void *m_time_tv; void logtime(); Z_ElementSetNames *mk_esn_from_schema(ODR o, const char *schema); Z_ReferenceId *m_referenceId; NMEM m_referenceId_mem; + #define NO_SPARE_SOLARIS_FD 10 int m_lo_fd[NO_SPARE_SOLARIS_FD]; void low_socket_open(); void low_socket_close(); + char *m_usemarcon_ini_stage1; + char *m_usemarcon_ini_stage2; + Yaz_usemarcon *m_usemarcon; + Yaz_CharsetConverter *m_charset_converter; + yazpp_1::GDUQueue m_in_queue; + LimitConnect m_connect; public: - Yaz_Proxy(IYaz_PDU_Observable *the_PDU_Observable, - Yaz_Proxy *parent = 0); + Yaz_Proxy(yazpp_1::IPDU_Observable *the_PDU_Observable, + yazpp_1::ISocketObservable *the_socket_observable, + Yaz_Proxy *parent = 0); ~Yaz_Proxy(); + + + void inc_ref(); + bool dec_ref(bool main_ptr); + + + int handle_authentication(Z_APDU *apdu); + void result_authentication(Z_APDU *apdu, int ret); + void handle_init(Z_APDU *apdu); void inc_request_no(); void recv_GDU(Z_GDU *apdu, int len); + void recv_GDU_reduce(yazpp_1::GDU *gdu); + void recv_GDU_normal(yazpp_1::GDU *gdu); + void recv_GDU_more(bool normal); void handle_incoming_HTTP(Z_HTTP_Request *req); void handle_incoming_Z_PDU(Z_APDU *apdu); - IYaz_PDU_Observer* sessionNotify - (IYaz_PDU_Observable *the_PDU_Observable, int fd); + void handle_incoming_Z_PDU_2(Z_APDU *apdu); + IPDU_Observer *sessionNotify(yazpp_1::IPDU_Observable *the_PDU_Observable, + int fd); void failNotify(); void timeoutNotify(); void connectNotify(); void markInvalid(); const char *option(const char *name, const char *value); void set_default_target(const char *target); - void set_proxy_authentication (const char *auth); + void set_proxy_negotiation(const char *charset, const char *lang, + const char *default_charset); + void set_target_charset(const char *charset); char *get_proxy_target() { return m_proxyTarget; }; char *get_session_str() { return m_session_str; }; void set_max_clients(int m) { m_max_clients = m; }; @@ -320,5 +253,18 @@ class YAZ_EXPORT Yaz_Proxy : public Yaz_Z_Assoc { void pre_init(); int get_log_mask() { return m_log_mask; }; int handle_init_response_for_invalid_session(Z_APDU *apdu); + void set_debug_mode(int mode); + void send_response_fail_client(const char *addr); + Msg_Thread *m_my_thread; + void base64_decode(const char *base64, char *buf, int buf_len); }; +#endif +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +