This patch adds the http-proxy-exceptions-regex option to the wapbox and smsbox config files. I added this to allow a regex like "^https" to skip the HTTP proxy for SSL connections. Obviously it can also be used for more than just that, however, as it is your standard regex match (much like all other regex matching in Kannel).
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 11 Apr 2005 13:16:09 -0000
@@ -3267,6 +3267,7 @@ static Cfg *init_smsbox(Cfg *cfg)
List *http_proxy_exceptions = NULL;
Octstr *http_proxy_username = NULL;
Octstr *http_proxy_password = NULL;
+ Octstr *http_proxy_exceptions_regex = NULL;
int ssl = 0;
int lf, m;
@@ -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_exceptions_regex = cfg_get(grp,
+ octstr_imm("http-proxy-exceptions-regex"));
#ifdef HAVE_LIBSSL
conn_config_ssl(grp);
@@ -3455,12 +3458,13 @@ 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_exceptions_regex);
}
octstr_destroy(http_proxy_host);
octstr_destroy(http_proxy_username);
octstr_destroy(http_proxy_password);
+ octstr_destroy(http_proxy_exceptions_regex);
gwlist_destroy(http_proxy_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 11 Apr 2005 13:16:09 -0000
@@ -498,6 +498,7 @@ static void config_reload(int reload) {
List *http_proxy_exceptions;
Octstr *http_proxy_username;
Octstr *http_proxy_password;
+ Octstr *http_proxy_exceptions_regex;
int warn_map_url = 0;
/* XXX TO-DO: if(reload) implement wapbox.suspend/mutex.lock */
@@ -527,14 +528,16 @@ 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_exceptions_regex = cfg_get(grp,
octstr_imm("http-proxy-exceptions-regex"));
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_exceptions_regex);
}
octstr_destroy(http_proxy_host);
octstr_destroy(http_proxy_username);
octstr_destroy(http_proxy_password);
+ octstr_destroy(http_proxy_exceptions_regex);
gwlist_destroy(http_proxy_exceptions, octstr_destroy_item);
grp = cfg_get_single_group(cfg, octstr_imm("wapbox"));
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 11 Apr 2005 13:16:09 -0000
@@ -108,6 +108,7 @@ SINGLE_GROUP(core,
OCTSTR(http-proxy-host)
OCTSTR(http-proxy-port)
OCTSTR(http-proxy-exceptions)
+ OCTSTR(http-proxy-exceptions-regex)
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 11 Apr 2005 13:16:09 -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 regex_t *proxy_exceptions_regex = NULL;
static void proxy_add_authentication(List *headers)
@@ -232,7 +233,7 @@ static void proxy_shutdown(void)
}
-static int proxy_used_for_host(Octstr *host)
+static int proxy_used_for_host(Octstr *host, Octstr *url)
{
int i;
@@ -250,13 +251,21 @@ static int proxy_used_for_host(Octstr *h
}
}
+ if (proxy_exceptions_regex != NULL)
+ {
+ if (gw_regex_matches(proxy_exceptions_regex, url) == MATCH) {
+ 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, Octstr
*exceptions_regex)
{
Octstr *e;
int i;
@@ -278,6 +287,9 @@ void http_use_proxy(Octstr *hostname, in
octstr_get_cstr(e));
gwlist_append(proxy_exceptions, octstr_duplicate(e));
}
+ if (exceptions_regex != NULL)
+ if ((proxy_exceptions_regex = gw_regex_comp(exceptions_regex,
REG_EXTENDED)) == NULL)
+ panic(0, "Could not compile pattern '%s'",
octstr_get_cstr(exceptions_regex));
proxy_username = octstr_duplicate(username);
proxy_password = octstr_duplicate(password);
debug("gwlib.http", 0, "Using proxy <%s:%d>",
@@ -300,7 +312,9 @@ void http_close_proxy(void)
proxy_username = NULL;
proxy_password = NULL;
gwlist_destroy(proxy_exceptions, octstr_destroy_item);
+ gw_regex_destroy(proxy_exceptions_regex);
proxy_exceptions = NULL;
+ proxy_exceptions_regex = NULL;
mutex_unlock(proxy_mutex);
}
@@ -1075,7 +1089,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->url))
conn_pool_put(trans->conn, proxy_hostname, proxy_port);
else
conn_pool_put(trans->conn, trans->host, trans->port);
@@ -1464,7 +1478,7 @@ static Connection *get_connection(HTTPSe
}
}
- if (proxy_used_for_host(trans->host)) {
+ if (proxy_used_for_host(trans->host, trans->url)) {
host = proxy_hostname;
port = proxy_port;
} else {
@@ -1523,7 +1537,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->url)) {
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 11 Apr 2005 13:16:09 -0000
@@ -129,6 +129,7 @@
#include "gwlib/list.h"
#include "gwlib/octstr.h"
+#include "gwlib/regex.h"
/*
@@ -265,7 +266,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, Octstr
*exceptions_regex);
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 11 Apr 2005 13:16:09 -0000
@@ -311,6 +311,7 @@ int main(int argc, char **argv)
long proxy_port;
Octstr *proxy_username;
Octstr *proxy_password;
+ Octstr *exceptions_regex;
char *p;
long threads[MAX_THREADS];
time_t start, end;
@@ -325,6 +326,7 @@ int main(int argc, char **argv)
exceptions = gwlist_create();
proxy_username = NULL;
proxy_password = NULL;
+ exceptions_regex = NULL;
num_threads = 1;
file = 0;
fp = NULL;
@@ -386,7 +388,11 @@ int main(int argc, char **argv)
p = strtok(NULL, ":");
}
break;
-
+
+ case 'E':
+ exceptions_regex = octstr_create(optarg);
+ break;
+
case 'a':
p = strtok(optarg, ":");
if (p != NULL) {
@@ -460,11 +466,12 @@ 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, exceptions_regex);
}
octstr_destroy(proxy);
octstr_destroy(proxy_username);
octstr_destroy(proxy_password);
+ octstr_destroy(exceptions_regex);
gwlist_destroy(exceptions, octstr_destroy_item);
urls = argv + 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 11 Apr 2005 13:16:09 -0000
@@ -273,6 +273,7 @@ int main(int argc, char **argv)
long proxy_port;
Octstr *proxy_username;
Octstr *proxy_password;
+ Octstr *exceptions_regex;
char *p;
long threads[MAX_THREADS];
time_t start, end;
@@ -288,6 +289,7 @@ int main(int argc, char **argv)
exceptions = gwlist_create();
proxy_username = NULL;
proxy_password = NULL;
+ exceptions_regex = NULL;
num_threads = 0;
file = 0;
fp = NULL;
@@ -332,6 +334,10 @@ int main(int argc, char **argv)
p = strtok(NULL, ":");
}
break;
+
+ case 'E':
+ exceptions_regex = octstr_create(optarg);
+ break;
case 'a':
p = strtok(optarg, ":");
@@ -383,11 +389,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,
+ exceptions_regex);
}
octstr_destroy(proxy);
octstr_destroy(proxy_username);
octstr_destroy(proxy_password);
+ octstr_destroy(exceptions_regex);
gwlist_destroy(exceptions, octstr_destroy_item);
counter = counter_create();
