handle initial requests to http proxy

Ivano Cristofolini Ivano.Cristofolini at ing.unitn.it
Wed May 21 08:10:59 UTC 2008


OK, here it is quick'n'dirty (port number is hard-coded, etc.). It's
important to note that browsers must not use a proxy for uamserver and
authentication server; otherwise login will not work.
It is probably not terribly useful in general: I needed it to keep
previous browser settings for a wired network still working on the wifi.

Ivano

--- old_dhcp.h	2008-05-19 09:21:33.000000000 +0200
+++ dhcp.h	2008-05-19 10:16:04.000000000 +0200
@@ -56,6 +56,7 @@
 /* TCP Ports */
 #define DHCP_HTTP   80
 #define DHCP_HTTPS 443
+#define DHCP_HTTPPROXY 3128
 
 
 #define DHCP_ARP_REQUEST 1
@@ -99,6 +100,7 @@
   int nextdnat;                /* Next location to use for DNAT */
   uint32_t dnatip[DHCP_DNAT_MAX]; /* Destination NAT destination IP
address */
   uint16_t dnatport[DHCP_DNAT_MAX]; /* Destination NAT source port */
+  uint16_t http_port;               /* Original (pre-NAT) destination
port */
   uint8_t dnatmac[DHCP_DNAT_MAX][PKT_ETH_ALEN]; /* Destination NAT
source mac */
 /*  uint16_t mtu;                 Maximum transfer unit */
 };
--- old_dhcp.c	2008-05-19 09:21:40.000000000 +0200
+++ dhcp.c	2008-05-19 09:32:42.000000000 +0200
@@ -1245,7 +1245,8 @@
   /* Was it a http request for another server? */
   /* We are changing dest IP and dest port to local UAM server */
   if ((pack->iph.protocol == PKT_IP_PROTO_TCP) &&
-      (tcph->dst == htons(DHCP_HTTP))) {
+      ((tcph->dst == htons(DHCP_HTTP)) ||
+       (tcph->dst == htons(DHCP_HTTPPROXY)))) {
     int n;
     int pos=-1;
     for (n=0; n<DHCP_DNAT_MAX; n++) {
@@ -1260,6 +1261,7 @@
 	memcpy(conn->dnatmac[conn->nextdnat], pack->ethh.dst, PKT_ETH_ALEN); 
       conn->dnatip[conn->nextdnat] = pack->iph.daddr; 
       conn->dnatport[conn->nextdnat] = tcph->src;
+      conn->http_port = tcph->dst;
       conn->nextdnat = (conn->nextdnat + 1) % DHCP_DNAT_MAX;
     }
 
@@ -1420,7 +1422,7 @@
 	if (options.usetap) 
 	  memcpy(pack->ethh.src, conn->dnatmac[n], PKT_ETH_ALEN); 
 	pack->iph.saddr = conn->dnatip[n];
-	tcph->src = htons(DHCP_HTTP);
+	tcph->src = conn->http_port;
 
 	dhcp_tcp_check(pack, len);
 	dhcp_ip_check(pack);
--- old_redir.c	2008-05-19 09:22:03.000000000 +0200
+++ redir.c	2008-05-19 14:52:03.000000000 +0200
@@ -1124,7 +1124,6 @@
 
 	while (*p1 == ' ') p1++; /* Advance through additional white space */
 	if (*p1 == '/') p1++;
-	else return -1;
 	
 	/* The path ends with a ? or a space */
 	p2 = strchr(p1, '?');
@@ -1321,9 +1320,16 @@
   default:
     {
       /* some basic checks for urls we don't care about */
-      
-      snprintf(conn->state.redir.userurl,
sizeof(conn->state.redir.userurl), "http://%s/%s%s%s", 
-	       host, path, qs[0] ? "?" : "", qs[0] ? qs : "");
+
+      /* if GET was for an http proxy then the path starts with
http://host */
+      if (!strncmp(path, "http://", 7)) {
+          snprintf(conn->state.redir.userurl,
sizeof(conn->state.redir.userurl), "%s%s%s",
+               path, qs[0] ? "?" : "", qs[0] ? qs : "");
+      }
+      else {
+          snprintf(conn->state.redir.userurl,
sizeof(conn->state.redir.userurl), "http://%s/%s%s%s",
+               host, path, qs[0] ? "?" : "", qs[0] ? qs : "");
+      }
 
       if (optionsdebug) 
 	log_dbg("-->> Setting userurl=[%s]",conn->state.redir.userurl);


On Sat, 2008-05-17 at 09:21 +0200, wlan at mac.com wrote:
> Working contributions are welcome!
> 
> On May 16, 2008, at 4:26 PM, Ivano Cristofolini wrote:
> 
> > just solved it by myself, sorry for the bother.
> >
> > Ivano
> >
> > On Fri, 2008-05-16 at 13:54 +0200, Ivano Cristofolini wrote:
> >> Hello,
> >>
> >> I need to modify coova-chilli to capture http requests directed to a
> >> (NON transparent) http proxy running on port 3128 (keeping current
> >> functionality as well).
> >>
> >> I have successfully modified the http parsing functions in redir.c  
> >> (very
> >> simple: only redirurl changes).
> >>
> >> I'm trying to modify the DNAT routines in dhcp.c so that requests to
> >> port 3128 are handled in the same way as regular requests to http
> >> servers (i.e. they are NATted to uamserver).
> >>
> >> This is easy for dhcp_doDNAT() (I added the last line):
> >>
> >> ...
> >>   /* Was it a http request for another server? */
> >>   /* We are changing dest IP and dest port to local UAM server */
> >>   if ((pack->iph.protocol == PKT_IP_PROTO_TCP) &&
> >>       ((tcph->dst == htons(DHCP_HTTP)) ||
> >>        (tcph->dst == htons(3128)))) {
> >> ...
> >>
> >> I don't know how to do it for dhcp_undoDNAT().
> >>
> >> ...
> >> /* Was it a reply from redir server? */
> >> ...
> >> if (something???) {
> >>   tcph->src = htons(DHCP_HTTP);
> >> else
> >>   tcph->src = htons(3128);
> >> ...
> >>
> >> Any suggestions?
> >>
> > -- 
> > Ivano Cristofolini
> > Presidio Informatico Ingegneria
> > Direzione Informatica e Telecomunicazioni
> > Universita' degli Studi di Trento
> > Via Mesiano 77,
> > 38050 Povo(TN), Italy
> > Tel: +39 0461/881940
> > Fax: +39 0461/882628
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: chilli-unsubscribe at coova.org
> > For additional commands, e-mail: chilli-help at coova.org
> > Wiki: http://coova.org/wiki/index.php/CoovaChilli
> > Forum: http://coova.org/phpBB3/viewforum.php?f=4
> >
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: chilli-unsubscribe at coova.org
> For additional commands, e-mail: chilli-help at coova.org
> Wiki: http://coova.org/wiki/index.php/CoovaChilli
> Forum: http://coova.org/phpBB3/viewforum.php?f=4
> 
-- 
Ivano Cristofolini
Presidio Informatico Ingegneria
Direzione Informatica e Telecomunicazioni
Universita' degli Studi di Trento
Via Mesiano 77,
38050 Povo(TN), Italy
Tel: +39 0461/881940
Fax: +39 0461/882628
-------------- next part --------------
A non-text attachment was scrubbed...
Name: httpproxy.patch
Type: text/x-patch
Size: 2904 bytes
Desc: not available
URL: <http://lists.coova.org/pipermail/chilli/attachments/20080521/5140b891/attachment.bin>


More information about the Chilli mailing list