Re: [PATCH] Exceptions Regex
Jonathan Houser <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
Alex,
> few comments to the patch...
All done. Here's the new diff.
Jon
exceptions_regex_ii.diff
(text/plain, 10.6 KB)
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 13 Apr 2005 14:01:30 -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 13 Apr 2005 14:01:30 -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 13 Apr 2005 14:01:30 -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 13 Apr 2005 14:01:30 -0000
@@ -82,6 +82,7 @@
#include <sys/socket.h>
#include "gwlib.h"
+#include "gwlib/regex.h"
/* comment this out if you don't want HTTP responses to be dumped */
#define DUMP_RESPONSE 1
@@ -199,6 +200,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 +234,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 +252,19 @@ static int proxy_used_for_host(Octstr *h
}
}
+ if (proxy_exceptions_regex != NULL &&
+ 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 +286,9 @@ void http_use_proxy(Octstr *hostname, in
octstr_get_cstr(e));
gwlist_append(proxy_exceptions, octstr_duplicate(e));
}
+ if (exceptions_regex != NULL &&
+ (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 +311,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 +1088,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 +1477,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 +1536,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 13 Apr 2005 14:01:30 -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, 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 13 Apr 2005 14:01:30 -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 13 Apr 2005 14:01:30 -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();