[squid-users] pac file - hash routing based on source address

From: Chris Reining <creining@dont-contact.us>
Date: Tue, 10 Oct 2006 15:38:39 -0500

Hello,
I have four squid proxies, two are in office A the other two are in
office B. The two in office A are behind a hardware load balancer. The
two in office B I'm planning on using hash routing [0]. As an aside,
proxy servers in office A peer with each other, proxy servers in
office B peer with each other and proxy servers in office B are
siblings of office A.

I'm having problems with my proxy pac file when I introduce the "else
if (isInNet(myIpAddress() ..." into the hash routing section (without
that part, the hash routing *does* work) as the browser uses the
officeA-proxy1. If someone is in office B with an address in
10.1.0.0/16 they should use officeB-proxy1 or officeB-proxy2, if they
are not on that network they should use officeA-proxy1. Here's the
configuration:

function FindProxyForURL(url, host) {
       if ((isPlainHostName(host) ||
            dnsDomainIs(host, ".bar.com") ||
            dnsDomainIs(host, ".foo.com") ||
            dnsDomainIs(host, 127.0.0.1") ||
            shExpMatch(url, "ftp:*")))
                return "DIRECT";
        else if (isInNet(myIpAddress(), "10.1.0.0", "255.255.0.0")) {
                var n = URLhash2(url) % 2;
                if (n < 1)
                        return "PROXY officeB-proxy1:80; PROXY
officeB-proxy2:80";
                if (n < 2)
                        return "PROXY officeB-proxy2:80; PROXY
officeB-proxy1:80";
        }
        else
                return "PROXY officeA-proxy1:80";
}

function URLhash2(name) {
var cnt=0;
var dirptr=0;
        var str=name.toLowerCase(name);
        if ( str.length ==0) {
                return cnt;
        }
        for(var i=str.length - 1;i >=0 ; i--) {
                if ( str.substring(i,i +1) == '/' ) {
                        dirptr = i+1 ;
                        break;
                }
        }
        for(var i=0;i < dirptr; i++) {
           var ch= atoi(str.substring(i,i + 1));
                cnt = cnt + ch;
        }
        return cnt ;
}

function atoi(charstring) {
        if ( charstring == "a" ) return 0x61; if ( charstring == "b" )
return 0x62;
        if ( charstring == "c" ) return 0x63; if ( charstring == "d" )
return 0x64;
        if ( charstring == "e" ) return 0x65; if ( charstring == "f" )
return 0x66;
        if ( charstring == "g" ) return 0x67; if ( charstring == "h" )
return 0x68;
        if ( charstring == "i" ) return 0x69; if ( charstring == "j" )
return 0x6a;
        if ( charstring == "k" ) return 0x6b; if ( charstring == "l" )
return 0x6c;
        if ( charstring == "m" ) return 0x6d; if ( charstring == "n" )
return 0x6e;
        if ( charstring == "o" ) return 0x6f; if ( charstring == "p" )
return 0x70;
        if ( charstring == "q" ) return 0x71; if ( charstring == "r" )
return 0x72;
        if ( charstring == "s" ) return 0x73; if ( charstring == "t" )
return 0x74;
        if ( charstring == "u" ) return 0x75; if ( charstring == "v" )
return 0x76;
        if ( charstring == "w" ) return 0x77; if ( charstring == "x" )
return 0x78;
        if ( charstring == "y" ) return 0x79; if ( charstring == "z" )
return 0x7a;
        if ( charstring == "0" ) return 0x30; if ( charstring == "1" )
return 0x31;
        if ( charstring == "2" ) return 0x32; if ( charstring == "3" )
return 0x33;
        if ( charstring == "4" ) return 0x34; if ( charstring == "5" )
return 0x35;
        if ( charstring == "6" ) return 0x36; if ( charstring == "7" )
return 0x37;
        if ( charstring == "8" ) return 0x38; if ( charstring == "9" )
return 0x39;
        if ( charstring == "." ) return 0x2e;
        return 0x20;
}

Thanks in advance for any help,
Chris

[0] http://naragw.sharp.co.jp/sps/
Received on Tue Oct 10 2006 - 14:38:42 MDT

This archive was generated by hypermail pre-2.1.9 : Wed Nov 01 2006 - 12:00:04 MST