projects
/
privoxy.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add the filename to the "Update the code status" list item
[privoxy.git]
/
jcc.c
diff --git
a/jcc.c
b/jcc.c
index
86f4a70
..
b199c47
100644
(file)
--- a/
jcc.c
+++ b/
jcc.c
@@
-1,4
+1,4
@@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.4
36 2015/03/27 12:40:08
fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.4
45 2016/05/25 10:51:10
fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
@@
-6,7
+6,7
@@
const char jcc_rcs[] = "$Id: jcc.c,v 1.436 2015/03/27 12:40:08 fabiankeil Exp $"
* Purpose : Main file. Contains main() method, main loop, and
* the main connection-handling function.
*
* Purpose : Main file. Contains main() method, main loop, and
* the main connection-handling function.
*
- * Copyright : Written by and Copyright (C) 2001-201
4
the
+ * Copyright : Written by and Copyright (C) 2001-201
6
the
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
@@
-115,6
+115,9
@@
const char jcc_rcs[] = "$Id: jcc.c,v 1.436 2015/03/27 12:40:08 fabiankeil Exp $"
#include "cgi.h"
#include "loadcfg.h"
#include "urlmatch.h"
#include "cgi.h"
#include "loadcfg.h"
#include "urlmatch.h"
+#ifdef FEATURE_CLIENT_TAGS
+#include "client-tags.h"
+#endif
const char jcc_h_rcs[] = JCC_H_VERSION;
const char project_h_rcs[] = PROJECT_H_VERSION;
const char jcc_h_rcs[] = JCC_H_VERSION;
const char project_h_rcs[] = PROJECT_H_VERSION;
@@
-185,6
+188,9
@@
privoxy_mutex_t connection_reuse_mutex;
#ifdef FEATURE_EXTERNAL_FILTERS
privoxy_mutex_t external_filter_mutex;
#endif
#ifdef FEATURE_EXTERNAL_FILTERS
privoxy_mutex_t external_filter_mutex;
#endif
+#ifdef FEATURE_CLIENT_TAGS
+privoxy_mutex_t client_tags_mutex;
+#endif
#if !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R)
privoxy_mutex_t resolver_mutex;
#if !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R)
privoxy_mutex_t resolver_mutex;
@@
-212,12
+218,10
@@
static int received_hup_signal = 0;
/* HTTP snipplets. */
static const char CSUCCEED[] =
/* HTTP snipplets. */
static const char CSUCCEED[] =
- "HTTP/1.1 200 Connection established\r\n"
- "Proxy-Agent: Privoxy/" VERSION "\r\n\r\n";
+ "HTTP/1.1 200 Connection established\r\n\r\n";
static const char CHEADER[] =
"HTTP/1.1 400 Invalid header received from client\r\n"
static const char CHEADER[] =
"HTTP/1.1 400 Invalid header received from client\r\n"
- "Proxy-Agent: Privoxy " VERSION "\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Invalid header received from client.\r\n";
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Invalid header received from client.\r\n";
@@
-237,7
+241,6
@@
static const char GOPHER_RESPONSE[] =
/* XXX: should be a template */
static const char MISSING_DESTINATION_RESPONSE[] =
"HTTP/1.1 400 Bad request received from client\r\n"
/* XXX: should be a template */
static const char MISSING_DESTINATION_RESPONSE[] =
"HTTP/1.1 400 Bad request received from client\r\n"
- "Proxy-Agent: Privoxy " VERSION "\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Bad request. Privoxy was unable to extract the destination.\r\n";
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Bad request. Privoxy was unable to extract the destination.\r\n";
@@
-245,7
+248,6
@@
static const char MISSING_DESTINATION_RESPONSE[] =
/* XXX: should be a template */
static const char INVALID_SERVER_HEADERS_RESPONSE[] =
"HTTP/1.1 502 Server or forwarder response invalid\r\n"
/* XXX: should be a template */
static const char INVALID_SERVER_HEADERS_RESPONSE[] =
"HTTP/1.1 502 Server or forwarder response invalid\r\n"
- "Proxy-Agent: Privoxy " VERSION "\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Bad response. The server or forwarder response doesn't look like HTTP.\r\n";
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Bad response. The server or forwarder response doesn't look like HTTP.\r\n";
@@
-253,35
+255,30
@@
static const char INVALID_SERVER_HEADERS_RESPONSE[] =
/* XXX: should be a template */
static const char MESSED_UP_REQUEST_RESPONSE[] =
"HTTP/1.1 400 Malformed request after rewriting\r\n"
/* XXX: should be a template */
static const char MESSED_UP_REQUEST_RESPONSE[] =
"HTTP/1.1 400 Malformed request after rewriting\r\n"
- "Proxy-Agent: Privoxy " VERSION "\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Bad request. Messed up with header filters.\r\n";
static const char TOO_MANY_CONNECTIONS_RESPONSE[] =
"HTTP/1.1 503 Too many open connections\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Bad request. Messed up with header filters.\r\n";
static const char TOO_MANY_CONNECTIONS_RESPONSE[] =
"HTTP/1.1 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";
static const char CLIENT_CONNECTION_TIMEOUT_RESPONSE[] =
"HTTP/1.1 504 Connection timeout\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Maximum number of open connections reached.\r\n";
static const char CLIENT_CONNECTION_TIMEOUT_RESPONSE[] =
"HTTP/1.1 504 Connection timeout\r\n"
- "Proxy-Agent: Privoxy " VERSION "\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"The connection timed out because the client request didn't arrive in time.\r\n";
static const char CLIENT_BODY_PARSE_ERROR_RESPONSE[] =
"HTTP/1.1 400 Failed reading client body\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"The connection timed out because the client request didn't arrive in time.\r\n";
static const char CLIENT_BODY_PARSE_ERROR_RESPONSE[] =
"HTTP/1.1 400 Failed reading client body\r\n"
- "Proxy-Agent: Privoxy " VERSION "\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Failed parsing or buffering the chunk-encoded client body.\r\n";
static const char UNSUPPORTED_CLIENT_EXPECTATION_ERROR_RESPONSE[] =
"HTTP/1.1 417 Expecting too much\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Failed parsing or buffering the chunk-encoded client body.\r\n";
static const char UNSUPPORTED_CLIENT_EXPECTATION_ERROR_RESPONSE[] =
"HTTP/1.1 417 Expecting too much\r\n"
- "Proxy-Agent: Privoxy " VERSION "\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Privoxy detected an unsupported Expect header value.\r\n";
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Privoxy detected an unsupported Expect header value.\r\n";
@@
-918,7
+915,7
@@
static void build_request_line(struct client_state *csp, const struct forward_sp
*request_line = strdup(http->gpc);
string_append(request_line, " ");
*request_line = strdup(http->gpc);
string_append(request_line, " ");
- if (fwd->forward_host)
+ if (fwd->forward_host
&& fwd->type != FORWARD_WEBSERVER
)
{
string_append(request_line, http->url);
}
{
string_append(request_line, http->url);
}
@@
-1681,6
+1678,12
@@
static jb_err receive_client_request(struct client_state *csp)
}
}
}
}
+#ifdef FEATURE_CLIENT_TAGS
+ /* XXX: If the headers were enlisted sooner, passing csp would do. */
+ set_client_address(csp, headers);
+ get_tag_list_for_client(csp->client_tags, csp->client_address);
+#endif
+
/*
* Determine the actions for this URL
*/
/*
* Determine the actions for this URL
*/
@@
-1986,7
+1989,7
@@
static void chat(struct client_state *csp)
if (csp->server_connection.sfd == JB_INVALID_SOCKET)
{
if (csp->server_connection.sfd == JB_INVALID_SOCKET)
{
- if (
fwd->type != SOCKS_NONE
)
+ if (
(fwd->type != SOCKS_NONE) && (fwd->type != FORWARD_WEBSERVER)
)
{
/* Socks error. */
rsp = error_response(csp, "forwarding-failed");
{
/* Socks error. */
rsp = error_response(csp, "forwarding-failed");
@@
-2810,8
+2813,6
@@
static void chat(struct client_state *csp)
*********************************************************************/
static void prepare_csp_for_next_request(struct client_state *csp)
{
*********************************************************************/
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->content_type = 0;
csp->content_length = 0;
csp->expected_content_length = 0;
@@
-2822,6
+2823,10
@@
static void prepare_csp_for_next_request(struct client_state *csp)
free_http_request(csp->http);
destroy_list(csp->headers);
destroy_list(csp->tags);
free_http_request(csp->http);
destroy_list(csp->headers);
destroy_list(csp->tags);
+#ifdef FEATURE_CLIENT_TAGS
+ destroy_list(csp->client_tags);
+ freez(csp->client_address);
+#endif
free_current_action(csp->action);
if (NULL != csp->fwd)
{
free_current_action(csp->action);
if (NULL != csp->fwd)
{
@@
-2830,7
+2835,9
@@
static void prepare_csp_for_next_request(struct client_state *csp)
}
/* XXX: Store per-connection flags someplace else. */
csp->flags = (CSP_FLAG_ACTIVE | CSP_FLAG_REUSED_CLIENT_CONNECTION);
}
/* XXX: Store per-connection flags someplace else. */
csp->flags = (CSP_FLAG_ACTIVE | CSP_FLAG_REUSED_CLIENT_CONNECTION);
- if (toggled_on_flag_set)
+#ifdef FEATURE_TOGGLE
+ if (global_toggle_state)
+#endif /* def FEATURE_TOGGLE */
{
csp->flags |= CSP_FLAG_TOGGLED_ON;
}
{
csp->flags |= CSP_FLAG_TOGGLED_ON;
}
@@
-3255,6
+3262,9
@@
static void initialize_mutexes(void)
#ifdef FEATURE_EXTERNAL_FILTERS
privoxy_mutex_init(&external_filter_mutex);
#endif
#ifdef FEATURE_EXTERNAL_FILTERS
privoxy_mutex_init(&external_filter_mutex);
#endif
+#ifdef FEATURE_CLIENT_TAGS
+ privoxy_mutex_init(&client_tags_mutex);
+#endif
/*
* XXX: The assumptions below are a bit naive
/*
* XXX: The assumptions below are a bit naive
@@
-3975,19
+3985,19
@@
static void listen_loop(void)
}
#endif
}
#endif
- csp_list = (struct client_states *)zalloc(sizeof(*csp_list));
- if (NULL == csp_list)
- {
- log_error(LOG_LEVEL_FATAL,
- "malloc(%d) for csp_list failed: %E", sizeof(*csp_list));
- continue;
- }
+ csp_list = zalloc_or_die(sizeof(*csp_list));
csp = &csp_list->csp;
log_error(LOG_LEVEL_CONNECT,
"Waiting for the next client connection. Currently active threads: %d",
active_threads);
csp = &csp_list->csp;
log_error(LOG_LEVEL_CONNECT,
"Waiting for the next client connection. Currently active threads: %d",
active_threads);
+ /*
+ * This config may be outdated, but for accept_connection()
+ * it's fresh enough.
+ */
+ csp->config = config;
+
if (!accept_connection(csp, bfds))
{
log_error(LOG_LEVEL_CONNECT, "accept failed: %E");
if (!accept_connection(csp, bfds))
{
log_error(LOG_LEVEL_CONNECT, "accept failed: %E");
@@
-4044,9
+4054,11
@@
static void listen_loop(void)
if (block_acl(NULL,csp))
{
log_error(LOG_LEVEL_CONNECT,
if (block_acl(NULL,csp))
{
log_error(LOG_LEVEL_CONNECT,
- "Connection from %s on socket %d dropped due to ACL", csp->ip_addr_str, csp->cfd);
+ "Connection from %s on %s (socket %d) dropped due to ACL",
+ csp->ip_addr_str, csp->listen_addr_str, csp->cfd);
close_socket(csp->cfd);
freez(csp->ip_addr_str);
close_socket(csp->cfd);
freez(csp->ip_addr_str);
+ freez(csp->listen_addr_str);
freez(csp_list);
continue;
}
freez(csp_list);
continue;
}
@@
-4062,6
+4074,7
@@
static void listen_loop(void)
strlen(TOO_MANY_CONNECTIONS_RESPONSE));
close_socket(csp->cfd);
freez(csp->ip_addr_str);
strlen(TOO_MANY_CONNECTIONS_RESPONSE));
close_socket(csp->cfd);
freez(csp->ip_addr_str);
+ freez(csp->listen_addr_str);
freez(csp_list);
continue;
}
freez(csp_list);
continue;
}