in native/common/jk_ajp12_worker.c [403:555]
static int ajpv12_handle_request(ajp12_endpoint_t * p,
jk_ws_service_t *s, jk_log_context_t *l)
{
int ret;
jk_log(l, JK_LOG_DEBUG, "Into ajpv12_handle_request");
/*
* Start the ajp 12 service sequence
*/
jk_log(l, JK_LOG_DEBUG,
"ajpv12_handle_request, sending the ajp12 start sequence");
ret = (ajpv12_mark(p, 1) &&
ajpv12_sendstring(p, s->method) &&
ajpv12_sendstring(p, 0) && /* zone */
ajpv12_sendstring(p, 0) && /* servlet */
ajpv12_sendstring(p, s->server_name) &&
ajpv12_sendstring(p, 0) && /* doc root */
ajpv12_sendstring(p, 0) && /* path info */
ajpv12_sendstring(p, 0) && /* path translated */
#if defined(AS400) && !defined(AS400_UTF8)
ajpv12_sendasciistring(p, s->query_string) &&
#else
ajpv12_sendstring(p, s->query_string) &&
#endif
ajpv12_sendstring(p, s->remote_addr) &&
ajpv12_sendstring(p, s->remote_host) &&
ajpv12_sendstring(p, s->remote_user) &&
ajpv12_sendstring(p, s->auth_type) &&
ajpv12_sendint(p, s->server_port) &&
#if defined(AS400) && !defined(AS400_UTF8)
ajpv12_sendasciistring(p, s->method) &&
#else
ajpv12_sendstring(p, s->method) &&
#endif
ajpv12_sendstring(p, s->req_uri) &&
ajpv12_sendstring(p, 0) &&
ajpv12_sendstring(p, 0) && /* SCRIPT_NAME */
#if defined(AS400) && !defined(AS400_UTF8)
ajpv12_sendasciistring(p, s->server_name) &&
#else
ajpv12_sendstring(p, s->server_name) &&
#endif
ajpv12_sendint(p, s->server_port) &&
ajpv12_sendstring(p, s->protocol) &&
ajpv12_sendstring(p, 0) && /* SERVER_SIGNATURE */
ajpv12_sendstring(p, s->server_software) &&
ajpv12_sendstring(p, s->route) && /* JSERV_ROUTE */
ajpv12_sendstring(p, "") && /* JSERV ajpv12 compatibility */
ajpv12_sendstring(p, "")); /* JSERV ajpv12 compatibility */
if (!ret) {
jk_log(l, JK_LOG_ERROR,
"In ajpv12_handle_request, "
"failed to send the ajp12 start sequence");
return JK_FALSE;
}
if (s->num_attributes > 0) {
unsigned i;
jk_log(l, JK_LOG_DEBUG,
"ajpv12_handle_request, sending the environment variables");
for (i = 0; i < s->num_attributes; i++) {
ret = (ajpv12_mark(p, 5) &&
ajpv12_sendstring(p, s->attributes_names[i]) &&
ajpv12_sendstring(p, s->attributes_values[i]));
if (!ret) {
jk_log(l, JK_LOG_ERROR,
"In ajpv12_handle_request, failed to send environment");
return JK_FALSE;
}
}
}
jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sending the headers");
/* Send the request headers */
if (s->num_headers) {
unsigned i;
for (i = 0; i < s->num_headers; ++i) {
ret = (ajpv12_mark(p, 3) &&
ajpv12_sendstring(p, s->headers_names[i]) &&
ajpv12_sendstring(p, s->headers_values[i]));
if (!ret) {
jk_log(l, JK_LOG_ERROR,
"In ajpv12_handle_request, failed to send headers");
return JK_FALSE;
}
}
}
jk_log(l, JK_LOG_DEBUG,
"ajpv12_handle_request, sending the terminating mark");
ret = (ajpv12_mark(p, 4) && ajpv12_flush(p));
if (!ret) {
jk_log(l, JK_LOG_ERROR,
"In ajpv12_handle_request, failed to send the terminating mark");
return JK_FALSE;
}
if (s->content_length) {
char buf[READ_BUF_SIZE];
jk_uint64_t so_far = 0;
jk_log(l, JK_LOG_DEBUG,
"ajpv12_handle_request, sending the request body");
while (so_far < s->content_length) {
unsigned this_time = 0;
unsigned to_read;
if (s->content_length > so_far + READ_BUF_SIZE) {
to_read = READ_BUF_SIZE;
}
else {
to_read = (unsigned int)(s->content_length - so_far);
}
if (!s->read(s, buf, to_read, &this_time)) {
jk_log(l, JK_LOG_ERROR,
"In ajpv12_handle_request, "
"failed to read from the web server");
return JK_FALSE;
}
jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, read %d bytes",
this_time);
if (this_time > 0) {
so_far += this_time;
if ((int)this_time != send(p->sd, buf, this_time, 0)) {
jk_log(l, JK_LOG_ERROR,
"In ajpv12_handle_request, "
"failed to write to the container");
return JK_FALSE;
}
jk_log(l, JK_LOG_DEBUG,
"ajpv12_handle_request, sent %d bytes", this_time);
}
else if (this_time == 0) {
jk_log(l, JK_LOG_ERROR,
"In ajpv12_handle_request, Error: short read. "
"Content length is %" JK_UINT64_T_FMT
", read %" JK_UINT64_T_FMT,
s->content_length, so_far);
return JK_FALSE;
}
}
}
jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request done");
return JK_TRUE;
}