jk_ajp12_worker.c
来自「Tomcat 4.1与WebServer集成组件的源代码包.」· C语言 代码 · 共 677 行 · 第 1/2 页
C
677 行
if(buffer && (bufferlen = strlen(buffer))) { return ajpv12_sendnbytes(p, buffer, bufferlen); } else { return ajpv12_sendnbytes(p, NULL, 0); }}#endif#ifdef AS400static int ajpv12_sendstring(ajp12_endpoint_t *p, char *buffer) #elsestatic int ajpv12_sendstring(ajp12_endpoint_t *p, const char *buffer) #endif{ int bufferlen; if(buffer && (bufferlen = strlen(buffer))) {#if defined(AS400) || defined(_OSD_POSIX) jk_xlate_to_ascii(buffer, bufferlen);#endif return ajpv12_sendnbytes(p, buffer, bufferlen); } else { return ajpv12_sendnbytes(p, NULL, 0); }}static int ajpv12_mark(ajp12_endpoint_t *p, unsigned char type) { if(jk_sb_write(&p->sb, &type, 1)) { return JK_TRUE; } else { return JK_FALSE; }}static int ajpv12_sendint(ajp12_endpoint_t *p, int d){ char buf[20]; sprintf(buf, "%d", d); return ajpv12_sendstring(p, buf);}static int ajpv12_flush(ajp12_endpoint_t *p){ return jk_sb_flush(&p->sb);}static int ajpv12_handle_request(ajp12_endpoint_t *p, jk_ws_service_t *s, jk_logger_t *l) { int ret; jk_log(l, JK_LOG_DEBUG, "Into ajpv12_handle_request\n"); /* * Start the ajp 12 service sequence */ jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sending the ajp12 start sequence\n"); 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 */#ifdef AS400 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) &&#ifdef AS400 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 */#ifdef AS400 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->jvm_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\n"); return JK_FALSE; } if(s->num_attributes > 0) { unsigned i; jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sending the environment variables\n"); 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\n"); return JK_FALSE; } } } jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sending the headers\n"); /* 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\n"); return JK_FALSE; } } } jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sending the terminating mark\n"); 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\n"); return JK_FALSE; } if(s->content_length) { char buf[READ_BUF_SIZE]; unsigned so_far = 0; jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sending the request body\n"); while(so_far < s->content_length) { unsigned this_time = 0; unsigned to_read = s->content_length - so_far; if(to_read > READ_BUF_SIZE) { to_read = READ_BUF_SIZE; } 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\n"); return JK_FALSE; } jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, read %d bytes\n", 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\n"); return JK_FALSE; } jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sent %d bytes\n", this_time); } else if (this_time == 0) { jk_log(l, JK_LOG_ERROR, "In ajpv12_handle_request, Error: short read. content length is %d, read %d\n", s->content_length, so_far); return JK_FALSE; } } } jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request done\n"); return JK_TRUE;}static int ajpv12_handle_response(ajp12_endpoint_t *p, jk_ws_service_t *s, jk_logger_t *l) { int status = 200; char *reason = NULL; char **names = NULL; char **values = NULL; int headers_capacity = 0; int headers_len = 0; int write_to_ws; jk_log(l, JK_LOG_DEBUG, "Into ajpv12_handle_response\n"); /* * Read headers ... */ while(1) { char *line = NULL; char *name = NULL; char *value = NULL;#ifdef AS400 char *lasts;#endif if(!jk_sb_gets(&p->sb, &line)) { jk_log(l, JK_LOG_ERROR, "ajpv12_handle_response, error reading header line\n"); return JK_FALSE; }#if defined(AS400) || defined(_OSD_POSIX) jk_xlate_from_ascii(line, strlen(line));#endif jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, read %s\n", line); if(0 == strlen(line)) { jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, headers are done\n"); break; /* Empty line -> end of headers */ } name = line; while(isspace(*name) && *name) { name++; /* Skip leading white chars */ } if(!*name) { /* Empty header name */ jk_log(l, JK_LOG_ERROR, "ajpv12_handle_response, empty header name\n"); return JK_FALSE; } if(!(value = strchr(name, ':'))) { jk_log(l, JK_LOG_ERROR, "ajpv12_handle_response, no value supplied\n"); return JK_FALSE; /* No value !!! */ } *value = '\0'; value++; while(isspace(*value) && *value) { value++; /* Skip leading white chars */ } if(!*value) { /* Empty header value */ jk_log(l, JK_LOG_ERROR, "ajpv12_handle_response, empty header value\n"); return JK_FALSE; } jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, read %s=%s\n", name, value); if(0 == strcmp("Status", name)) {#ifdef AS400 char *numeric = strtok_r(value, " \t", &lasts);#else char *numeric = strtok(value, " \t");#endif status = atoi(numeric); if(status < 100 || status > 999) { jk_log(l, JK_LOG_ERROR, "ajpv12_handle_response, invalid status code\n"); return JK_FALSE; }#ifdef AS400 reason = jk_pool_strdup(s->pool, strtok_r(NULL, " \t", &lasts));#else reason = jk_pool_strdup(s->pool, strtok(NULL, " \t"));#endif } else { if(headers_capacity == headers_len) { jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, allocating header arrays\n"); names = (char **)jk_pool_realloc(s->pool, sizeof(char *) * (headers_capacity + 5), names, sizeof(char *) * headers_capacity); values = (char **)jk_pool_realloc(s->pool, sizeof(char *) * (headers_capacity + 5), values, sizeof(char *) * headers_capacity); if(!values || !names) { jk_log(l, JK_LOG_ERROR, "ajpv12_handle_response, malloc error\n"); return JK_FALSE; } headers_capacity = headers_capacity + 5; } names[headers_len] = jk_pool_strdup(s->pool, name); values[headers_len] = jk_pool_strdup(s->pool, value); headers_len++; } } jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, starting response\n"); if(!s->start_response(s, status, reason, (const char * const *)names, (const char * const *)values, headers_len)) { jk_log(l, JK_LOG_ERROR, "ajpv12_handle_response, error starting response\n"); return JK_FALSE; } jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, reading response body\n"); /* * Read response body */ write_to_ws = JK_TRUE; while(1) { unsigned to_read = READ_BUF_SIZE; unsigned acc = 0; char *buf = NULL; if(!jk_sb_read(&p->sb, &buf, to_read, &acc)) { jk_log(l, JK_LOG_ERROR, "ajpv12_handle_response, error reading from \n"); return JK_FALSE; } if(!acc) { jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, response body is done\n"); break; } if(write_to_ws) { if(!s->write(s, buf, acc)) { jk_log(l, JK_LOG_ERROR, "ajpv12_handle_response, error writing back to server\n"); write_to_ws = JK_FALSE; } } } jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response done\n"); return JK_TRUE;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?