migrated JS PAC stuff out of HTTP and into org.ibex.js
authoradam <adam@megacz.com>
Fri, 23 Dec 2005 00:23:29 +0000 (00:23 +0000)
committeradam <adam@megacz.com>
Fri, 23 Dec 2005 00:23:29 +0000 (00:23 +0000)
darcs-hash:20051223002329-5007d-a1e5a91db09731c64bf15e3a3648817fe1d62238.gz

src/org/ibex/net/HTTP.java

index 894a236..5cab19d 100644 (file)
@@ -93,7 +93,7 @@ public class HTTP {
                     case "domain":  domain = end;
                     case "path":    path = end;
                     case "expires": expires = new Date(end);
-                    //#end
+                        //#end
                 }
                 if (h.get(name) == null) h.put(name, new Vec());
                 ((Vec)h.get(name)).addElement(new Cookie(name, value, domain, path, expires, secure));
@@ -104,7 +104,9 @@ public class HTTP {
     // Public Methods ////////////////////////////////////////////////////////////////////////////////////////
 
     public HTTP(String url) { this(url, false); }
-    public HTTP(String url, boolean skipResolveCheck) { originalUrl = url; this.skipResolveCheck = skipResolveCheck; }
+    public HTTP(String url, boolean skipResolveCheck) { this(url, skipResolveCheck, null); }
+    public HTTP(String url, Proxy p) { this(url, false, p); }
+    public HTTP(String url, boolean skipResolveCheck, Proxy p) { originalUrl = url; this.skipResolveCheck = skipResolveCheck; proxy = p; }
 
     /** Performs an HTTP GET request */
     public InputStream GET(String referer, Cookie.Jar cookies) throws IOException {
@@ -139,6 +141,7 @@ public class HTTP {
     boolean firstRequest = true;           ///< true iff this is the first request to be made on this socket
     boolean skipResolveCheck = false;      ///< allowed to skip the resolve check when downloading PAC script
     boolean proxied = false;               ///< true iff we're using a proxy
+    Proxy proxy;
 
     /** this is null if the current request is the first request on
      *  this HTTP connection; otherwise it is a Semaphore which will be
@@ -260,8 +263,8 @@ public class HTTP {
         } catch (UnknownHostException uhe) { }
 
         /*
-        if (Platform.detectProxy() == null)
-            throw new HTTPException("could not resolve hostname \"" + host + "\" and no proxy configured");
+          if (Platform.detectProxy() == null)
+          throw new HTTPException("could not resolve hostname \"" + host + "\" and no proxy configured");
         */
     }
 
@@ -275,7 +278,7 @@ public class HTTP {
     }
 
     /** Attempts a direct connection */
-    private Socket attemptDirect() {
+    Socket attemptDirect() {
         try {
             Log.info(this, "attempting to create unproxied socket to " +
                      host + ":" + port + (ssl ? " [ssl]" : ""));
@@ -286,120 +289,7 @@ public class HTTP {
         }
     }
 
-    /** Attempts to use an HTTP proxy, employing the CONNECT method if HTTPS is requested */
-    private Socket attemptHttpProxy(String proxyHost, int proxyPort) {
-        try {
-            if (Log.verbose) Log.info(this, "attempting to create HTTP proxied socket using proxy " + proxyHost + ":" + proxyPort);
-            Socket sock = getSocket(proxyHost, proxyPort, ssl, false);
-
-            if (!ssl) {
-                if (!path.startsWith("http://")) path = "http://" + host + ":" + port + path;
-                return sock;
-            }
-
-            PrintWriter pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
-            BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
-            pw.print("CONNECT " + host + ":" + port + " HTTP/1.1\r\n\r\n");
-            pw.flush();
-            String s = br.readLine();
-            if (s.charAt(9) != '2') throw new HTTPException("proxy refused CONNECT method: \"" + s + "\"");
-            while (br.readLine().length() > 0) { };
-            ((SSL)sock).negotiate();
-            return sock;
-
-        } catch (IOException e) {
-            if (Log.on) Log.info(this, "exception in attemptHttpProxy(): " + e);
-            return null;
-        }
-    }
-
-    /**
-     *  Implements SOCKSv4 with v4a DNS extension
-     *  @see http://www.socks.nec.com/protocol/socks4.protocol
-     *  @see http://www.socks.nec.com/protocol/socks4a.protocol
-     */
-    private Socket attemptSocksProxy(String proxyHost, int proxyPort) {
-
-        // even if host is already a "x.y.z.w" string, we use this to parse it into bytes
-        InetAddress addr = null;
-        try { addr = InetAddress.getByName(host); } catch (Exception e) { }
-
-        if (Log.verbose) Log.info(this, "attempting to create SOCKSv4" + (addr == null ? "" : "a") +
-                                 " proxied socket using proxy " + proxyHost + ":" + proxyPort);
-
-        try {
-            Socket sock = getSocket(proxyHost, proxyPort, ssl, false);
-            
-            DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
-            dos.writeByte(0x04);                         // SOCKSv4(a)
-            dos.writeByte(0x01);                         // CONNECT
-            dos.writeShort(port & 0xffff);               // port
-            if (addr == null) dos.writeInt(0x00000001);  // bogus IP
-            else dos.write(addr.getAddress());           // actual IP
-            dos.writeByte(0x00);                         // no userid
-            if (addr == null) {
-                PrintWriter pw = new PrintWriter(new OutputStreamWriter(dos));
-                pw.print(host);
-                pw.flush();
-                dos.writeByte(0x00);                     // hostname null terminator
-            }
-            dos.flush();
-
-            DataInputStream dis = new DataInputStream(sock.getInputStream());
-            dis.readByte();                              // reply version
-            byte success = dis.readByte();               // success/fail
-            dis.skip(6);                                 // ip/port
-            
-            if ((int)(success & 0xff) == 90) {
-                if (ssl) ((SSL)sock).negotiate();
-                return sock;
-            }
-            if (Log.on) Log.info(this, "SOCKS server denied access, code " + (success & 0xff));
-            return null;
-
-        } catch (IOException e) {
-            if (Log.on) Log.info(this, "exception in attemptSocksProxy(): " + e);
-            return null;
-        }
-    }
-
-    /** executes the PAC script and dispatches a call to one of the other attempt methods based on the result */
-    /*
-    private Socket attemptPAC(org.ibex.js.JS pacFunc) {
-        if (Log.verbose) Log.info(this, "evaluating PAC script");
-        String pac = null;
-        try {
-            Object obj = pacFunc.call(url, host, null, null, 2);
-            if (Log.verbose) Log.info(this, "  PAC script returned \"" + obj + "\"");
-            pac = obj.toString();
-        } catch (Throwable e) {
-            if (Log.on) Log.info(this, "PAC script threw exception " + e);
-            return null;
-        }
-
-        StringTokenizer st = new StringTokenizer(pac, ";", false);
-        while (st.hasMoreTokens()) {
-            String token = st.nextToken().trim();
-            if (Log.verbose) Log.info(this, "  trying \"" + token + "\"...");
-            try {
-                Socket ret = null;
-                if (token.startsWith("DIRECT"))
-                    ret = attemptDirect();
-                else if (token.startsWith("PROXY"))
-                    ret = attemptHttpProxy(token.substring(token.indexOf(' ') + 1, token.indexOf(':')),
-                                           Integer.parseInt(token.substring(token.indexOf(':') + 1)));
-                else if (token.startsWith("SOCKS"))
-                    ret = attemptSocksProxy(token.substring(token.indexOf(' ') + 1, token.indexOf(':')),
-                                            Integer.parseInt(token.substring(token.indexOf(':') + 1)));
-                if (ret != null) return ret;
-            } catch (Throwable e) {
-                if (Log.on) Log.info(this, "attempt at \"" + token + "\" failed due to " + e + "; trying next token");
-            }
-        }
-        if (Log.on) Log.info(this, "all PAC results exhausted");
-        return null;
-    }
-    */
+  
 
     // Everything Else ////////////////////////////////////////////////////////////////////////////
 
@@ -439,20 +329,12 @@ public class HTTP {
         host = temphost;
         if (Log.verbose) Log.info(this, "creating HTTP object for connection to " + host + ":" + port);
 
-        /*
-        Proxy pi = Platform.detectProxy();
-        OUTER: do {
-            if (pi != null) {
-                for(int i=0; i<pi.excluded.length; i++) if (host.equals(pi.excluded[i])) break OUTER;
-                if (sock == null && pi.proxyAutoConfigFunction != null) sock = attemptPAC(pi.proxyAutoConfigFunction);
-                if (sock == null && ssl && pi.httpsProxyHost != null) sock = attemptHttpProxy(pi.httpsProxyHost,pi.httpsProxyPort);
-                if (sock == null && pi.httpProxyHost != null) sock = attemptHttpProxy(pi.httpProxyHost, pi.httpProxyPort);
-                if (sock == null && pi.socksProxyHost != null) sock = attemptSocksProxy(pi.socksProxyHost, pi.socksProxyPort);
-            }
-        } while (false);
-        */
-        proxied = sock != null;
-        if (sock == null) sock = attemptDirect();
+        proxied = proxy!=null;
+        if (proxied) sock = proxy.attempt(url, host, this);
+        if (sock==null) {
+            proxied = false;
+            sock = attemptDirect();
+        }
         if (sock == null) throw new HTTPException("unable to contact host " + host);
         if (in == null) in = new BufferedInputStream(sock.getInputStream());
     }
@@ -532,9 +414,9 @@ public class HTTP {
             return;
         }
         /*
-        if (!realm.equals("Digest") || Proxy.Authorization.authorization2 == null || !"true".equals(h.get("stale")))
-            Proxy.Authorization.getPassword(realm, style, sock.getInetAddress().getHostAddress(),
-                                            Proxy.Authorization.authorization);
+          if (!realm.equals("Digest") || Proxy.Authorization.authorization2 == null || !"true".equals(h.get("stale")))
+          Proxy.Authorization.getPassword(realm, style, sock.getInetAddress().getHostAddress(),
+          Proxy.Authorization.authorization);
         */
         if (style.equals("Basic")) {
             Proxy.Authorization.authorization2 =
@@ -767,14 +649,20 @@ public class HTTP {
         public int socksProxyPort = -1;                      ///< the SOCKS Proxy Port to use
         public String[] excluded = new String[] { };         ///< hosts to be excluded from proxy use; wildcards permitted
 
-        // ** temporarily disabled so HTTP does not depend on org.ibex.js **
-        //public JS proxyAutoConfigFunction = null;            ///< the PAC script
-        public Object proxyAutoConfigFunction = null;            ///< the PAC script
-    
-        public static Proxy detectProxyViaManual() {
+        public Socket attempt(String url, String host, HTTP http) {
+            for(int i=0; i<excluded.length; i++) if (http.host.equals(excluded[i])) return null;
+            if (http.ssl && httpsProxyHost != null) return attemptHttpProxy(http, httpsProxyHost,  httpsProxyPort);
+            if (httpProxyHost != null)              return attemptHttpProxy(http, httpProxyHost,   httpProxyPort);
+            if (socksProxyHost != null)             return attemptSocksProxy(http, socksProxyHost, socksProxyPort);
+            return null;
+        }
+
+        public Proxy detectProxyViaManual(String http_proxy,
+                                          String https_proxy,
+                                          String socks_proxy,
+                                          String noproxy) {
             Proxy ret = new Proxy();
-            /*
-            ret.httpProxyHost = Platform.getEnv("http_proxy");
+            ret.httpProxyHost = http_proxy;
             if (ret.httpProxyHost != null) {
                 if (ret.httpProxyHost.startsWith("http://")) ret.httpProxyHost = ret.httpProxyHost.substring(7);
                 if (ret.httpProxyHost.endsWith("/"))
@@ -787,7 +675,7 @@ public class HTTP {
                 }
             }
         
-            ret.httpsProxyHost = Platform.getEnv("https_proxy");
+            ret.httpsProxyHost = https_proxy;
             if (ret.httpsProxyHost != null) {
                 if (ret.httpsProxyHost.startsWith("https://")) ret.httpsProxyHost = ret.httpsProxyHost.substring(7);
                 if (ret.httpsProxyHost.endsWith("/"))
@@ -800,7 +688,7 @@ public class HTTP {
                 }
             }
         
-            ret.socksProxyHost = Platform.getEnv("socks_proxy");
+            ret.socksProxyHost = socks_proxy;
             if (ret.socksProxyHost != null) {
                 if (ret.socksProxyHost.startsWith("socks://")) ret.socksProxyHost = ret.socksProxyHost.substring(7);
                 if (ret.socksProxyHost.endsWith("/"))
@@ -813,7 +701,6 @@ public class HTTP {
                 }
             }
         
-            String noproxy = Platform.getEnv("no_proxy");
             if (noproxy != null) {
                 StringTokenizer st = new StringTokenizer(noproxy, ",");
                 ret.excluded = new String[st.countTokens()];
@@ -821,58 +708,89 @@ public class HTTP {
             }
         
             if (ret.httpProxyHost == null && ret.socksProxyHost == null) return null;
-            */
             return ret;
         }
 
-        /*
-        public static JSScope proxyAutoConfigRootScope = new ProxyAutoConfigRootScope();
-        public static JS getProxyAutoConfigFunction(String url) {
-            try { 
-                BufferedReader br = new BufferedReader(new InputStreamReader(new HTTP(url, true).GET()));
-                String s = null;
-                String script = "";
-                while((s = br.readLine()) != null) script += s + "\n";
-                if (Log.on) Log.info(Proxy.class, "successfully retrieved WPAD PAC:");
-                if (Log.on) Log.info(Proxy.class, script);
+        // Attempts //////////////////////////////////////////////////////////////////////////////
+
+        protected Socket attemptDirect(HTTP http) { return http.attemptDirect(); }
+
+        /** Attempts to use an HTTP proxy, employing the CONNECT method if HTTPS is requested */
+        protected Socket attemptHttpProxy(HTTP http, String proxyHost, int proxyPort) {
+            try {
+                if (Log.verbose) Log.info(this, "attempting to create HTTP proxied socket using proxy " + proxyHost + ":" + proxyPort);
+                Socket sock = http.getSocket(proxyHost, proxyPort, http.ssl, false);
+
+                if (!http.ssl) {
+                    if (!http.path.startsWith("http://")) http.path = "http://" + http.host + ":" + http.port + http.path;
+                    return sock;
+                }
+
+                PrintWriter pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
+                BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
+                pw.print("CONNECT " + http.host + ":" + http.port + " HTTP/1.1\r\n\r\n");
+                pw.flush();
+                String s = br.readLine();
+                if (s.charAt(9) != '2') throw new HTTPException("proxy refused CONNECT method: \"" + s + "\"");
+                while (br.readLine().length() > 0) { };
+                ((SSL)sock).negotiate();
+                return sock;
+
+            } catch (IOException e) {
+                if (Log.on) Log.info(this, "exception in attemptHttpProxy(): " + e);
+                return null;
+            }
+        }
+
+        /**
+         *  Implements SOCKSv4 with v4a DNS extension
+         *  @see http://www.socks.nec.com/protocol/socks4.protocol
+         *  @see http://www.socks.nec.com/protocol/socks4a.protocol
+         */
+        protected Socket attemptSocksProxy(HTTP http, String proxyHost, int proxyPort) {
+
+            // even if host is already a "x.y.z.w" string, we use this to parse it into bytes
+            InetAddress addr = null;
+            try { addr = InetAddress.getByName(http.host); } catch (Exception e) { }
+
+            if (Log.verbose) Log.info(this, "attempting to create SOCKSv4" + (addr == null ? "" : "a") +
+                                      " proxied socket using proxy " + proxyHost + ":" + proxyPort);
+
+            try {
+                Socket sock = http.getSocket(proxyHost, proxyPort, http.ssl, false);
             
-                // MS CARP hack
-                Vector carpHosts = new Vector();
-                for(int i=0; i<script.length(); i++)
-                    if (script.regionMatches(i, "new Node(", 0, 9)) {
-                        String host = script.substring(i + 10, script.indexOf('\"', i + 11));
-                        if (Log.on) Log.info(Proxy.class, "Detected MS Proxy Server CARP Script, Host=" + host);
-                        carpHosts.addElement(host);
-                    }
-                if (carpHosts.size() > 0) {
-                    script = "function FindProxyForURL(url, host) {\nreturn \"";
-                    for(int i=0; i<carpHosts.size(); i++)
-                        script += "PROXY " + carpHosts.elementAt(i) + "; ";
-                    script += "\";\n}";
-                    if (Log.on) Log.info(Proxy.class, "DeCARPed PAC script:");
-                    if (Log.on) Log.info(Proxy.class, script);
+                DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
+                dos.writeByte(0x04);                         // SOCKSv4(a)
+                dos.writeByte(0x01);                         // CONNECT
+                dos.writeShort(http.port & 0xffff);               // port
+                if (addr == null) dos.writeInt(0x00000001);  // bogus IP
+                else dos.write(addr.getAddress());           // actual IP
+                dos.writeByte(0x00);                         // no userid
+                if (addr == null) {
+                    PrintWriter pw = new PrintWriter(new OutputStreamWriter(dos));
+                    pw.print(http.host);
+                    pw.flush();
+                    dos.writeByte(0x00);                     // hostname null terminator
                 }
+                dos.flush();
 
-                JS scr = JS.fromReader("PAC script at " + url, 0, new StringReader(script));
-                JS.cloneWithNewParentScope(scr, proxyAutoConfigRootScope).call(null, null, null, null, 0);
-                return (JS)proxyAutoConfigRootScope.get("FindProxyForURL");
-            } catch (Exception e) {
-                if (Log.on) {
-                    Log.info(Platform.class, "WPAD detection failed due to:");
-                    if (e instanceof JSExn) {
-                        try {
-                            org.ibex.js.JSArray arr = new org.ibex.js.JSArray();
-                            arr.addElement(((JSExn)e).getObject());
-                        } catch (Exception e2) {
-                            Log.info(Platform.class, e);
-                        }
-                    }
-                    else Log.info(Platform.class, e);
+                DataInputStream dis = new DataInputStream(sock.getInputStream());
+                dis.readByte();                              // reply version
+                byte success = dis.readByte();               // success/fail
+                dis.skip(6);                                 // ip/port
+            
+                if ((int)(success & 0xff) == 90) {
+                    if (http.ssl) ((SSL)sock).negotiate();
+                    return sock;
                 }
+                if (Log.on) Log.info(this, "SOCKS server denied access, code " + (success & 0xff));
+                return null;
+
+            } catch (IOException e) {
+                if (Log.on) Log.info(this, "exception in attemptSocksProxy(): " + e);
                 return null;
             }
         }
-        */
 
         // Authorization ///////////////////////////////////////////////////////////////////////////////////
 
@@ -884,151 +802,33 @@ public class HTTP {
 
             // FIXME: temporarily disabled so we can use HTTP outside the core
             /*
-            public static synchronized void getPassword(final String realm, final String style,
-                                                        final String proxyIP, String oldAuth) throws IOException {
-
-                // this handles cases where multiple threads hit the proxy auth at the same time -- all but one will block on the
-                // synchronized keyword. If 'authorization' changed while the thread was blocked, it means that the user entered
-                // a password, so we should reattempt authorization.
-
-                if (authorization != oldAuth) return;
-                if (Log.on) Log.info(Authorization.class, "displaying proxy authorization dialog");
-                Scheduler.add(new Task() {
-                        public void perform() throws IOException, JSExn {
-                            Box b = new Box();
-                            Template t = null;
-                            // FIXME
-                            //Template.buildTemplate("org/ibex/builtin/proxy_authorization.ibex", Stream.getInputStream((JS)Main.builtin.get("org/ibex/builtin/proxy_authorization.ibex")), new Ibex(null));
-                            t.apply(b);
-                            b.put("realm", realm);
-                            b.put("proxyIP", proxyIP);
-                        }
-                    });
-
-                waitingForUser.block();
-                if (Log.on) Log.info(Authorization.class, "got proxy authorization info; re-attempting connection");
-            }
+              public static synchronized void getPassword(final String realm, final String style,
+              final String proxyIP, String oldAuth) throws IOException {
+
+              // this handles cases where multiple threads hit the proxy auth at the same time -- all but one will block on the
+              // synchronized keyword. If 'authorization' changed while the thread was blocked, it means that the user entered
+              // a password, so we should reattempt authorization.
+
+              if (authorization != oldAuth) return;
+              if (Log.on) Log.info(Authorization.class, "displaying proxy authorization dialog");
+              Scheduler.add(new Task() {
+              public void perform() throws IOException, JSExn {
+              Box b = new Box();
+              Template t = null;
+              // FIXME
+              //Template.buildTemplate("org/ibex/builtin/proxy_authorization.ibex", Stream.getInputStream((JS)Main.builtin.get("org/ibex/builtin/proxy_authorization.ibex")), new Ibex(null));
+              t.apply(b);
+              b.put("realm", realm);
+              b.put("proxyIP", proxyIP);
+              }
+              });
+
+              waitingForUser.block();
+              if (Log.on) Log.info(Authorization.class, "got proxy authorization info; re-attempting connection");
+              }
             */
         }
 
-
-        // ProxyAutoConfigRootJSScope ////////////////////////////////////////////////////////////////////
-        /*
-        public static class ProxyAutoConfigRootScope extends JSScope.Global {
-
-            public ProxyAutoConfigRootScope() { super(); }
-        
-            public Object get(Object name) throws JSExn {
-                // #switch(name)
-                case "isPlainHostName": return METHOD;
-                case "dnsDomainIs": return METHOD;
-                case "localHostOrDomainIs": return METHOD;
-                case "isResolvable": return METHOD;
-                case "isInNet": return METHOD;
-                case "dnsResolve": return METHOD;
-                case "myIpAddress": return METHOD;
-                case "dnsDomainLevels": return METHOD;
-                case "shExpMatch": return METHOD;
-                case "weekdayRange": return METHOD;
-                case "dateRange": return METHOD;
-                case "timeRange": return METHOD;
-                case "ProxyConfig": return ProxyConfig;
-                // #end
-                return super.get(name);
-            }
-        
-            private static final JS proxyConfigBindings = new JS();
-            private static final JS ProxyConfig = new JS() {
-                    public Object get(Object name) {
-                        if (name.equals("bindings")) return proxyConfigBindings;
-                        return null;
-                    }
-                };
-
-            public Object callMethod(Object method, Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JSExn {
-                // #switch(method)
-                case "isPlainHostName": return (a0.toString().indexOf('.') == -1) ? Boolean.TRUE : Boolean.FALSE;
-                case "dnsDomainIs": return (a0.toString().endsWith(a1.toString())) ? Boolean.TRUE : Boolean.FALSE;
-                case "localHostOrDomainIs":
-                    return (a0.equals(a1) || (a0.toString().indexOf('.') == -1 && a1.toString().startsWith(a0.toString()))) ? T:F;
-                case "isResolvable": try {
-                    return (InetAddress.getByName(a0.toString()) != null) ? Boolean.TRUE : Boolean.FALSE;
-                } catch (UnknownHostException e) { return F; }
-                case "isInNet":
-                    if (nargs != 3) return Boolean.FALSE;
-                    try {
-                        byte[] host = InetAddress.getByName(a0.toString()).getAddress();
-                        byte[] net = InetAddress.getByName(a1.toString()).getAddress();
-                        byte[] mask = InetAddress.getByName(a2.toString()).getAddress();
-                        return ((host[0] & mask[0]) == net[0] &&
-                                (host[1] & mask[1]) == net[1] &&
-                                (host[2] & mask[2]) == net[2] &&
-                                (host[3] & mask[3]) == net[3]) ?
-                            Boolean.TRUE : Boolean.FALSE;
-                    } catch (Exception e) {
-                        throw new JSExn("exception in isInNet(): " + e);
-                    }
-                case "dnsResolve":
-                    try {
-                        return InetAddress.getByName(a0.toString()).getHostAddress();
-                    } catch (UnknownHostException e) {
-                        return null;
-                    }
-                case "myIpAddress":
-                    try {
-                        return InetAddress.getLocalHost().getHostAddress();
-                    } catch (UnknownHostException e) {
-                        if (Log.on) Log.info(this, "strange... host does not know its own address");
-                        return null;
-                    }
-                case "dnsDomainLevels":
-                    String s = a0.toString();
-                    int i = 0;
-                    while((i = s.indexOf('.', i)) != -1) i++;
-                    return new Integer(i);
-                case "shExpMatch":
-                    StringTokenizer st = new StringTokenizer(a1.toString(), "*", false);
-                    String[] arr = new String[st.countTokens()];
-                    String s = a0.toString();
-                    for (int i=0; st.hasMoreTokens(); i++) arr[i] = st.nextToken();
-                    return match(arr, s, 0) ? Boolean.TRUE : Boolean.FALSE;
-                case "weekdayRange":
-                    TimeZone tz = (nargs < 3 || a2 == null || !a2.equals("GMT")) ?
-                        TimeZone.getTimeZone("UTC") : TimeZone.getDefault();
-                    Calendar c = new GregorianCalendar();
-                    c.setTimeZone(tz);
-                    c.setTime(new java.util.Date());
-                    java.util.Date d = c.getTime();
-                    int day = d.getDay();
-                    String d1s = a0.toString().toUpperCase();
-                    int d1 = 0, d2 = 0;
-                    for(int i=0; i<days.length; i++) if (days[i].equals(d1s)) d1 = i;
-                    
-                    if (nargs == 1)
-                        return d1 == day ? Boolean.TRUE : Boolean.FALSE;
-                    
-                    String d2s = a1.toString().toUpperCase();
-                    for(int i=0; i<days.length; i++) if (days[i].equals(d2s)) d2 = i;
-                    
-                    return ((d1 <= d2 && day >= d1 && day <= d2) || (d1 > d2 && (day >= d1 || day <= d2))) ? T : F;
-                    
-                case "dateRange": throw new JSExn("Ibex does not support dateRange() in PAC scripts");
-                case "timeRange": throw new JSExn("Ibex does not support timeRange() in PAC scripts");
-                // #end
-                return super.callMethod(method, a0, a1, a2, rest, nargs);
-            }       
-            private static boolean match(String[] arr, String s, int index) {
-                if (index >= arr.length) return true;
-                for(int i=0; i<s.length(); i++) {
-                    String s2 = s.substring(i);
-                    if (s2.startsWith(arr[index]) && match(arr, s2.substring(arr[index].length()), index + 1)) return true;
-                }
-                return false;
-            }
-            public static String[] days = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
-        }
-        */
-
         /**
          *  An implementation of Microsoft's proprietary NTLM authentication protocol.  This code was derived from Eric
          *  Glass's work, and is copyright as follows:
@@ -1069,7 +869,7 @@ public class HTTP {
              * @return The LM Response.
              */
             public static byte[] getLMResponse(String password, byte[] challenge)
-                {
+            {
                 byte[] lmHash = lmHash(password);
                 return lmResponse(lmHash, challenge);
             }
@@ -1152,22 +952,22 @@ public class HTTP {
              */
             private static byte[] lmHash(String password) {
                 /*
-                byte[] oemPassword = password.toUpperCase().getBytes("UTF8");
-                int length = java.lang.Math.min(oemPassword.length, 14);
-                byte[] keyBytes = new byte[14];
-                System.arraycopy(oemPassword, 0, keyBytes, 0, length);
-                Key lowKey = createDESKey(keyBytes, 0);
-                Key highKey = createDESKey(keyBytes, 7);
-                byte[] magicConstant = "KGS!@#$%".getBytes("UTF8");
-                Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
-                des.init(Cipher.ENCRYPT_MODE, lowKey);
-                byte[] lowHash = des.doFinal(magicConstant);
-                des.init(Cipher.ENCRYPT_MODE, highKey);
-                byte[] highHash = des.doFinal(magicConstant);
-                byte[] lmHash = new byte[16];
-                System.arraycopy(lowHash, 0, lmHash, 0, 8);
-                System.arraycopy(highHash, 0, lmHash, 8, 8);
-                return lmHash;
+                  byte[] oemPassword = password.toUpperCase().getBytes("UTF8");
+                  int length = java.lang.Math.min(oemPassword.length, 14);
+                  byte[] keyBytes = new byte[14];
+                  System.arraycopy(oemPassword, 0, keyBytes, 0, length);
+                  Key lowKey = createDESKey(keyBytes, 0);
+                  Key highKey = createDESKey(keyBytes, 7);
+                  byte[] magicConstant = "KGS!@#$%".getBytes("UTF8");
+                  Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
+                  des.init(Cipher.ENCRYPT_MODE, lowKey);
+                  byte[] lowHash = des.doFinal(magicConstant);
+                  des.init(Cipher.ENCRYPT_MODE, highKey);
+                  byte[] highHash = des.doFinal(magicConstant);
+                  byte[] lmHash = new byte[16];
+                  System.arraycopy(lowHash, 0, lmHash, 0, 8);
+                  System.arraycopy(highHash, 0, lmHash, 8, 8);
+                  return lmHash;
                 */
                 return null;
             }
@@ -1183,11 +983,11 @@ public class HTTP {
             private static byte[] ntlmHash(String password) throws UnsupportedEncodingException {
                 // FIXME
                 /*
-                byte[] unicodePassword = password.getBytes("UnicodeLittleUnmarked");
-                MD4 md4 = new MD4();
-                md4.update(unicodePassword, 0, unicodePassword.length);
-                byte[] ret = new byte[md4.getDigestSize()];
-                return ret;
+                  byte[] unicodePassword = password.getBytes("UnicodeLittleUnmarked");
+                  MD4 md4 = new MD4();
+                  md4.update(unicodePassword, 0, unicodePassword.length);
+                  byte[] ret = new byte[md4.getDigestSize()];
+                  return ret;
                 */
                 return null;
             }
@@ -1219,25 +1019,25 @@ public class HTTP {
              * hash).
              */
             private static byte[] lmResponse(byte[] hash, byte[] challenge)
-                {
+            {
                 /*
-                byte[] keyBytes = new byte[21];
-                System.arraycopy(hash, 0, keyBytes, 0, 16);
-                Key lowKey = createDESKey(keyBytes, 0);
-                Key middleKey = createDESKey(keyBytes, 7);
-                Key highKey = createDESKey(keyBytes, 14);
-                Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
-                des.init(Cipher.ENCRYPT_MODE, lowKey);
-                byte[] lowResponse = des.doFinal(challenge);
-                des.init(Cipher.ENCRYPT_MODE, middleKey);
-                byte[] middleResponse = des.doFinal(challenge);
-                des.init(Cipher.ENCRYPT_MODE, highKey);
-                byte[] highResponse = des.doFinal(challenge);
-                byte[] lmResponse = new byte[24];
-                System.arraycopy(lowResponse, 0, lmResponse, 0, 8);
-                System.arraycopy(middleResponse, 0, lmResponse, 8, 8);
-                System.arraycopy(highResponse, 0, lmResponse, 16, 8);
-                return lmResponse;
+                  byte[] keyBytes = new byte[21];
+                  System.arraycopy(hash, 0, keyBytes, 0, 16);
+                  Key lowKey = createDESKey(keyBytes, 0);
+                  Key middleKey = createDESKey(keyBytes, 7);
+                  Key highKey = createDESKey(keyBytes, 14);
+                  Cipher des = Cipher.getInstance("DES/ECB/NoPadding");
+                  des.init(Cipher.ENCRYPT_MODE, lowKey);
+                  byte[] lowResponse = des.doFinal(challenge);
+                  des.init(Cipher.ENCRYPT_MODE, middleKey);
+                  byte[] middleResponse = des.doFinal(challenge);
+                  des.init(Cipher.ENCRYPT_MODE, highKey);
+                  byte[] highResponse = des.doFinal(challenge);
+                  byte[] lmResponse = new byte[24];
+                  System.arraycopy(lowResponse, 0, lmResponse, 0, 8);
+                  System.arraycopy(middleResponse, 0, lmResponse, 8, 8);
+                  System.arraycopy(highResponse, 0, lmResponse, 16, 8);
+                  return lmResponse;
                 */
                 return null;
             }
@@ -1370,23 +1170,23 @@ public class HTTP {
              * @return A DES encryption key created from the key material
              * starting at the specified offset in the given byte array.
              */
-                /*
-            private static Key createDESKey(byte[] bytes, int offset) {
-                byte[] keyBytes = new byte[7];
-                System.arraycopy(bytes, offset, keyBytes, 0, 7);
-                byte[] material = new byte[8];
-                material[0] = keyBytes[0];
-                material[1] = (byte) (keyBytes[0] << 7 | (keyBytes[1] & 0xff) >>> 1);
-                material[2] = (byte) (keyBytes[1] << 6 | (keyBytes[2] & 0xff) >>> 2);
-                material[3] = (byte) (keyBytes[2] << 5 | (keyBytes[3] & 0xff) >>> 3);
-                material[4] = (byte) (keyBytes[3] << 4 | (keyBytes[4] & 0xff) >>> 4);
-                material[5] = (byte) (keyBytes[4] << 3 | (keyBytes[5] & 0xff) >>> 5);
-                material[6] = (byte) (keyBytes[5] << 2 | (keyBytes[6] & 0xff) >>> 6);
-                material[7] = (byte) (keyBytes[6] << 1);
-                oddParity(material);
-                return new SecretKeySpec(material, "DES");
-            }
-                */
+            /*
+              private static Key createDESKey(byte[] bytes, int offset) {
+              byte[] keyBytes = new byte[7];
+              System.arraycopy(bytes, offset, keyBytes, 0, 7);
+              byte[] material = new byte[8];
+              material[0] = keyBytes[0];
+              material[1] = (byte) (keyBytes[0] << 7 | (keyBytes[1] & 0xff) >>> 1);
+              material[2] = (byte) (keyBytes[1] << 6 | (keyBytes[2] & 0xff) >>> 2);
+              material[3] = (byte) (keyBytes[2] << 5 | (keyBytes[3] & 0xff) >>> 3);
+              material[4] = (byte) (keyBytes[3] << 4 | (keyBytes[4] & 0xff) >>> 4);
+              material[5] = (byte) (keyBytes[4] << 3 | (keyBytes[5] & 0xff) >>> 5);
+              material[6] = (byte) (keyBytes[5] << 2 | (keyBytes[6] & 0xff) >>> 6);
+              material[7] = (byte) (keyBytes[6] << 1);
+              oddParity(material);
+              return new SecretKeySpec(material, "DES");
+              }
+            */
 
             /**
              * Applies odd parity to the given byte array.