X-Git-Url: http://www.privoxy.org/gitweb/misc.html?a=blobdiff_plain;f=jcc.c;h=7cfa56d71f8f9609e19e5bacc074c4411cd2324a;hb=70ee8f843ac97cd096d29f97c3e8d04c93415aba;hp=c0d3cba7e53c2ab7eb9f9aff316e64820f2cfa7b;hpb=f89cccf0ffd0b7f0ff484e2c6947aa0f2503118c;p=privoxy.git
diff --git a/jcc.c b/jcc.c
index c0d3cba7..7cfa56d7 100644
--- a/jcc.c
+++ b/jcc.c
@@ -1,4 +1,4 @@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.298 2009/10/04 15:34:17 fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.303 2009/10/29 16:55:29 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
@@ -724,19 +724,21 @@ static void send_crunch_response(const struct client_state *csp, struct http_res
status_code[2] = rsp->head[11];
status_code[3] = '\0';
+ /* Log that the request was crunched and why. */
+ log_error(LOG_LEVEL_CRUNCH, "%s: %s", crunch_reason(rsp), http->url);
+ log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" %s %u",
+ csp->ip_addr_str, http->ocmd, status_code, rsp->content_length);
+
/* Write the answer to the client */
if (write_socket(csp->cfd, rsp->head, rsp->head_length)
|| write_socket(csp->cfd, rsp->body, rsp->content_length))
{
/* There is nothing we can do about it. */
- log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", csp->http->host);
+ log_error(LOG_LEVEL_ERROR,
+ "Couldn't deliver the error message through client socket %d: %E",
+ csp->cfd);
}
- /* Log that the request was crunched and why. */
- log_error(LOG_LEVEL_CRUNCH, "%s: %s", crunch_reason(rsp), http->url);
- log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" %s %u",
- csp->ip_addr_str, http->ocmd, status_code, rsp->content_length);
-
/* Clean up and return */
if (cgi_error_memory() != rsp)
{
@@ -1265,8 +1267,9 @@ static char *get_request_line(struct client_state *csp)
{
if (!data_is_available(csp->cfd, csp->config->socket_timeout))
{
- log_error(LOG_LEVEL_ERROR,
- "Stopped waiting for the request line.");
+ log_error(LOG_LEVEL_CONNECT,
+ "Stopped waiting for the request line. Timeout: %d.",
+ csp->config->socket_timeout);
write_socket(csp->cfd, CLIENT_CONNECTION_TIMEOUT_RESPONSE,
strlen(CLIENT_CONNECTION_TIMEOUT_RESPONSE));
return NULL;
@@ -1602,7 +1605,9 @@ static void chat(struct client_state *csp)
/* Skeleton for HTTP response, if we should intercept the request */
struct http_response *rsp;
struct timeval timeout;
+#ifdef FEATURE_CONNECTION_KEEP_ALIVE
int watch_client_socket = 1;
+#endif
memset(buf, 0, sizeof(buf));
@@ -2513,19 +2518,23 @@ static void serve(struct client_state *csp)
&& !(csp->flags & CSP_FLAG_SERVER_SOCKET_TAINTED)
&& (csp->cfd != JB_INVALID_SOCKET)
&& (csp->server_connection.sfd != JB_INVALID_SOCKET)
- && socket_is_still_usable(csp->server_connection.sfd)
- && (latency < csp->server_connection.keep_alive_timeout);
+ && socket_is_still_usable(csp->server_connection.sfd);
if (continue_chatting)
{
- unsigned int client_timeout;
-
if (!(csp->flags & CSP_FLAG_SERVER_KEEP_ALIVE_TIMEOUT_SET))
{
- log_error(LOG_LEVEL_CONNECT, "The server didn't specify how long "
- "the connection will stay open. Assume it's only a second.");
- csp->server_connection.keep_alive_timeout = 1;
+ csp->server_connection.keep_alive_timeout = csp->config->default_server_timeout;
+ log_error(LOG_LEVEL_CONNECT,
+ "The server didn't specify how long the connection will stay open. "
+ "Assumed timeout is: %u.", csp->server_connection.keep_alive_timeout);
}
+ continue_chatting = (latency < csp->server_connection.keep_alive_timeout);
+ }
+
+ if (continue_chatting)
+ {
+ unsigned int client_timeout;
client_timeout = (unsigned)csp->server_connection.keep_alive_timeout - latency;
@@ -2608,7 +2617,6 @@ static void serve(struct client_state *csp)
}
} while (continue_chatting);
- mark_connection_closed(&csp->server_connection);
#else
chat(csp);
#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
@@ -2621,6 +2629,10 @@ static void serve(struct client_state *csp)
close_socket(csp->server_connection.sfd);
}
+#ifdef FEATURE_CONNECTION_KEEP_ALIVE
+ mark_connection_closed(&csp->server_connection);
+#endif
+
if (csp->cfd != JB_INVALID_SOCKET)
{
close_socket(csp->cfd);