⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ajp_header.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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. */#include "ajp_header.h"#include "ajp.h"static const char *response_trans_headers[] = {    "Content-Type",    "Content-Language",    "Content-Length",    "Date",    "Last-Modified",    "Location",    "Set-Cookie",    "Set-Cookie2",    "Servlet-Engine",    "Status",    "WWW-Authenticate"};static const char *long_res_header_for_sc(int sc){    const char *rc = NULL;    sc = sc & 0X00FF;    if(sc <= SC_RES_HEADERS_NUM && sc > 0) {        rc = response_trans_headers[sc - 1];    }    return rc;}#define UNKNOWN_METHOD (-1)static int sc_for_req_header(const char *header_name){    char header[16];    apr_size_t len = strlen(header_name);    const char *p = header_name;    int i = 0;    /* ACCEPT-LANGUAGE is the longest header     * that is of interest.     */    if (len < 4 || len > 15)        return UNKNOWN_METHOD;    while (*p)        header[i++] = apr_toupper(*p++);    header[i] = '\0';    p = &header[1];    switch (header[0]) {        case 'A':            if (memcmp(p, "CCEPT", 5) == 0) {                if (!header[6])                    return SC_ACCEPT;                else if (header[6] == '-') {                    p += 6;                    if (strcmp(p, "CHARSET") == 0)                        return SC_ACCEPT_CHARSET;                    else if (strcmp(p,  "ENCODING") == 0)                        return SC_ACCEPT_ENCODING;                    else if (strcmp(p, "LANGUAGE") == 0)                        return SC_ACCEPT_LANGUAGE;                    else                        return UNKNOWN_METHOD;                }                else                    return UNKNOWN_METHOD;            }            else if (strcmp(p, "UTHORIZATION") == 0)                return SC_AUTHORIZATION;            else                return UNKNOWN_METHOD;        break;        case 'C':            if(strcmp(p, "OOKIE2") == 0)                return SC_COOKIE2;            else if (strcmp(p, "OOKIE") == 0)                return SC_COOKIE;            else if(strcmp(p, "ONNECTION") == 0)                return SC_CONNECTION;            else if(strcmp(p, "ONTENT-TYPE") == 0)                return SC_CONTENT_TYPE;            else if(strcmp(p, "ONTENT-LENGTH") == 0)                return SC_CONTENT_LENGTH;            else                return UNKNOWN_METHOD;        break;        case 'H':            if(strcmp(p, "OST") == 0)                return SC_HOST;            else                return UNKNOWN_METHOD;        break;        case 'P':            if(strcmp(p, "RAGMA") == 0)                return SC_PRAGMA;            else                return UNKNOWN_METHOD;        break;        case 'R':            if(strcmp(p, "EFERER") == 0)                return SC_REFERER;            else                return UNKNOWN_METHOD;        break;        case 'U':            if(strcmp(p, "SER-AGENT") == 0)                return SC_USER_AGENT;            else                return UNKNOWN_METHOD;        break;        default:            return UNKNOWN_METHOD;    }    /* NOTREACHED */}/* Apache method number to SC methods transform table */static const unsigned char sc_for_req_method_table[] = {    SC_M_GET,    SC_M_PUT,    SC_M_POST,    SC_M_DELETE,    0,                      /* M_DELETE */    SC_M_OPTIONS,    SC_M_TRACE,    0,                      /* M_PATCH  */    SC_M_PROPFIND,    SC_M_PROPPATCH,    SC_M_MKCOL,    SC_M_COPY,    SC_M_MOVE,    SC_M_LOCK,    SC_M_UNLOCK,    SC_M_VERSION_CONTROL,    SC_M_CHECKOUT,    SC_M_UNCHECKOUT,    SC_M_CHECKIN,    SC_M_UPDATE,    SC_M_LABEL,    SC_M_REPORT,    SC_M_MKWORKSPACE,    SC_M_MKACTIVITY,    SC_M_BASELINE_CONTROL,    SC_M_MERGE,    0                       /* M_INVALID */};static int sc_for_req_method_by_id(request_rec *r){    int method_id = r->method_number;    if (method_id < 0 || method_id > M_INVALID) {        return UNKNOWN_METHOD;    }    else if (r->header_only) {        return SC_M_HEAD;    }    else {        return sc_for_req_method_table[method_id] ?               sc_for_req_method_table[method_id] : UNKNOWN_METHOD;    }}/* * Message structure * *AJPV13_REQUEST/AJPV14_REQUEST=    request_prefix (1) (byte)    method         (byte)    protocol       (string)    req_uri        (string)    remote_addr    (string)    remote_host    (string)    server_name    (string)    server_port    (short)    is_ssl         (boolean)    num_headers    (short)    num_headers*(req_header_name header_value)    ?context       (byte)(string)    ?servlet_path  (byte)(string)    ?remote_user   (byte)(string)    ?auth_type     (byte)(string)    ?query_string  (byte)(string)    ?jvm_route     (byte)(string)    ?ssl_cert      (byte)(string)    ?ssl_cipher    (byte)(string)    ?ssl_session   (byte)(string)    ?ssl_key_size  (byte)(int)      via JkOptions +ForwardKeySize    request_terminator (byte)    ?body          content_length*(var binary) */static apr_status_t ajp_marshal_into_msgb(ajp_msg_t *msg,                                          request_rec *r,                                          apr_uri_t *uri){    int method;    apr_uint32_t i, num_headers = 0;    apr_byte_t is_ssl;    char *remote_host;    const char *session_route, *envvar;    const apr_array_header_t *arr = apr_table_elts(r->subprocess_env);    const apr_table_entry_t *elts = (const apr_table_entry_t *)arr->elts;    ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,                         "Into ajp_marshal_into_msgb");    if ((method = sc_for_req_method_by_id(r)) == UNKNOWN_METHOD) {        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,               "ajp_marshal_into_msgb - No such method %s",               r->method);        return AJP_EBAD_METHOD;    }    is_ssl = (apr_byte_t) ap_proxy_conn_is_https(r->connection);    if (r->headers_in && apr_table_elts(r->headers_in)) {        const apr_array_header_t *t = apr_table_elts(r->headers_in);        num_headers = t->nelts;    }    remote_host = (char *)ap_get_remote_host(r->connection, r->per_dir_config, REMOTE_HOST, NULL);    ajp_msg_reset(msg);    if (ajp_msg_append_uint8(msg, CMD_AJP13_FORWARD_REQUEST)     ||        ajp_msg_append_uint8(msg, method)                        ||        ajp_msg_append_string(msg, r->protocol)                  ||        ajp_msg_append_string(msg, uri->path)                    ||        ajp_msg_append_string(msg, r->connection->remote_ip)     ||        ajp_msg_append_string(msg, remote_host)                  ||        ajp_msg_append_string(msg, ap_get_server_name(r))        ||        ajp_msg_append_uint16(msg, (apr_uint16_t)r->connection->local_addr->port) ||        ajp_msg_append_uint8(msg, is_ssl)                        ||        ajp_msg_append_uint16(msg, (apr_uint16_t) num_headers)) {        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,               "ajp_marshal_into_msgb: "               "Error appending the message begining");        return APR_EGENERAL;    }    for (i = 0 ; i < num_headers ; i++) {        int sc;        const apr_array_header_t *t = apr_table_elts(r->headers_in);        const apr_table_entry_t *elts = (apr_table_entry_t *)t->elts;        if ((sc = sc_for_req_header(elts[i].key)) != UNKNOWN_METHOD) {            if (ajp_msg_append_uint16(msg, (apr_uint16_t)sc)) {                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                       "ajp_marshal_into_msgb: "                       "Error appending the header name");                return AJP_EOVERFLOW;            }        }        else {            if (ajp_msg_append_string(msg, elts[i].key)) {                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                       "ajp_marshal_into_msgb: "                       "Error appending the header name");                return AJP_EOVERFLOW;            }        }        if (ajp_msg_append_string(msg, elts[i].val)) {            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                   "ajp_marshal_into_msgb: "                   "Error appending the header value");            return AJP_EOVERFLOW;        }        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,                   "ajp_marshal_into_msgb: Header[%d] [%s] = [%s]",                   i, elts[i].key, elts[i].val);    }/* XXXX need to figure out how to do this    if (s->secret) {        if (ajp_msg_append_uint8(msg, SC_A_SECRET) ||            ajp_msg_append_string(msg, s->secret)) {            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                   "Error ajp_marshal_into_msgb - "                   "Error appending secret");            return APR_EGENERAL;        }    } */    if (r->user) {        if (ajp_msg_append_uint8(msg, SC_A_REMOTE_USER) ||            ajp_msg_append_string(msg, r->user)) {            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                   "ajp_marshal_into_msgb: "                   "Error appending the remote user");            return AJP_EOVERFLOW;        }    }    if (r->ap_auth_type) {        if (ajp_msg_append_uint8(msg, SC_A_AUTH_TYPE) ||            ajp_msg_append_string(msg, r->ap_auth_type)) {            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                   "ajp_marshal_into_msgb: "                   "Error appending the auth type");            return AJP_EOVERFLOW;        }    }    /* XXXX  ebcdic (args converted?) */    if (uri->query) {        if (ajp_msg_append_uint8(msg, SC_A_QUERY_STRING) ||            ajp_msg_append_string(msg, uri->query)) {            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                   "ajp_marshal_into_msgb: "                   "Error appending the query string");            return AJP_EOVERFLOW;        }    }    if ((session_route = apr_table_get(r->notes, "session-route"))) {        if (ajp_msg_append_uint8(msg, SC_A_JVM_ROUTE) ||            ajp_msg_append_string(msg, session_route)) {            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                   "ajp_marshal_into_msgb: "                   "Error appending the jvm route");            return AJP_EOVERFLOW;        }    }/* XXX: Is the subprocess_env a right place? * <Location /examples> *   ProxyPass ajp://remote:8009/servlets-examples *   SetEnv SSL_SESSION_ID CUSTOM_SSL_SESSION_ID * </Location> */    /*     * Only lookup SSL variables if we are currently running HTTPS.     * Furthermore ensure that only variables get set in the AJP message     * that are not NULL and not empty.     */    if (is_ssl) {        if ((envvar = ap_proxy_ssl_val(r->pool, r->server, r->connection, r,                                       AJP13_SSL_CLIENT_CERT_INDICATOR))            && envvar[0]) {            if (ajp_msg_append_uint8(msg, SC_A_SSL_CERT)                || ajp_msg_append_string(msg, envvar)) {                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                             "ajp_marshal_into_msgb: "                             "Error appending the SSL certificates");                return AJP_EOVERFLOW;            }        }        if ((envvar = ap_proxy_ssl_val(r->pool, r->server, r->connection, r,                                       AJP13_SSL_CIPHER_INDICATOR))            && envvar[0]) {            if (ajp_msg_append_uint8(msg, SC_A_SSL_CIPHER)                || ajp_msg_append_string(msg, envvar)) {                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                             "ajp_marshal_into_msgb: "                             "Error appending the SSL ciphers");                return AJP_EOVERFLOW;            }        }        if ((envvar = ap_proxy_ssl_val(r->pool, r->server, r->connection, r,                                       AJP13_SSL_SESSION_INDICATOR))            && envvar[0]) {            if (ajp_msg_append_uint8(msg, SC_A_SSL_SESSION)                || ajp_msg_append_string(msg, envvar)) {                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                             "ajp_marshal_into_msgb: "                             "Error appending the SSL session");                return AJP_EOVERFLOW;            }        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -