-const char jcc_rcs[] = "$Id: jcc.c,v 1.232 2009/03/08 19:29:16 fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.238 2009/03/27 14:42:30 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
*
* Revisions :
* $Log: jcc.c,v $
+ * Revision 1.238 2009/03/27 14:42:30 fabiankeil
+ * Correct the status code for CONNECTION_TIMEOUT_RESPONSE.
+ *
+ * Revision 1.237 2009/03/27 14:32:04 fabiankeil
+ * If spawning a child in listen_loop() fails, send a real
+ * HTTP response to the client and continue listening for
+ * new connections without artificial delay.
+ *
+ * Revision 1.236 2009/03/25 17:30:24 fabiankeil
+ * In serve(), keep the client socket open until we marked the
+ * server socket as unused. This should increase the chances
+ * that we reuse the connection for the client's next request
+ * to the same destination.
+ *
+ * Revision 1.235 2009/03/18 21:01:20 fabiankeil
+ * Comment fix. Spotted by Roland.
+ *
+ * Revision 1.234 2009/03/18 20:48:42 fabiankeil
+ * If the --no-daemon option is used, enable LOG_LEVEL_INFO
+ * before the config file has been parsed (as we always did).
+ *
+ * Revision 1.233 2009/03/13 14:10:07 fabiankeil
+ * Fix some more harmless warnings on amd64.
+ *
* Revision 1.232 2009/03/08 19:29:16 fabiankeil
* Reinitialize the timeout structure every time before passing
* it to select(). Apparently some implementations mess with it.
"Connection: close\r\n\r\n"
"Bad request. Messed up with header filters.\r\n";
+static const char TOO_MANY_CONNECTIONS_RESPONSE[] =
+ "HTTP/1.0 503 Too many open connections\r\n"
+ "Proxy-Agent: Privoxy " VERSION "\r\n"
+ "Content-Type: text/plain\r\n"
+ "Connection: close\r\n\r\n"
+ "Maximum number of open connections reached.\r\n";
+
/* XXX: should be a template */
static const char CONNECTION_TIMEOUT_RESPONSE[] =
- "HTTP/1.0 502 Connection timeout\r\n"
+ "HTTP/1.0 504 Connection timeout\r\n"
"Proxy-Agent: Privoxy " VERSION "\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
mark_server_socket_tainted(csp);
return;
}
-
- rsp = error_response(csp, "connect-failed", errno);
- if (rsp)
- {
- send_crunch_response(csp, rsp);
- }
-
- return;
+ /*
+ * XXX: Consider handling the cases above the same.
+ */
+ mark_server_socket_tainted(csp);
+ len = 0;
}
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
* Function : serve
*
* Description : This is little more than chat. We only "serve" to
- * to close any socket that chat may have opened.
+ * to close (or remember) any socket that chat may have
+ * opened.
*
* Parameters :
* 1 : csp = Current client state (buffers, headers, etc...)
#endif /* def AMIGA */
{
chat(csp);
- close_socket(csp->cfd);
if (csp->sfd != JB_INVALID_SOCKET)
{
&& (csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE))
{
remember_connection(csp->sfd, csp->http, forward_url(csp, csp->http));
+ close_socket(csp->cfd);
+ csp->cfd = JB_INVALID_SOCKET;
privoxy_mutex_lock(&connection_reuse_mutex);
if (!monitor_thread_running)
{
#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
}
+ if (csp->cfd != JB_INVALID_SOCKET)
+ {
+ close_socket(csp->cfd);
+ }
+
csp->flags &= ~CSP_FLAG_ACTIVE;
}
else if (strcmp(argv[argc_pos], "--no-daemon" ) == 0)
{
+ set_debug_level(LOG_LEVEL_FATAL | LOG_LEVEL_ERROR | LOG_LEVEL_INFO);
no_daemon = 1;
}
}
#endif /* 1 */
/*
- * stderr (fd 2) will be closed later on, when the
- * log file has been parsed.
+ * stderr (fd 2) will be closed later on,
+ * when the config file has been parsed.
*/
close( 0 );
#undef SELECTED_ONE_OPTION
/* end of cpp switch () */
- if (child_id < 0) /* failed */
+ if (child_id < 0)
{
- char buf[BUFFER_SIZE];
-
- log_error(LOG_LEVEL_ERROR, "can't fork: %E");
-
- snprintf(buf , sizeof(buf), "Privoxy: can't fork: errno = %d", errno);
-
- write_socket(csp->cfd, buf, strlen(buf));
+ /*
+ * Spawning the child failed, assume it's because
+ * there are too many children running already.
+ * XXX: If you assume ...
+ */
+ log_error(LOG_LEVEL_ERROR,
+ "Unable to take any additional connections: %E");
+ write_socket(csp->cfd, TOO_MANY_CONNECTIONS_RESPONSE,
+ strlen(TOO_MANY_CONNECTIONS_RESPONSE));
close_socket(csp->cfd);
csp->flags &= ~CSP_FLAG_ACTIVE;
- sleep(5);
- continue;
}
}
else