in native/common/jk_ajp_common.c [718:833]
static int ajp_unmarshal_response(jk_msg_buf_t *msg,
jk_res_data_t * d,
ajp_endpoint_t * ae, jk_log_context_t *l)
{
jk_pool_t *p = &ae->pool;
JK_TRACE_ENTER(l);
d->status = jk_b_get_int(msg);
if (!d->status) {
jk_log(l, JK_LOG_ERROR,
"(%s) NULL status", ae->worker->name);
JK_TRACE_EXIT(l);
return JK_FALSE;
}
if (d->status == 0xFFFF) {
jk_log(l, JK_LOG_ERROR,
"(%s) Not enough bytes available to read status", ae->worker->name);
JK_TRACE_EXIT(l);
return JK_FALSE;
}
d->msg = jk_b_get_string(msg);
if (d->msg) {
#if (defined(AS400) && !defined(AS400_UTF8)) || 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,
"(%s) status = %d", ae->worker->name, d->status);
d->num_headers = jk_b_get_int(msg);
if (d->num_headers == 0xFFFF) {
jk_log(l, JK_LOG_ERROR,
"(%s) Not enough bytes available to read header count", ae->worker->name);
JK_TRACE_EXIT(l);
return JK_FALSE;
}
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++) {
/*
* Looking for a specific value. No need to check for errors.
* That will be handled by jk_b_get_string if the specific
* value is not found.
*/
unsigned short name = jk_b_pget_int(msg, msg->pos);
if ((name & 0XFF00) == 0XA000) {
/* Consume bytes just peeked with jk_b_pget_int */
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,
"(%s) No such sc (%d)", ae->worker->name, name);
JK_TRACE_EXIT(l);
return JK_FALSE;
}
}
else {
d->header_names[i] = jk_b_get_string(msg);
if (!d->header_names[i]) {
jk_log(l, JK_LOG_ERROR,
"(%s) NULL header name", ae->worker->name);
JK_TRACE_EXIT(l);
return JK_FALSE;
}
#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX)
jk_xlate_from_ascii(d->header_names[i],
strlen(d->header_names[i]));
#endif
}
d->header_values[i] = jk_b_get_string(msg);
if (!d->header_values[i]) {
jk_log(l, JK_LOG_ERROR,
"(%s) NULL header value", ae->worker->name);
JK_TRACE_EXIT(l);
return JK_FALSE;
}
#if (defined(AS400) && !defined(AS400_UTF8)) || 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,
"(%s) Header[%d] [%s] = [%s]",
ae->worker->name, i, d->header_names[i],
d->header_values[i]);
}
}
}
JK_TRACE_EXIT(l);
return JK_TRUE;
}