📄 jk_ajp_common.c
字号:
jk_b_append_int(msg, (unsigned short)s->server_port) ||
jk_b_append_byte(msg, (unsigned char)(s->is_ssl)) ||
jk_b_append_int(msg, (unsigned short)(s->num_headers))) {
jk_log(l, JK_LOG_ERROR,
"failed appending the message begining");
JK_TRACE_EXIT(l);
return JK_FALSE;
}
for (i = 0; i < s->num_headers; i++) {
int sc;
if ((sc = sc_for_req_header(s->headers_names[i])) != UNKNOWN_METHOD) {
if (jk_b_append_int(msg, (unsigned short)sc)) {
jk_log(l, JK_LOG_ERROR,
"failed appending the header name");
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -