-const char jcc_rcs[] = "$Id: jcc.c,v 1.366 2011/10/08 17:30:21 fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.374 2011/11/06 11:58:51 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
* Description : Read the client's request (more precisely the
* client headers) and answer it if necessary.
*
- * Note that since we're not using select() we could get
- * blocked here if a client connected, then didn't say
- * anything!
- *
* Parameters :
* 1 : csp = Current client state (buffers, headers, etc...)
*
}
#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
- hdr = list_to_text(csp->headers);
- if (hdr == NULL)
- {
- /* FIXME Should handle error properly */
- log_error(LOG_LEVEL_FATAL, "Out of memory parsing client header");
- }
- list_remove_all(csp->headers);
-
if (fwd->forward_host || (http->ssl == 0))
{
+ hdr = list_to_text(csp->headers);
+ if (hdr == NULL)
+ {
+ /* FIXME Should handle error properly */
+ log_error(LOG_LEVEL_FATAL, "Out of memory parsing client header");
+ }
+ list_remove_all(csp->headers);
+
/*
* Write the client's (modified) header to the server
* (along with anything else that may be in the buffer)
freez(hdr);
return;
}
+ freez(hdr);
}
else
{
/*
* We're running an SSL tunnel and we're not forwarding,
- * so just send the "connect succeeded" message to the
- * client, flush the rest, and get out of the way.
+ * so just ditch the client headers, send the "connect succeeded"
+ * message to the client, flush the rest, and get out of the way.
*/
+ list_remove_all(csp->headers);
if (write_socket(csp->cfd, CSUCCEED, strlen(CSUCCEED)))
{
- freez(hdr);
return;
}
IOB_RESET(csp);
csp->server_connection.request_sent = time(NULL);
- /* we're finished with the client's header */
- freez(hdr);
-
maxfd = (csp->cfd > csp->server_connection.sfd) ?
csp->cfd : csp->server_connection.sfd;
*********************************************************************/
static void prepare_csp_for_next_request(struct client_state *csp)
{
+ unsigned int toggled_on_flag_set = (0 != (csp->flags & CSP_FLAG_TOGGLED_ON));
+
csp->content_type = 0;
csp->content_length = 0;
csp->expected_content_length = 0;
csp->fwd = NULL;
}
/* XXX: Store per-connection flags someplace else. */
- csp->flags &= CSP_FLAG_TOGGLED_ON;
- csp->flags |= CSP_FLAG_ACTIVE;
- csp->flags |= CSP_FLAG_REUSED_CLIENT_CONNECTION;
+ csp->flags = (CSP_FLAG_ACTIVE | CSP_FLAG_REUSED_CLIENT_CONNECTION);
+ if (toggled_on_flag_set)
+ {
+ csp->flags |= CSP_FLAG_TOGGLED_ON;
+ }
}
#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
&& ((csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE)
|| (csp->flags & CSP_FLAG_CRUNCHED))
&& (csp->cfd != JB_INVALID_SOCKET)
- && (csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE);
+ && ((csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE)
+ || (csp->config->feature_flags &
+ RUNTIME_FEATURE_CONNECTION_SHARING));
if (continue_chatting && !(csp->flags & CSP_FLAG_CRUNCHED))
{
if (continue_chatting)
{
- unsigned int client_timeout;
+ unsigned int client_timeout = 1; /* XXX: Use something else here? */
- if (csp->server_connection.sfd != JB_INVALID_SOCKET)
+ if (0 != (csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE))
{
- client_timeout = (unsigned)csp->server_connection.keep_alive_timeout - latency;
- log_error(LOG_LEVEL_CONNECT,
- "Waiting for the next client request on socket %d. "
- "Keeping the server socket %d to %s open.",
- csp->cfd, csp->server_connection.sfd, csp->server_connection.host);
- }
- else
- {
- client_timeout = 1; /* XXX: Use something else here? */
- log_error(LOG_LEVEL_CONNECT,
- "Waiting for the next client request on socket %d. "
- "No server socket to keep open.", csp->cfd);
+ if (csp->server_connection.sfd != JB_INVALID_SOCKET)
+ {
+ client_timeout = (unsigned)csp->server_connection.keep_alive_timeout - latency;
+ log_error(LOG_LEVEL_CONNECT,
+ "Waiting for the next client request on socket %d. "
+ "Keeping the server socket %d to %s open.",
+ csp->cfd, csp->server_connection.sfd, csp->server_connection.host);
+ }
+ else
+ {
+ log_error(LOG_LEVEL_CONNECT,
+ "Waiting for the next client request on socket %d. "
+ "No server socket to keep open.", csp->cfd);
+ }
}
if ((csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE)
&& data_is_available(csp->cfd, (int)client_timeout)
}
else
{
- log_error(LOG_LEVEL_CONNECT,
- "No additional client request received in time on socket %d.",
- csp->cfd);
+ if (0 != (csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE))
+ {
+ log_error(LOG_LEVEL_CONNECT,
+ "No additional client request received in time on socket %d.",
+ csp->cfd);
+ }
#ifdef FEATURE_CONNECTION_SHARING
if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_SHARING)
&& (socket_is_still_alive(csp->server_connection.sfd)))
#ifndef HAVE_RANDOM
privoxy_mutex_init(&rand_mutex);
#endif /* ndef HAVE_RANDOM */
+
#endif /* def MUTEX_LOCKS_AVAILABLE */
}
#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA)
{
int idx;
- const int catched_signals[] = { SIGTERM, SIGINT, SIGHUP, 0 };
- const int ignored_signals[] = { SIGPIPE, 0 };
+ const int catched_signals[] = { SIGTERM, SIGINT, SIGHUP };
- for (idx = 0; catched_signals[idx] != 0; idx++)
+ for (idx = 0; idx < SZ(catched_signals); idx++)
{
#ifdef sun /* FIXME: Is it safe to check for HAVE_SIGSET instead? */
if (sigset(catched_signals[idx], sig_handler) == SIG_ERR)
}
}
- for (idx = 0; ignored_signals[idx] != 0; idx++)
+ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
{
- if (signal(ignored_signals[idx], SIG_IGN) == SIG_ERR)
- {
- log_error(LOG_LEVEL_FATAL, "Can't set ignore-handler for signal %d: %E", ignored_signals[idx]);
- }
+ log_error(LOG_LEVEL_FATAL, "Can't set ignore-handler for SIGPIPE: %E");
}
}