📄 jk_ajp_common.c
字号:
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 + -