[PATCH] Addition Of http-proxy-port-exceptions

Jonathan Houser <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
      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
proxy_port_exceptions.diff (text/plain, 11.3 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	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();
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.