diff options
Diffstat (limited to 'rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c')
-rw-r--r-- | rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c | 682 |
1 files changed, 0 insertions, 682 deletions
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c deleted file mode 100644 index c10ef0b4..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c +++ /dev/null @@ -1,682 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************** - * Description: ajpv1.2 worker, used to call local or remote jserv hosts * - * This worker is deprecated * - * Author: Gal Shachor <shachor@il.ibm.com> * - * Based on: jserv_ajpv12.c from Jserv * - * Version: $Revision: 747878 $ * - ***************************************************************************/ - -#include "jk_ajp12_worker.h" -#include "jk_pool.h" -#include "jk_connect.h" -#include "jk_util.h" -#include "jk_sockbuf.h" -#if defined(AS400) && !defined(AS400_UTF8) -#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; - - jk_sock_t 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); - -#if defined(AS400) && !defined(AS400_UTF8) -static int ajpv12_sendasciistring(ajp12_endpoint_t * p, char *buffer); -#endif - -#if defined(AS400) && !defined(AS400_UTF8) -static int ajpv12_sendstring(ajp12_endpoint_t * p, char *buffer); -#else -static int ajpv12_sendstring(ajp12_endpoint_t * p, const char *buffer); -#endif - -static 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); - -/* - * Return values of service() method for ajp12 worker: - * return value is_error reason - * JK_FALSE JK_HTTP_SERVER_ERROR Invalid parameters (null values) - * Error during connect to the backend - * ajpv12_handle_request() returns false: - * Any error during reading a request body from the client or - * sending the request to the backend - * JK_FALSE JK_HTTP_OK ajpv12_handle_response() returns false: - * Any error during reading parts of response from backend or - * sending to client - * JK_TRUE JK_HTTP_OK All other cases - */ -static int JK_METHOD service(jk_endpoint_t *e, - jk_ws_service_t *s, - jk_logger_t *l, int *is_error) -{ - ajp12_endpoint_t *p; - unsigned int attempt; - int rc = -1; - /* - * AJP12 protocol is not recoverable. - */ - - JK_TRACE_ENTER(l); - - if (!e || !e->endpoint_private || !s || !is_error) { - JK_LOG_NULL_PARAMS(l); - if (is_error) - *is_error = JK_HTTP_SERVER_ERROR; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = e->endpoint_private; - - /* Set returned error to OK */ - *is_error = JK_HTTP_OK; - - for (attempt = 0; attempt < p->worker->connect_retry_attempts; - attempt++) { - p->sd = - jk_open_socket(&p->worker->worker_inet_addr, - JK_FALSE, 0, 0, 0, l); - - jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::service, sd = %d", - p->sd); - if (IS_VALID_SOCKET(p->sd)) { - break; - } - } - if (IS_VALID_SOCKET(p->sd)) { - - 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"); - rc = ajpv12_handle_response(p, s, l); - JK_TRACE_EXIT(l); - return rc; - } - } - jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, Error sd = %d", - p->sd); - *is_error = JK_HTTP_SERVER_ERROR; - - JK_TRACE_EXIT(l); - 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"); - if (e && *e && (*e)->endpoint_private) { - ajp12_endpoint_t *p = (*e)->endpoint_private; - if (IS_VALID_SOCKET(p->sd)) { - jk_shutdown_socket(p->sd, l); - } - free(p); - *e = NULL; - return JK_TRUE; - } - - jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::done, NULL parameters"); - 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"); - - if (pThis && pThis->worker_private) { - ajp12_worker_t *p = pThis->worker_private; - int port = jk_get_worker_port(props, - p->name, - AJP_DEF_PORT); - - const 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", - p->name, host, port); - - if (host) { - if (jk_resolve(host, port, &p->worker_inet_addr, we->pool, l)) { - return JK_TRUE; - } - jk_log(l, JK_LOG_ERROR, - "In jk_worker_t::validate, resolve failed"); - } - jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, Error %s %d", - host, port); - } - else { - jk_log(l, JK_LOG_ERROR, - "In jk_worker_t::validate, NULL parameters"); - } - - 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"); - - if (pThis && pThis->worker_private && pend) { - ajp12_endpoint_t *p = - (ajp12_endpoint_t *) malloc(sizeof(ajp12_endpoint_t)); - if (p) { - p->sd = JK_INVALID_SOCKET; - 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"); - } - else { - jk_log(l, JK_LOG_ERROR, - "In jk_worker_t::get_endpoint, NULL parameters"); - } - - 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"); - 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"); - 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"); - 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; - private_data->worker.maintain = NULL; - - *w = &private_data->worker; - return JK_AJP12_WORKER_TYPE; - } - - free(private_data); - } - jk_log(l, JK_LOG_ERROR, "In ajp12_worker_factory, malloc failed"); - } - else { - jk_log(l, JK_LOG_ERROR, "In ajp12_worker_factory, NULL parameters"); - } - - return 0; -} - -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); - } -} - -#if defined(AS400) && !defined(AS400_UTF8) -static int ajpv12_sendasciistring(ajp12_endpoint_t * p, const char *buffer) -{ - int bufferlen; - - if (buffer && (bufferlen = strlen(buffer))) { - return ajpv12_sendnbytes(p, buffer, bufferlen); - } - else { - return ajpv12_sendnbytes(p, NULL, 0); - } -} -#endif - -static int ajpv12_sendstring(ajp12_endpoint_t * p, const char *buffer) -{ - int bufferlen; - - if (buffer && (bufferlen = (int)strlen(buffer))) { -#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX) - char buf[2048]; - if (bufferlen < 2048) { - memcpy(buf, buffer, bufferlen); - jk_xlate_to_ascii(buf, bufferlen); - return ajpv12_sendnbytes(p, buf, bufferlen); - } - else - return -1; -#else - return ajpv12_sendnbytes(p, buffer, bufferlen); -#endif - } - else { - return ajpv12_sendnbytes(p, NULL, 0); - } -} - -static int ajpv12_mark(ajp12_endpoint_t * p, unsigned char type) -{ - if (jk_sb_write(&p->sb, &type, 1)) { - return JK_TRUE; - } - else { - return JK_FALSE; - } -} - -static int ajpv12_sendint(ajp12_endpoint_t * p, int d) -{ - char buf[20]; - sprintf(buf, "%d", d); - return ajpv12_sendstring(p, buf); -} - -static int ajpv12_flush(ajp12_endpoint_t * p) -{ - return jk_sb_flush(&p->sb); -} - -static int ajpv12_handle_request(ajp12_endpoint_t * p, - jk_ws_service_t *s, jk_logger_t *l) -{ - int ret; - - jk_log(l, JK_LOG_DEBUG, "Into ajpv12_handle_request"); - /* - * Start the ajp 12 service sequence - */ - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sending the ajp12 start sequence"); - - ret = (ajpv12_mark(p, 1) && ajpv12_sendstring(p, s->method) && ajpv12_sendstring(p, 0) && /* zone */ - ajpv12_sendstring(p, 0) && /* servlet */ - ajpv12_sendstring(p, s->server_name) && ajpv12_sendstring(p, 0) && /* doc root */ - ajpv12_sendstring(p, 0) && /* path info */ - ajpv12_sendstring(p, 0) && /* path translated */ -#if defined(AS400) && !defined(AS400_UTF8) - ajpv12_sendasciistring(p, s->query_string) && -#else - ajpv12_sendstring(p, s->query_string) && -#endif - ajpv12_sendstring(p, s->remote_addr) && - ajpv12_sendstring(p, s->remote_host) && - ajpv12_sendstring(p, s->remote_user) && - ajpv12_sendstring(p, s->auth_type) && - ajpv12_sendint(p, s->server_port) && -#if defined(AS400) && !defined(AS400_UTF8) - ajpv12_sendasciistring(p, s->method) && -#else - ajpv12_sendstring(p, s->method) && -#endif - ajpv12_sendstring(p, s->req_uri) && ajpv12_sendstring(p, 0) && /* */ - ajpv12_sendstring(p, 0) && /* SCRIPT_NAME */ -#if defined(AS400) && !defined(AS400_UTF8) - ajpv12_sendasciistring(p, s->server_name) && -#else - ajpv12_sendstring(p, s->server_name) && -#endif - ajpv12_sendint(p, s->server_port) && ajpv12_sendstring(p, s->protocol) && ajpv12_sendstring(p, 0) && /* SERVER_SIGNATURE */ - ajpv12_sendstring(p, s->server_software) && ajpv12_sendstring(p, s->route) && /* JSERV_ROUTE */ - ajpv12_sendstring(p, "") && /* JSERV ajpv12 compatibility */ - ajpv12_sendstring(p, "")); /* JSERV ajpv12 compatibility */ - - if (!ret) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to send the ajp12 start sequence"); - return JK_FALSE; - } - - if (s->num_attributes > 0) { - unsigned i; - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sending the environment variables"); - - for (i = 0; i < s->num_attributes; i++) { - ret = (ajpv12_mark(p, 5) && - ajpv12_sendstring(p, s->attributes_names[i]) && - ajpv12_sendstring(p, s->attributes_values[i])); - if (!ret) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to send environment"); - return JK_FALSE; - } - } - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sending the headers"); - - /* Send the request headers */ - if (s->num_headers) { - unsigned i; - for (i = 0; i < s->num_headers; ++i) { - ret = (ajpv12_mark(p, 3) && - ajpv12_sendstring(p, s->headers_names[i]) && - ajpv12_sendstring(p, s->headers_values[i])); - - if (!ret) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to send headers"); - return JK_FALSE; - } - } - } - - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sending the terminating mark"); - - ret = (ajpv12_mark(p, 4) && ajpv12_flush(p)); - if (!ret) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to send the terminating mark"); - return JK_FALSE; - } - - if (s->content_length) { - char buf[READ_BUF_SIZE]; - jk_uint64_t so_far = 0; - - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sending the request body"); - - while (so_far < s->content_length) { - unsigned this_time = 0; - unsigned to_read; - if (s->content_length > so_far + READ_BUF_SIZE) { - to_read = READ_BUF_SIZE; - } - else { - to_read = (unsigned int)(s->content_length - so_far); - } - - if (!s->read(s, buf, to_read, &this_time)) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to read from the web server"); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, read %d bytes", - this_time); - if (this_time > 0) { - so_far += this_time; - if ((int)this_time != send(p->sd, buf, this_time, 0)) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to write to the container"); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sent %d bytes", this_time); - } - else if (this_time == 0) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, Error: short read. content length is %" JK_UINT64_T_FMT ", read %" JK_UINT64_T_FMT, - s->content_length, so_far); - return JK_FALSE; - } - } - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request done"); - return JK_TRUE; -} - -static int ajpv12_handle_response(ajp12_endpoint_t * p, - jk_ws_service_t *s, jk_logger_t *l) -{ - int status = 200; - char *reason = NULL; - char **names = NULL; - char **values = NULL; - int headers_capacity = 0; - int headers_len = 0; - int write_to_ws; - - jk_log(l, JK_LOG_DEBUG, "Into ajpv12_handle_response"); - /* - * Read headers ... - */ - while (1) { - char *line = NULL; - char *name = NULL; - char *value = NULL; -#ifdef _MT_CODE_PTHREAD - char *lasts; -#endif - - if (!jk_sb_gets(&p->sb, &line)) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, error reading header line"); - return JK_FALSE; - } -#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX) - jk_xlate_from_ascii(line, strlen(line)); -#endif - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, read %s", line); - if (0 == strlen(line)) { - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_response, headers are done"); - break; /* Empty line -> end of headers */ - } - - name = line; - while (isspace((int)(*name)) && *name) { - name++; /* Skip leading white chars */ - } - if (!*name) { /* Empty header name */ - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, empty header name"); - return JK_FALSE; - } - if (!(value = strchr(name, ':'))) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, no value supplied"); - return JK_FALSE; /* No value !!! */ - } - *value = '\0'; - value++; - while (isspace((int)(*value)) && *value) { - value++; /* Skip leading white chars */ - } - if (!*value) { /* Empty header value */ - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, empty header value"); - return JK_FALSE; - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, read %s=%s", name, - value); - if (0 == strcmp("Status", name)) { -#ifdef _MT_CODE_PTHREAD - char *numeric = strtok_r(value, " \t", &lasts); -#else - char *numeric = strtok(value, " \t"); -#endif - - status = atoi(numeric); - if (status < 100 || status > 999) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, invalid status code"); - return JK_FALSE; - } -#ifdef _MT_CODE_PTHREAD - reason = jk_pool_strdup(s->pool, strtok_r(NULL, " \t", &lasts)); -#else - reason = jk_pool_strdup(s->pool, strtok(NULL, " \t")); -#endif - } - else { - if (headers_capacity == headers_len) { - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_response, allocating header arrays"); - names = - (char **)jk_pool_realloc(s->pool, - sizeof(char *) * - (headers_capacity + 5), names, - sizeof(char *) * - headers_capacity); - values = - (char **)jk_pool_realloc(s->pool, - sizeof(char *) * - (headers_capacity + 5), values, - sizeof(char *) * - headers_capacity); - if (!values || !names) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, malloc error"); - return JK_FALSE; - } - headers_capacity = headers_capacity + 5; - } - names[headers_len] = jk_pool_strdup(s->pool, name); - values[headers_len] = jk_pool_strdup(s->pool, value); - headers_len++; - } - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, starting response"); - if (!s->start_response(s, - status, - reason, - (const char *const *)names, - (const char *const *)values, headers_len)) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, error starting response"); - return JK_FALSE; - } - - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_response, reading response body"); - /* - * Read response body - */ - write_to_ws = JK_TRUE; - while (1) { - unsigned to_read = READ_BUF_SIZE; - unsigned acc = 0; - char *buf = NULL; - - if (!jk_sb_read(&p->sb, &buf, to_read, &acc)) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, error reading from "); - return JK_FALSE; - } - - if (!acc) { - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_response, response body is done"); - break; - } - - if (write_to_ws) { - if (!s->write(s, buf, acc)) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, error writing back to server"); - write_to_ws = JK_FALSE; - } - } - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response done"); - return JK_TRUE; -} |