home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / browser / ns405lyc / netcast.z / ncjava10.jar / netscape / netcast / application / RobotExclusion.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-03-09  |  4.8 KB  |  260 lines

  1. package netscape.netcast.application;
  2.  
  3. import java.io.InputStream;
  4. import java.io.StreamTokenizer;
  5. import java.net.URL;
  6. import java.util.Vector;
  7. import netscape.net.Cache;
  8. import netscape.net.CacheRequest;
  9.  
  10. public class RobotExclusion {
  11.    private static final int INFO_AVAILABLE = 1;
  12.    private static final int INFO_NOT_AVAILABLE = 2;
  13.    private static final int NOT_YET_QUERIED = 3;
  14.    private static final String USERAGENT = "User-agent:";
  15.    private static final String DISALLOW = "Disallow:";
  16.    private static final String ASTERISK = "*";
  17.    private static final String MOZILLA = "mozilla";
  18.    private String site = "";
  19.    private int isInfoAvailable = 3;
  20.    private InputStream urlStream;
  21.    private Vector infoList = new Vector();
  22.  
  23.    public RobotExclusion(String var1) {
  24.       this.site = var1;
  25.    }
  26.  
  27.    public boolean isRobotAllowed(URL var1, Cache var2) {
  28.       try {
  29.          if (this.isInfoAvailable == 3) {
  30.             StringBuffer var3 = new StringBuffer(this.site);
  31.             var3.append("/robots.txt");
  32.             String var4 = new String(var3);
  33.             this.isInfoAvailable = this.getInfoAvailability(var4, var2);
  34.          }
  35.  
  36.          if (this.isInfoAvailable == 2) {
  37.             return true;
  38.          } else if (this.isInfoAvailable == 1) {
  39.             return !this.matchPath(var1);
  40.          } else {
  41.             return true;
  42.          }
  43.       } catch (Exception var5) {
  44.          HTMLCrawler.printException(var5, "RobotExclusion.isRobotAllowed");
  45.          return true;
  46.       }
  47.    }
  48.  
  49.    public int getInfoAvailability(String var1, Cache var2) {
  50.       try {
  51.          CacheRequest var3 = new CacheRequest(var1);
  52.          if (var3 == null) {
  53.             return 2;
  54.          } else {
  55.             this.urlStream = var2.getInputStream(var3);
  56.             if (this.urlStream == null) {
  57.                return 2;
  58.             } else {
  59.                this.parseExclusionInfo();
  60.                var2.remove(var1);
  61.                return 1;
  62.             }
  63.          }
  64.       } catch (Exception var4) {
  65.          DebugManager.println("File " + var1 + " is not available");
  66.          return 2;
  67.       }
  68.    }
  69.  
  70.    public void parseExclusionInfo() {
  71.       try {
  72.          StreamTokenizer var1 = new StreamTokenizer(this.urlStream);
  73.          boolean var3 = false;
  74.          boolean var4 = false;
  75.          boolean var5 = false;
  76.          boolean var6 = false;
  77.          boolean var7 = false;
  78.          boolean var8 = false;
  79.          boolean var9 = false;
  80.          var1.resetSyntax();
  81.          var1.eolIsSignificant(true);
  82.          var1.ordinaryChar(47);
  83.          var1.commentChar(35);
  84.          var1.wordChars(47, 47);
  85.          var1.wordChars(58, 58);
  86.          var1.wordChars(64, 64);
  87.          var1.wordChars(38, 38);
  88.          var1.wordChars(61, 61);
  89.          var1.wordChars(37, 37);
  90.          var1.wordChars(48, 57);
  91.          var1.wordChars(97, 122);
  92.          var1.wordChars(65, 90);
  93.          var1.wordChars(36, 36);
  94.          var1.wordChars(45, 45);
  95.          var1.wordChars(95, 95);
  96.          var1.wordChars(46, 46);
  97.          var1.wordChars(43, 43);
  98.          var1.wordChars(33, 33);
  99.          var1.wordChars(42, 42);
  100.          var1.wordChars(39, 39);
  101.          var1.wordChars(40, 40);
  102.          var1.wordChars(41, 41);
  103.          var1.wordChars(44, 44);
  104.          var1.wordChars(126, 126);
  105.          var1.whitespaceChars(0, 32);
  106.  
  107.          int var2;
  108.          while((var2 = var1.nextToken()) != -1 && !var4) {
  109.             switch (var2) {
  110.                case -3:
  111.                   if (var7) {
  112.                      var7 = false;
  113.                   }
  114.  
  115.                   if (var8) {
  116.                      String var10 = var1.sval.toLowerCase();
  117.                      if (var10.equals("*") || var10.equals("mozilla")) {
  118.                         var3 = true;
  119.                         var8 = false;
  120.                      }
  121.                   }
  122.  
  123.                   if (var1.sval.equals("User-agent:")) {
  124.                      var8 = true;
  125.                      var5 = true;
  126.                   } else if (var1.sval.indexOf("User-agent:") >= 0) {
  127.                      var8 = true;
  128.                      var5 = true;
  129.                      int var16 = var1.sval.indexOf(":");
  130.                      String var11 = var1.sval.substring(var16 + 1).toLowerCase();
  131.                      if (var11.equals("*") || var11.equals("mozilla")) {
  132.                         var3 = true;
  133.                         var8 = false;
  134.                      }
  135.                   }
  136.  
  137.                   if (var9 && var3) {
  138.                      String var17 = this.decodeString(var1.sval);
  139.                      this.infoList.addElement(var17.toLowerCase());
  140.                      var9 = false;
  141.                   }
  142.  
  143.                   if (var1.sval.equals("Disallow:")) {
  144.                      if (var3) {
  145.                         var9 = true;
  146.                      }
  147.                   } else if (var1.sval.indexOf("Disallow:") >= 0 && var3) {
  148.                      var9 = true;
  149.                      int var18 = var1.sval.indexOf(":");
  150.                      String var19 = var1.sval.substring(var18 + 1);
  151.                      String var12 = this.decodeString(var19);
  152.                      this.infoList.addElement(var12.toLowerCase());
  153.                      var9 = false;
  154.                   }
  155.                   break;
  156.                case -2:
  157.                   if (var7) {
  158.                      var7 = false;
  159.                   }
  160.                   break;
  161.                case 10:
  162.                   var8 = false;
  163.                   var9 = false;
  164.                   if (var7 && var5) {
  165.                      var6 = true;
  166.                      var5 = false;
  167.                      var7 = false;
  168.                      if (var3) {
  169.                         var3 = false;
  170.                         var4 = true;
  171.                      }
  172.                      break;
  173.                   }
  174.  
  175.                   var7 = true;
  176.                   break;
  177.                default:
  178.                   if (var7) {
  179.                      var7 = false;
  180.                   }
  181.             }
  182.          }
  183.  
  184.          DebugManager.println("infoList " + this.infoList);
  185.       } catch (Exception var13) {
  186.          DebugManager.println("File robots.txt is not available");
  187.       }
  188.    }
  189.  
  190.    public boolean matchPath(URL var1) {
  191.       try {
  192.          String var2 = var1.getFile();
  193.          int var3 = this.infoList.size();
  194.  
  195.          for(int var4 = 0; var4 < var3; ++var4) {
  196.             String var5 = (String)this.infoList.elementAt(var4);
  197.             String var6 = this.decodeString(var2);
  198.             if (var6.length() >= 0 && var6.toLowerCase().indexOf(var5) >= 0) {
  199.                DebugManager.println("URLpath " + var1 + "matches record path " + var5);
  200.                return true;
  201.             }
  202.          }
  203.  
  204.          return false;
  205.       } catch (Exception var7) {
  206.          HTMLCrawler.printException(var7, "RobotExclusion.matchPath");
  207.          return false;
  208.       }
  209.    }
  210.  
  211.    public String decodeString(String var1) {
  212.       try {
  213.          char[] var2 = new char[]{';', '/', ':', '@', '=', '&'};
  214.          byte var3 = 6;
  215.          boolean var4 = false;
  216.          int var5 = 0;
  217.          if (var1.length() > 0) {
  218.             while(var5 <= var1.length()) {
  219.                var4 = false;
  220.                if ((var5 = var1.indexOf("%", var5)) == -1 || var5 + 3 > var1.length()) {
  221.                   break;
  222.                }
  223.  
  224.                String var6 = var1.substring(var5 + 1, var5 + 3);
  225.                char var7 = (char)Integer.parseInt(var6, 16);
  226.                int var8 = 0;
  227.  
  228.                while(true) {
  229.                   if (var8 < var3) {
  230.                      if (var7 != var2[var8]) {
  231.                         ++var8;
  232.                         continue;
  233.                      }
  234.  
  235.                      var4 = true;
  236.                      var5 += 3;
  237.                   }
  238.  
  239.                   if (!var4) {
  240.                      if (var5 + 3 <= var1.length()) {
  241.                         var1 = var1.substring(0, var5) + var7 + var1.substring(var5 + 3);
  242.                      }
  243.  
  244.                      if (var7 == '%') {
  245.                         ++var5;
  246.                      }
  247.                   }
  248.                   break;
  249.                }
  250.             }
  251.          }
  252.  
  253.          return var1;
  254.       } catch (Exception var9) {
  255.          HTMLCrawler.printException(var9, "RobotExclusion.decodeString");
  256.          return var1;
  257.       }
  258.    }
  259. }
  260.