-const char jcc_rcs[] = "$Id: jcc.c,v 1.289 2009/09/10 14:58:54 fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.297 2009/10/03 10:37:49 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
*********************************************************************/
static void mark_server_socket_tainted(struct client_state *csp)
{
- if ((csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE))
+ if ((csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE)
+ && !(csp->flags |= CSP_FLAG_SERVER_SOCKET_TAINTED))
{
log_error(LOG_LEVEL_CONNECT,
"Marking the server socket %d tainted.", csp->sfd);
req = get_request_line(csp);
if (req == NULL)
{
+ mark_server_socket_tainted(csp);
return JB_ERR_PARSE;
}
assert(*req != '\0');
}
if (server_body && server_response_is_complete(csp, byte_count))
{
- log_error(LOG_LEVEL_CONNECT,
- "Done reading from server. Expected content length: %llu. "
- "Actual content length: %llu. Bytes most recently read: %d.",
- csp->expected_content_length, byte_count, len);
+ if (csp->expected_content_length == byte_count)
+ {
+ log_error(LOG_LEVEL_CONNECT,
+ "Done reading from server. Content length: %llu as expected. "
+ "Bytes most recently read: %d.",
+ byte_count, len);
+ }
+ else
+ {
+ log_error(LOG_LEVEL_CONNECT,
+ "Done reading from server. Expected content length: %llu. "
+ "Actual content length: %llu. Bytes most recently read: %d.",
+ csp->expected_content_length, byte_count, len);
+ }
len = 0;
/*
* XXX: should not jump around,
/* Did we actually get anything? */
if (NULL == csp->headers->first)
{
- log_error(LOG_LEVEL_ERROR,
- "Empty server or forwarder response received on socket %d.", csp->sfd);
+ if ((csp->flags & CSP_FLAG_REUSED_CLIENT_CONNECTION))
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "Empty server or forwarder response received on socket %d. "
+ "Closing client connection %d without sending data.",
+ csp->sfd, csp->cfd);
+ }
+ else
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "Empty server or forwarder response received on socket %d.",
+ csp->sfd);
+ send_crunch_response(csp, error_response(csp, "no-server-data"));
+ }
log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 502 0", csp->ip_addr_str, http->cmd);
- send_crunch_response(csp, error_response(csp, "no-server-data"));
free_http_request(http);
mark_server_socket_tainted(csp);
return;
static int monitor_thread_running = 0;
#endif /* def FEATURE_CONNECTION_SHARING */
int continue_chatting = 0;
- unsigned int latency = 0;
do
{
+ unsigned int latency;
+
chat(csp);
+ latency = (unsigned)(csp->server_connection.response_received -
+ csp->server_connection.request_sent) / 2;
+
continue_chatting = (csp->config->feature_flags
& RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE)
&& (csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE)
}
/* XXX: Store per-connection flags someplace else. */
- csp->flags = CSP_FLAG_ACTIVE | (csp->flags & CSP_FLAG_TOGGLED_ON);
+ csp->flags = CSP_FLAG_ACTIVE |
+ (csp->flags & CSP_FLAG_TOGGLED_ON) | CSP_FLAG_REUSED_CLIENT_CONNECTION;
}
else
{
if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_SHARING)
&& (socket_is_still_usable(csp->sfd)))
{
- remember_connection(csp, forward_url(csp, csp->http));
+ time_t time_open = time(NULL) - csp->server_connection.timestamp;
+
+ if (csp->server_connection.keep_alive_timeout < time_open + latency)
+ {
+ break;
+ }
+
+ remember_connection(&csp->server_connection);
csp->sfd = JB_INVALID_SOCKET;
close_socket(csp->cfd);
csp->cfd = JB_INVALID_SOCKET;