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();
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.