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

📄 ajp_msg.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.h"static char *hex_table = "0123456789ABCDEF";/** * Dump up to the first 1024 bytes on an AJP Message * * @param pool      pool to allocate from * @param msg       AJP Message to dump * @param err       error string to display * @return          dump message */char * ajp_msg_dump(apr_pool_t *pool, ajp_msg_t *msg, char *err){    apr_size_t  i, j;    char        line[80];    char        *current;    char        *rv, *p;    apr_size_t  bl = 8192;    apr_byte_t  x;    apr_size_t  len = msg->len;    /* Display only first 1024 bytes */    if (len > 1024)        len = 1024;    rv = apr_palloc(pool, bl);    apr_snprintf(rv, bl,                 "ajp_msg_dump(): %s pos=%" APR_SIZE_T_FMT                 " len=%" APR_SIZE_T_FMT " max=%" APR_SIZE_T_FMT "\n",                 err, msg->pos, msg->len, msg->max_size);    bl -= strlen(rv);    p = rv + strlen(rv);    for (i = 0; i < len; i += 16) {        current = line;        for (j = 0; j < 16; j++) {             x = msg->buf[i + j];            *current++ = hex_table[x >> 4];            *current++ = hex_table[x & 0x0f];            *current++ = ' ';        }        *current++ = ' ';        *current++ = '-';        *current++ = ' ';        for (j = 0; j < 16; j++) {            x = msg->buf[i + j];            if (x > 0x20 && x < 0x7F) {                *current++ = x;            }            else {                *current++ = '.';            }        }        *current++ = '\0';        apr_snprintf(p, bl,                     "ajp_msg_dump(): %.4lx    %s\n",                     (unsigned long)i, line);        bl -= strlen(rv);        p = rv + strlen(rv);    }    return rv;}/** * Check a new AJP Message by looking at signature and return its size * * @param msg       AJP Message to check * @param len       Pointer to returned len * @return          APR_SUCCESS or error */apr_status_t ajp_msg_check_header(ajp_msg_t *msg, apr_size_t *len){    apr_byte_t *head = msg->buf;    apr_size_t msglen;    if (!((head[0] == 0x41 && head[1] == 0x42) ||          (head[0] == 0x12 && head[1] == 0x34))) {        ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,                      "ajp_check_msg_header() got bad signature %x%x",                      head[0], head[1]);        return AJP_EBAD_SIGNATURE;    }    msglen  = ((head[2] & 0xff) << 8);    msglen += (head[3] & 0xFF);    if (msglen > msg->max_size) {        ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,                     "ajp_check_msg_header() incoming message is "                     "too big %" APR_SIZE_T_FMT ", max is %" APR_SIZE_T_FMT,                     msglen, msg->max_size);        return AJP_ETOBIG;    }    msg->len = msglen + AJP_HEADER_LEN;    msg->pos = AJP_HEADER_LEN;    *len     = msglen;    return APR_SUCCESS;}/** * Reset an AJP Message * * @param msg       AJP Message to reset * @return          APR_SUCCESS or error */apr_status_t ajp_msg_reset(ajp_msg_t *msg){    msg->len = AJP_HEADER_LEN;    msg->pos = AJP_HEADER_LEN;    return APR_SUCCESS;}/** * Reuse an AJP Message * * @param msg       AJP Message to reuse * @return          APR_SUCCESS or error */apr_status_t ajp_msg_reuse(ajp_msg_t *msg){    apr_byte_t *buf;    apr_size_t max_size;    buf = msg->buf;    max_size = msg->max_size;    memset(msg, 0, sizeof(ajp_msg_t));    msg->buf = buf;    msg->max_size = max_size;    msg->header_len = AJP_HEADER_LEN;    ajp_msg_reset(msg);    return APR_SUCCESS;}/** * Mark the end of an AJP Message * * @param msg       AJP Message to end * @return          APR_SUCCESS or error */apr_status_t ajp_msg_end(ajp_msg_t *msg){    apr_size_t len = msg->len - AJP_HEADER_LEN;    if (msg->server_side) {        msg->buf[0] = 0x41;        msg->buf[1] = 0x42;    }    else {        msg->buf[0] = 0x12;        msg->buf[1] = 0x34;    }    msg->buf[2] = (apr_byte_t)((len >> 8) & 0xFF);    msg->buf[3] = (apr_byte_t)(len & 0xFF);    return APR_SUCCESS;}static APR_INLINE int ajp_log_overflow(ajp_msg_t *msg, const char *context){    ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,                 "%s(): BufferOverflowException %" APR_SIZE_T_FMT                 " %" APR_SIZE_T_FMT,                 context, msg->pos, msg->len);    return AJP_EOVERFLOW;}/** * Add an unsigned 32bits value to AJP Message * * @param msg       AJP Message to get value from * @param value     value to add to AJP Message * @return          APR_SUCCESS or error */apr_status_t ajp_msg_append_uint32(ajp_msg_t *msg, apr_uint32_t value){    apr_size_t len = msg->len;    if ((len + 4) > msg->max_size) {        return ajp_log_overflow(msg, "ajp_msg_append_uint32");    }    msg->buf[len]     = (apr_byte_t)((value >> 24) & 0xFF);    msg->buf[len + 1] = (apr_byte_t)((value >> 16) & 0xFF);    msg->buf[len + 2] = (apr_byte_t)((value >> 8) & 0xFF);    msg->buf[len + 3] = (apr_byte_t)(value & 0xFF);    msg->len += 4;    return APR_SUCCESS;}/** * Add an unsigned 16bits value to AJP Message * * @param msg       AJP Message to get value from * @param value     value to add to AJP Message * @return          APR_SUCCESS or error */apr_status_t ajp_msg_append_uint16(ajp_msg_t *msg, apr_uint16_t value){    apr_size_t len = msg->len;    if ((len + 2) > msg->max_size) {        return ajp_log_overflow(msg, "ajp_msg_append_uint16");    }    msg->buf[len]     = (apr_byte_t)((value >> 8) & 0xFF);    msg->buf[len + 1] = (apr_byte_t)(value & 0xFF);    msg->len += 2;    return APR_SUCCESS;}/** * Add an unsigned 8bits value to AJP Message * * @param msg       AJP Message to get value from * @param value     value to add to AJP Message * @return          APR_SUCCESS or error */apr_status_t ajp_msg_append_uint8(ajp_msg_t *msg, apr_byte_t value){    apr_size_t len = msg->len;    if ((len + 1) > msg->max_size) {        return ajp_log_overflow(msg, "ajp_msg_append_uint8");    }    msg->buf[len] = value;    msg->len += 1;    return APR_SUCCESS;}/** *  Add a String in AJP message, and transform the String in ASCII *  if convert is set and we're on an EBCDIC machine * * @param msg       AJP Message to get value from * @param value     Pointer to String * @param convert   When set told to convert String to ASCII * @return          APR_SUCCESS or error */apr_status_t ajp_msg_append_string_ex(ajp_msg_t *msg, const char *value,                                      int convert){    size_t len;    if (value == NULL) {        return(ajp_msg_append_uint16(msg, 0xFFFF));    }    len = strlen(value);    if ((msg->len + len + 2) > msg->max_size) {        return ajp_log_overflow(msg, "ajp_msg_append_cvt_string");    }    /* ignore error - we checked once */    ajp_msg_append_uint16(msg, (apr_uint16_t)len);    /* We checked for space !!  */    memcpy(msg->buf + msg->len, value, len + 1); /* including \0 */    if (convert)   /* convert from EBCDIC if needed */        ajp_xlate_to_ascii((char *)msg->buf + msg->len, len + 1);    msg->len += len + 1;    return APR_SUCCESS;}/** * Add a Byte array to AJP Message *

⌨️ 快捷键说明

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