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

📄 jk_ajp_common.c

📁 jboss与apache集成的中间件,详情请参看文档说明.
💻 C
📖 第 1 页 / 共 5 页
字号:
                JK_TRACE_EXIT(l);                return JK_FALSE;            }        }        else {            if (jk_b_append_string(msg, s->headers_names[i])) {                jk_log(l, JK_LOG_ERROR,                       "failed appending the header name");                JK_TRACE_EXIT(l);                return JK_FALSE;            }        }        if (jk_b_append_string(msg, s->headers_values[i])) {            jk_log(l, JK_LOG_ERROR,                   "failed appending the header value");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    if (s->secret) {        if (jk_b_append_byte(msg, SC_A_SECRET) ||            jk_b_append_string(msg, s->secret)) {            jk_log(l, JK_LOG_ERROR,                   "failed appending secret");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    if (s->remote_user) {        if (jk_b_append_byte(msg, SC_A_REMOTE_USER) ||            jk_b_append_string(msg, s->remote_user)) {            jk_log(l, JK_LOG_ERROR,                   "failed appending the remote user");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    if (s->auth_type) {        if (jk_b_append_byte(msg, SC_A_AUTH_TYPE) ||            jk_b_append_string(msg, s->auth_type)) {            jk_log(l, JK_LOG_ERROR,                   "failed appending the auth type");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    if (s->query_string) {        if (jk_b_append_byte(msg, SC_A_QUERY_STRING) ||#ifdef AS400            jk_b_append_asciistring(msg, s->query_string)) {#else            jk_b_append_string(msg, s->query_string)) {#endif            jk_log(l, JK_LOG_ERROR,                   "failed appending the query string");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    if (s->jvm_route) {        if (jk_b_append_byte(msg, SC_A_JVM_ROUTE) ||            jk_b_append_string(msg, s->jvm_route)) {            jk_log(l, JK_LOG_ERROR,                   "failed appending the jvm route");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    if (s->ssl_cert_len) {        if (jk_b_append_byte(msg, SC_A_SSL_CERT) ||            jk_b_append_string(msg, s->ssl_cert)) {            jk_log(l, JK_LOG_ERROR,                   "failed appending the SSL certificates");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    if (s->ssl_cipher) {        if (jk_b_append_byte(msg, SC_A_SSL_CIPHER) ||            jk_b_append_string(msg, s->ssl_cipher)) {            jk_log(l, JK_LOG_ERROR,                   "failed appending the SSL ciphers");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    if (s->ssl_session) {        if (jk_b_append_byte(msg, SC_A_SSL_SESSION) ||            jk_b_append_string(msg, s->ssl_session)) {            jk_log(l, JK_LOG_ERROR,                   "failed appending the SSL session");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    /*     * ssl_key_size is required by Servlet 2.3 API     * added support only in ajp14 mode     * JFC removed: ae->proto == AJP14_PROTO     */    if (s->ssl_key_size != -1) {        if (jk_b_append_byte(msg, SC_A_SSL_KEY_SIZE) ||            jk_b_append_int(msg, (unsigned short)s->ssl_key_size)) {            jk_log(l, JK_LOG_ERROR,                   "failed appending the SSL key size");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    /* If the method was unrecognized, encode it as an attribute */    if (method == SC_M_JK_STORED) {        if (JK_IS_DEBUG_LEVEL(l))            jk_log(l, JK_LOG_DEBUG, "unknown method %s", s->method);        if (jk_b_append_byte(msg, SC_A_STORED_METHOD) ||            jk_b_append_string(msg, s->method)) {            jk_log(l, JK_LOG_ERROR,                   "failed appending the request method");            JK_TRACE_EXIT(l);            return JK_FALSE;        }    }    if (s->num_attributes > 0) {        for (i = 0; i < s->num_attributes; i++) {            if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) ||                jk_b_append_string(msg, s->attributes_names[i]) ||                jk_b_append_string(msg, s->attributes_values[i])) {                jk_log(l, JK_LOG_ERROR,                       "failed appending attribute %s=%s",                       s->attributes_names[i], s->attributes_values[i]);                JK_TRACE_EXIT(l);                return JK_FALSE;            }        }    }    if (jk_b_append_byte(msg, SC_A_ARE_DONE)) {        jk_log(l, JK_LOG_ERROR,               "failed appending the message end");        JK_TRACE_EXIT(l);        return JK_FALSE;    }    if (JK_IS_DEBUG_LEVEL(l))        jk_log(l, JK_LOG_DEBUG, "ajp marshaling done");    JK_TRACE_EXIT(l);    return JK_TRUE;}/*AJPV13_RESPONSE/AJPV14_RESPONSE:=    response_prefix (2)    status          (short)    status_msg      (short)    num_headers     (short)    num_headers*(res_header_name header_value)    *body_chunk    terminator      boolean <! -- recycle connection or not  -->req_header_name :=    sc_req_header_name | (string)res_header_name :=    sc_res_header_name | (string)header_value :=    (string)body_chunk :=    length  (short)    body    length*(var binary) */static int ajp_unmarshal_response(jk_msg_buf_t *msg,                                  jk_res_data_t * d,                                  ajp_endpoint_t * ae, jk_logger_t *l){    jk_pool_t *p = &ae->pool;    d->status = jk_b_get_int(msg);    JK_TRACE_ENTER(l);    if (!d->status) {        jk_log(l, JK_LOG_ERROR,               "NULL status");        JK_TRACE_EXIT(l);        return JK_FALSE;    }    d->msg = (char *)jk_b_get_string(msg);    if (d->msg) {#if defined(AS400) || defined(_OSD_POSIX)        jk_xlate_from_ascii(d->msg, strlen(d->msg));#endif    }    if (JK_IS_DEBUG_LEVEL(l))        jk_log(l, JK_LOG_DEBUG,               "status = %d", d->status);    d->num_headers = jk_b_get_int(msg);    d->header_names = d->header_values = NULL;    if (JK_IS_DEBUG_LEVEL(l))        jk_log(l, JK_LOG_DEBUG,               "Number of headers is = %d",               d->num_headers);    if (d->num_headers) {        d->header_names = jk_pool_alloc(p, sizeof(char *) * d->num_headers);        d->header_values = jk_pool_alloc(p, sizeof(char *) * d->num_headers);        if (d->header_names && d->header_values) {            unsigned int i;            for (i = 0; i < d->num_headers; i++) {                unsigned short name = jk_b_pget_int(msg, msg->pos);                if ((name & 0XFF00) == 0XA000) {                    jk_b_get_int(msg);                    name = name & 0X00FF;                    if (name <= SC_RES_HEADERS_NUM) {                        d->header_names[i] =                            (char *)long_res_header_for_sc(name);                    }                    else {                        jk_log(l, JK_LOG_ERROR,                               "No such sc (%d)", name);                        JK_TRACE_EXIT(l);                        return JK_FALSE;                    }                }                else {                    d->header_names[i] = (char *)jk_b_get_string(msg);                    if (!d->header_names[i]) {                        jk_log(l, JK_LOG_ERROR,                               "NULL header name");                        JK_TRACE_EXIT(l);                        return JK_FALSE;                    }#if defined(AS400) || defined(_OSD_POSIX)                    jk_xlate_from_ascii(d->header_names[i],                                        strlen(d->header_names[i]));#endif                }                d->header_values[i] = (char *)jk_b_get_string(msg);                if (!d->header_values[i]) {                    jk_log(l, JK_LOG_ERROR,                           "NULL header value");                    JK_TRACE_EXIT(l);                    return JK_FALSE;                }#if defined(AS400) || defined(_OSD_POSIX)                jk_xlate_from_ascii(d->header_values[i],                                    strlen(d->header_values[i]));#endif                if (JK_IS_DEBUG_LEVEL(l))                    jk_log(l, JK_LOG_DEBUG,                           "Header[%d] [%s] = [%s]",                           i, d->header_names[i], d->header_values[i]);            }        }    }    JK_TRACE_EXIT(l);    return JK_TRUE;}/* * Reset the endpoint (clean buf) */static void ajp_reset_endpoint(ajp_endpoint_t * ae, jk_logger_t *l){    if (ae->sd > 0 && !ae->reuse) {        jk_shutdown_socket(ae->sd);        if (JK_IS_DEBUG_LEVEL(l))            jk_log(l, JK_LOG_DEBUG,                   "reset socket with sd = %d", ae->sd);        ae->sd = -1;    }    jk_reset_pool(&(ae->pool));}/* * Close the endpoint (clean buf and close socket) */void ajp_close_endpoint(ajp_endpoint_t * ae, jk_logger_t *l){    JK_TRACE_ENTER(l);    if (ae->sd > 0) {        jk_shutdown_socket(ae->sd);        if (JK_IS_DEBUG_LEVEL(l))            jk_log(l, JK_LOG_DEBUG,                   "closed socket with sd = %d", ae->sd);        ae->sd = -1;    }    jk_close_pool(&(ae->pool));    free(ae);    JK_TRACE_EXIT(l);}/* * Try another connection from cache */static void ajp_next_connection(ajp_endpoint_t *ae, jk_logger_t *l){    int rc;    ajp_worker_t *aw = ae->worker;    int sock = ae->sd;    JK_ENTER_CS(&aw->cs, rc);    if (rc) {        unsigned int i;        /* Mark existing endpoint socket as closed */        ae->sd = -1;        for (i = 0; i < aw->ep_cache_sz; i++) {            /* Find cache slot with usable socket */            if (aw->ep_cache[i] && aw->ep_cache[i]->sd != -1) {                ae->sd = aw->ep_cache[i]->sd;                aw->ep_cache[i]->sd = -1;                break;            }        }        JK_LEAVE_CS(&aw->cs, rc);        /* Close previous socket */        jk_close_socket(sock);    }}/* * Wait input event on ajp_endpoint for timeout ms */static int ajp_is_input_event(ajp_endpoint_t * ae, int timeout, jk_logger_t *l){    fd_set rset;    struct timeval tv;    int rc;    FD_ZERO(&rset);    FD_SET(ae->sd, &rset);    tv.tv_sec = timeout / 1000;    tv.tv_usec = (timeout % 1000) * 1000;    do {        rc = select(ae->sd + 1, &rset, NULL, NULL, &tv);    } while (rc < 0 && errno == EINTR);    if (rc == 0) {        /* Timeout. Set the errno to timeout */#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))        errno = WSAETIMEDOUT - WSABASEERR;#else        errno = ETIMEDOUT;#endif        return JK_FALSE;    }    else if (rc < 0) {        jk_log(l, JK_LOG_WARNING,               "error during select err=%d", errno);        return JK_FALSE;    }    else        return JK_TRUE;}/* * Handle the CPING/CPONG initial query */static int ajp_handle_cping_cpong(ajp_endpoint_t * ae, int timeout, jk_logger_t *l){    int cmd;    jk_msg_buf_t *msg;    JK_TRACE_ENTER(l);    msg = jk_b_new(&ae->pool);    jk_b_set_buffer_size(msg, 16);      /* 16 is way too large but I'm lazy :-) */    jk_b_reset(msg);    jk_b_append_byte(msg, AJP13_CPING_REQUEST);    /* Send CPing query */    if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) {        jk_log(l, JK_LOG_INFO,               "can't send cping query");        JK_TRACE_EXIT(l);        return JK_FALSE;    }    /* wait for Pong reply for timeout milliseconds     */    if (ajp_is_input_event(ae, timeout, l) == JK_FALSE) {        jk_log(l, JK_LOG_INFO, "timeout in reply pong");        JK_TRACE_EXIT(l);        return JK_FALSE;    }    /* Read and check for Pong reply

⌨️ 快捷键说明

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