jk_ajp12_worker.c
来自「Tomcat 4.1与WebServer集成组件的源代码包.」· C语言 代码 · 共 677 行 · 第 1/2 页
C
677 行
/* ========================================================================= * * * * The Apache Software License, Version 1.1 * * * * Copyright (c) 1999-2001 The Apache Software Foundation. * * All rights reserved. * * * * ========================================================================= * * * * Redistribution and use in source and binary forms, with or without modi- * * fication, are permitted provided that the following conditions are met: * * * * 1. Redistributions of source code must retain the above copyright notice * * notice, this list of conditions and the following disclaimer. * * * * 2. Redistributions in binary form must reproduce the above copyright * * notice, this list of conditions and the following disclaimer in the * * documentation and/or other materials provided with the distribution. * * * * 3. The end-user documentation included with the redistribution, if any, * * must include the following acknowlegement: * * * * "This product includes software developed by the Apache Software * * Foundation <http://www.apache.org/>." * * * * Alternately, this acknowlegement may appear in the software itself, if * * and wherever such third-party acknowlegements normally appear. * * * * 4. The names "The Jakarta Project", "Jk", and "Apache Software * * Foundation" must not be used to endorse or promote products derived * * from this software without prior written permission. For written * * permission, please contact <apache@apache.org>. * * * * 5. Products derived from this software may not be called "Apache" nor may * * "Apache" appear in their names without prior written permission of the * * Apache Software Foundation. * * * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * * THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY * * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * * POSSIBILITY OF SUCH DAMAGE. * * * * ========================================================================= * * * * This software consists of voluntary contributions made by many indivi- * * duals on behalf of the Apache Software Foundation. For more information * * on the Apache Software Foundation, please see <http://www.apache.org/>. * * * * ========================================================================= *//*************************************************************************** * Description: ajpv1.2 worker, used to call local or remote jserv hosts * * Author: Gal Shachor <shachor@il.ibm.com> * * Based on: jserv_ajpv12.c from Jserv * * Version: $Revision: 1.9 $ * ***************************************************************************/#include "jk_ajp12_worker.h"#include "jk_pool.h"#include "jk_connect.h"#include "jk_util.h"#include "jk_sockbuf.h"#ifdef AS400#include "util_ebcdic.h"#include <string.h>#endif#define AJP_DEF_HOST ("localhost")#define AJP_DEF_PORT (8007)#define READ_BUF_SIZE (8*1024)#define DEF_RETRY_ATTEMPTS (1)struct ajp12_worker { struct sockaddr_in worker_inet_addr; unsigned connect_retry_attempts; char *name; jk_worker_t worker;};typedef struct ajp12_worker ajp12_worker_t;struct ajp12_endpoint { ajp12_worker_t *worker; int sd; jk_sockbuf_t sb; jk_endpoint_t endpoint;};typedef struct ajp12_endpoint ajp12_endpoint_t;static int ajpv12_mark(ajp12_endpoint_t *p, unsigned char type);#ifdef AS400static int ajpv12_sendasciistring(ajp12_endpoint_t *p, char *buffer);#endif#ifdef AS400static int ajpv12_sendstring(ajp12_endpoint_t *p, char *buffer);#elsestatic int ajpv12_sendstring(ajp12_endpoint_t *p, const char *buffer);#endifstatic int ajpv12_sendint(ajp12_endpoint_t *p, int d);static int ajpv12_sendnbytes(ajp12_endpoint_t *p, const void *buffer, int bufferlen);static int ajpv12_flush(ajp12_endpoint_t *p);static int ajpv12_handle_response(ajp12_endpoint_t *p, jk_ws_service_t *s, jk_logger_t *l);static int ajpv12_handle_request(ajp12_endpoint_t *p, jk_ws_service_t *s, jk_logger_t *l);static int JK_METHOD service(jk_endpoint_t *e, jk_ws_service_t *s, jk_logger_t *l, int *is_recoverable_error){ jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::service\n"); if(e && e->endpoint_private && s && is_recoverable_error) { ajp12_endpoint_t *p = e->endpoint_private; unsigned attempt; *is_recoverable_error = JK_TRUE; for(attempt = 0 ; attempt < p->worker->connect_retry_attempts ; attempt++) { p->sd = jk_open_socket(&p->worker->worker_inet_addr, JK_TRUE, JK_FALSE, l); jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::service, sd = %d\n", p->sd); if(p->sd >= 0) { break; } } if(p->sd >= 0) { /* * After we are connected, each error that we are going to * have is probably unrecoverable */ *is_recoverable_error = JK_FALSE; jk_sb_open(&p->sb, p->sd); if(ajpv12_handle_request(p, s, l)) { jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::service, sent request\n"); return ajpv12_handle_response(p, s, l); } } jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, Error sd = %d\n", p->sd); } else { jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, NULL parameters\n"); } return JK_FALSE;}static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l){ jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::done\n"); if(e && *e && (*e)->endpoint_private) { ajp12_endpoint_t *p = (*e)->endpoint_private; if(p->sd > 0) { jk_close_socket(p->sd); } free(p); *e = NULL; return JK_TRUE; } jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::done, NULL parameters\n"); return JK_FALSE;}static int JK_METHOD validate(jk_worker_t *pThis, jk_map_t *props, jk_worker_env_t *we, jk_logger_t *l){ jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::validate\n"); if(pThis && pThis->worker_private) { ajp12_worker_t *p = pThis->worker_private; int port = jk_get_worker_port(props, p->name, AJP_DEF_PORT); char *host = jk_get_worker_host(props, p->name, AJP_DEF_HOST); jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::validate for worker %s contact is %s:%d\n", p->name, host, port); if(port > 1024 && host) { if(jk_resolve(host, (short)port, &p->worker_inet_addr)) { return JK_TRUE; } jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, resolve failed\n"); } jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, Error %s %d\n", host, port); } else { jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, NULL parameters\n"); } return JK_FALSE;}static int JK_METHOD init(jk_worker_t *pThis, jk_map_t *props, jk_worker_env_t *we, jk_logger_t *log){ /* Nothing to do for now */ return JK_TRUE;}static int JK_METHOD get_endpoint(jk_worker_t *pThis, jk_endpoint_t **pend, jk_logger_t *l){ jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::get_endpoint\n"); if(pThis && pThis->worker_private && pend) { ajp12_endpoint_t *p = (ajp12_endpoint_t *)malloc(sizeof(ajp12_endpoint_t)); if(p) { p->sd = -1; p->worker = pThis->worker_private; p->endpoint.endpoint_private = p; p->endpoint.service = service; p->endpoint.done = done; *pend = &p->endpoint; return JK_TRUE; } jk_log(l, JK_LOG_ERROR, "In jk_worker_t::get_endpoint, malloc failed\n"); } else { jk_log(l, JK_LOG_ERROR, "In jk_worker_t::get_endpoint, NULL parameters\n"); } return JK_FALSE;}static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l){ jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::destroy\n"); if(pThis && *pThis && (*pThis)->worker_private) { ajp12_worker_t *private_data = (*pThis)->worker_private; free(private_data->name); free(private_data); return JK_TRUE; } jk_log(l, JK_LOG_ERROR, "In jk_worker_t::destroy, NULL parameters\n"); return JK_FALSE;}int JK_METHOD ajp12_worker_factory(jk_worker_t **w, const char *name, jk_logger_t *l){ jk_log(l, JK_LOG_DEBUG, "Into ajp12_worker_factory\n"); if(NULL != name && NULL != w) { ajp12_worker_t *private_data = (ajp12_worker_t *)malloc(sizeof(ajp12_worker_t)); if(private_data) { private_data->name = strdup(name); if(private_data->name) { private_data->connect_retry_attempts= DEF_RETRY_ATTEMPTS; private_data->worker.worker_private = private_data; private_data->worker.validate = validate; private_data->worker.init = init; private_data->worker.get_endpoint = get_endpoint; private_data->worker.destroy = destroy; *w = &private_data->worker; return JK_TRUE; } free(private_data); } jk_log(l, JK_LOG_ERROR, "In ajp12_worker_factory, malloc failed\n"); } else { jk_log(l, JK_LOG_ERROR, "In ajp12_worker_factory, NULL parameters\n"); } return JK_FALSE;}static int ajpv12_sendnbytes(ajp12_endpoint_t *p, const void *buffer, int bufferlen) { unsigned char bytes[2]; static const unsigned char null_b[2] = { (unsigned char)0xff, (unsigned char)0xff }; if(buffer) { bytes[0] = (unsigned char) ( (bufferlen >> 8) & 0xff ); bytes[1] = (unsigned char) ( bufferlen & 0xff ); if(jk_sb_write(&p->sb, bytes, 2)) { return jk_sb_write(&p->sb, buffer, bufferlen); } else { return JK_FALSE; } } else { return jk_sb_write(&p->sb, null_b, 2); }}#ifdef AS400static int ajpv12_sendasciistring(ajp12_endpoint_t *p, char *buffer) { int bufferlen;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?