This patch adds an 'http-proxy-port-exceptions' config file option to Kannel. The purpose of this is to allow you to skip using your proxy server for certain types of traffic. I added it specifically for SSL. So an example config file might look like:
http-proxy-host = localhost http-proxy-port = 80 http-proxy-port-exceptions = 443
I realize that there is already an 'http-proxy-exceptions' in Kannel that does the same trick. However I'd rather not have to maintain a big list of hostnames I have to add to each time a subscriber finds some new SSL site. A list of ports is not so bad, especially since almost everyone will use 443 for SSL. To not break compatability, I also added 'E' options to test_http.c and test_xmlrpc.c (where 'e' is exceptions and the new 'E' is port_exceptions). I have tested this patch for trying to access Hotmail (which didn't work before), and it works fine. Thanks.
Jon
Index: gw/smsbox.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsbox.c,v
retrieving revision 1.257
diff -u -p -d -r1.257 smsbox.c
--- gw/smsbox.c 22 Feb 2005 16:22:03 -0000 1.257
+++ gw/smsbox.c 7 Apr 2005 15:26:34 -0000
@@ -3265,6 +3265,7 @@ static Cfg *init_smsbox(Cfg *cfg)
Octstr *http_proxy_host = NULL;
long http_proxy_port = -1;
List *http_proxy_exceptions = NULL;
+ List *http_proxy_port_exceptions = NULL;
Octstr *http_proxy_username = NULL;
Octstr *http_proxy_password = NULL;
int ssl = 0;
@@ -3300,6 +3301,8 @@ static Cfg *init_smsbox(Cfg *cfg)
octstr_imm("http-proxy-password"));
http_proxy_exceptions = cfg_get_list(grp,
octstr_imm("http-proxy-exceptions"));
+ http_proxy_port_exceptions = cfg_get_list(grp,
+ octstr_imm("http-proxy-port-exceptions"));
#ifdef HAVE_LIBSSL
conn_config_ssl(grp);
@@ -3455,13 +3458,14 @@ static Cfg *init_smsbox(Cfg *cfg)
if (http_proxy_host != NULL && http_proxy_port > 0) {
http_use_proxy(http_proxy_host, http_proxy_port,
http_proxy_exceptions, http_proxy_username,
- http_proxy_password);
+ http_proxy_password, http_proxy_port_exceptions);
}
octstr_destroy(http_proxy_host);
octstr_destroy(http_proxy_username);
octstr_destroy(http_proxy_password);
gwlist_destroy(http_proxy_exceptions, octstr_destroy_item);
+ gwlist_destroy(http_proxy_port_exceptions, octstr_destroy_item);
return cfg;
}
Index: gw/wapbox.c
===================================================================
RCS file: /home/cvs/gateway/gw/wapbox.c,v
retrieving revision 1.177
diff -u -p -d -r1.177 wapbox.c
--- gw/wapbox.c 22 Feb 2005 16:20:52 -0000 1.177
+++ gw/wapbox.c 7 Apr 2005 15:26:34 -0000
@@ -496,6 +496,7 @@ static void config_reload(int reload) {
Octstr *http_interface_name;
long http_proxy_port;
List *http_proxy_exceptions;
+ List *http_proxy_port_exceptions;
Octstr *http_proxy_username;
Octstr *http_proxy_password;
int warn_map_url = 0;
@@ -527,15 +528,17 @@ static void config_reload(int reload) {
http_proxy_username = cfg_get(grp, octstr_imm("http-proxy-username"));
http_proxy_password = cfg_get(grp, octstr_imm("http-proxy-password"));
http_proxy_exceptions = cfg_get_list(grp,
octstr_imm("http-proxy-exceptions"));
+ http_proxy_port_exceptions = cfg_get_list(grp,
octstr_imm("http-proxy-port-exceptions"));
if (http_proxy_host != NULL && http_proxy_port > 0) {
http_use_proxy(http_proxy_host, http_proxy_port,
http_proxy_exceptions, http_proxy_username,
- http_proxy_password);
+ http_proxy_password, http_proxy_port_exceptions);
}
octstr_destroy(http_proxy_host);
octstr_destroy(http_proxy_username);
octstr_destroy(http_proxy_password);
gwlist_destroy(http_proxy_exceptions, octstr_destroy_item);
+ gwlist_destroy(http_proxy_port_exceptions, octstr_destroy_item);
grp = cfg_get_single_group(cfg, octstr_imm("wapbox"));
if (grp == NULL) {
Index: gwlib/cfg.def
===================================================================
RCS file: /home/cvs/gateway/gwlib/cfg.def,v
retrieving revision 1.110
diff -u -p -d -r1.110 cfg.def
--- gwlib/cfg.def 11 Feb 2005 15:35:48 -0000 1.110
+++ gwlib/cfg.def 7 Apr 2005 15:26:34 -0000
@@ -108,6 +108,7 @@ SINGLE_GROUP(core,
OCTSTR(http-proxy-host)
OCTSTR(http-proxy-port)
OCTSTR(http-proxy-exceptions)
+ OCTSTR(http-proxy-port-exceptions)
OCTSTR(http-proxy-username)
OCTSTR(http-proxy-password)
OCTSTR(ssl-client-certkey-file)
Index: gwlib/http.c
===================================================================
RCS file: /home/cvs/gateway/gwlib/http.c,v
retrieving revision 1.232
diff -u -p -d -r1.232 http.c
--- gwlib/http.c 7 Apr 2005 13:26:56 -0000 1.232
+++ gwlib/http.c 7 Apr 2005 15:26:34 -0000
@@ -199,6 +199,7 @@ static int proxy_port = 0;
static Octstr *proxy_username = NULL;
static Octstr *proxy_password = NULL;
static List *proxy_exceptions = NULL;
+static List *proxy_port_exceptions = NULL;
static void proxy_add_authentication(List *headers)
@@ -221,6 +222,7 @@ static void proxy_init(void)
{
proxy_mutex = mutex_create();
proxy_exceptions = gwlist_create();
+ proxy_port_exceptions = gwlist_create();
}
@@ -232,9 +234,10 @@ static void proxy_shutdown(void)
}
-static int proxy_used_for_host(Octstr *host)
+static int proxy_used_for_host(Octstr *host, int port)
{
int i;
+ long proxy_port;
mutex_lock(proxy_mutex);
@@ -250,13 +253,24 @@ static int proxy_used_for_host(Octstr *h
}
}
+ for (i = 0; i < gwlist_len(proxy_port_exceptions); ++i) {
+ if (octstr_parse_long(&proxy_port,
+ gwlist_get(proxy_port_exceptions, i),0,10) == -1) {
+ continue;
+ }
+ if (port == proxy_port) {
+ mutex_unlock(proxy_mutex);
+ return 0;
+ }
+ }
+
mutex_unlock(proxy_mutex);
return 1;
}
void http_use_proxy(Octstr *hostname, int port, List *exceptions,
- Octstr *username, Octstr *password)
+ Octstr *username, Octstr *password, List *port_exceptions)
{
Octstr *e;
int i;
@@ -278,6 +292,13 @@ void http_use_proxy(Octstr *hostname, in
octstr_get_cstr(e));
gwlist_append(proxy_exceptions, octstr_duplicate(e));
}
+ proxy_port_exceptions = gwlist_create();
+ for (i = 0; i < gwlist_len(port_exceptions); ++i) {
+ e = gwlist_get(port_exceptions, i);
+ debug("gwlib.http", 0, "HTTP: Proxy port exception `%s'.",
+ octstr_get_cstr(e));
+ gwlist_append(proxy_port_exceptions, octstr_duplicate(e));
+ }
proxy_username = octstr_duplicate(username);
proxy_password = octstr_duplicate(password);
debug("gwlib.http", 0, "Using proxy <%s:%d>",
@@ -300,7 +321,9 @@ void http_close_proxy(void)
proxy_username = NULL;
proxy_password = NULL;
gwlist_destroy(proxy_exceptions, octstr_destroy_item);
+ gwlist_destroy(proxy_port_exceptions, octstr_destroy_item);
proxy_exceptions = NULL;
+ proxy_port_exceptions = NULL;
mutex_unlock(proxy_mutex);
}
@@ -1075,7 +1098,7 @@ static void handle_transaction(Connectio
#ifdef USE_KEEPALIVE
if (trans->persistent) {
- if (proxy_used_for_host(trans->host))
+ if (proxy_used_for_host(trans->host, trans->port))
conn_pool_put(trans->conn, proxy_hostname, proxy_port);
else
conn_pool_put(trans->conn, trans->host, trans->port);
@@ -1464,7 +1487,7 @@ static Connection *get_connection(HTTPSe
}
}
- if (proxy_used_for_host(trans->host)) {
+ if (proxy_used_for_host(trans->host, trans->port)) {
host = proxy_hostname;
port = proxy_port;
} else {
@@ -1523,7 +1546,7 @@ static int send_request(HTTPServer *tran
http_add_basic_auth(trans->request_headers, trans->username,
trans->password);
- if (proxy_used_for_host(trans->host)) {
+ if (proxy_used_for_host(trans->host, trans->port)) {
proxy_add_authentication(trans->request_headers);
request = build_request(http_method2name(trans->method),
trans->url, trans->host, trans->port,
Index: gwlib/http.h
===================================================================
RCS file: /home/cvs/gateway/gwlib/http.h,v
retrieving revision 1.65
diff -u -p -d -r1.65 http.h
--- gwlib/http.h 11 Feb 2005 15:35:48 -0000 1.65
+++ gwlib/http.h 7 Apr 2005 15:26:34 -0000
@@ -265,7 +265,7 @@ void parse_dump(HTTPURLParse *p);
* pending requests have been served.
*/
void http_use_proxy(Octstr *hostname, int port, List *exceptions,
- Octstr *username, Octstr *password);
+ Octstr *username, Octstr *password, List *port_exceptions);
void http_close_proxy(void);
Index: test/test_http.c
===================================================================
RCS file: /home/cvs/gateway/test/test_http.c,v
retrieving revision 1.43
diff -u -p -d -r1.43 test_http.c
--- test/test_http.c 11 Feb 2005 15:35:49 -0000 1.43
+++ test/test_http.c 7 Apr 2005 15:26:34 -0000
@@ -308,6 +308,7 @@ int main(int argc, char **argv)
int i, opt, num_threads;
Octstr *proxy;
List *exceptions;
+ List *port_exceptions;
long proxy_port;
Octstr *proxy_username;
Octstr *proxy_password;
@@ -323,6 +324,7 @@ int main(int argc, char **argv)
proxy = NULL;
proxy_port = -1;
exceptions = gwlist_create();
+ port_exceptions = gwlist_create();
proxy_username = NULL;
proxy_password = NULL;
num_threads = 1;
@@ -386,6 +388,14 @@ int main(int argc, char **argv)
p = strtok(NULL, ":");
}
break;
+
+ case 'E':
+ p = strtok(optarg, ":");
+ while (p != NULL) {
+ gwlist_append(port_exceptions, octstr_create(p));
+ p = strtok(NULL, ":");
+ }
+ break;
case 'a':
p = strtok(optarg, ":");
@@ -460,12 +470,13 @@ int main(int argc, char **argv)
if (proxy != NULL && proxy_port > 0) {
http_use_proxy(proxy, proxy_port, exceptions,
- proxy_username, proxy_password);
+ proxy_username, proxy_password, port_exceptions);
}
octstr_destroy(proxy);
octstr_destroy(proxy_username);
octstr_destroy(proxy_password);
gwlist_destroy(exceptions, octstr_destroy_item);
+ gwlist_destroy(port_exceptions, octstr_destroy_item);
urls = argv + optind;
num_urls = argc - optind;
Index: test/test_xmlrpc.c
===================================================================
RCS file: /home/cvs/gateway/test/test_xmlrpc.c,v
retrieving revision 1.9
diff -u -p -d -r1.9 test_xmlrpc.c
--- test/test_xmlrpc.c 11 Feb 2005 15:35:49 -0000 1.9
+++ test/test_xmlrpc.c 7 Apr 2005 15:26:34 -0000
@@ -270,6 +270,7 @@ int main(int argc, char **argv)
int i, opt, num_threads;
Octstr *proxy;
List *exceptions;
+ List *port_exceptions;
long proxy_port;
Octstr *proxy_username;
Octstr *proxy_password;
@@ -286,6 +287,7 @@ int main(int argc, char **argv)
proxy = NULL;
proxy_port = -1;
exceptions = gwlist_create();
+ port_exceptions = gwlist_create();
proxy_username = NULL;
proxy_password = NULL;
num_threads = 0;
@@ -332,6 +334,14 @@ int main(int argc, char **argv)
p = strtok(NULL, ":");
}
break;
+
+ case 'E':
+ p = strtok(optarg, ":");
+ while (p != NULL) {
+ gwlist_append(port_exceptions, octstr_create(p));
+ p = strtok(NULL, ":");
+ }
+ break;
case 'a':
p = strtok(optarg, ":");
@@ -383,12 +393,14 @@ int main(int argc, char **argv)
if (proxy != NULL && proxy_port > 0) {
http_use_proxy(proxy, proxy_port, exceptions,
- proxy_username, proxy_password);
+ proxy_username, proxy_password,
+ port_exceptions);
}
octstr_destroy(proxy);
octstr_destroy(proxy_username);
octstr_destroy(proxy_password);
gwlist_destroy(exceptions, octstr_destroy_item);
+ gwlist_destroy(port_exceptions, octstr_destroy_item);
counter = counter_create();
