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();
 

Reply via email to