home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / net / www / protocol / gopher / GopherClient.class (.txt) next >
Encoding:
Java Class File  |  1997-07-08  |  6.2 KB  |  293 lines

  1. package sun.net.www.protocol.gopher;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.PipedInputStream;
  7. import java.io.PipedOutputStream;
  8. import java.io.PrintStream;
  9. import java.net.URL;
  10. import java.net.UnknownHostException;
  11. import sun.net.NetworkClient;
  12. import sun.net.www.MessageHeader;
  13. import sun.net.www.URLConnection;
  14.  
  15. public class GopherClient extends NetworkClient implements Runnable {
  16.    public static boolean useGopherProxy = Boolean.getBoolean("gopherProxySet");
  17.    public static String gopherProxyHost = System.getProperty("gopherProxyHost");
  18.    public static int gopherProxyPort = Integer.getInteger("gopherProxyPort", 80);
  19.    // $FF: renamed from: os java.io.PipedOutputStream
  20.    PipedOutputStream field_0;
  21.    // $FF: renamed from: u java.net.URL
  22.    URL field_1;
  23.    int gtype;
  24.    String gkey;
  25.    URLConnection connection;
  26.  
  27.    GopherClient(URLConnection var1) {
  28.       this.connection = var1;
  29.    }
  30.  
  31.    InputStream openStream(URL var1) throws IOException {
  32.       this.field_1 = var1;
  33.       this.field_0 = this.field_0;
  34.       int var2 = 0;
  35.       String var3 = var1.getFile();
  36.       int var4 = var3.length();
  37.  
  38.       char var5;
  39.       for(var5 = 49; var2 < var4 && (var5 = var3.charAt(var2)) == '/'; ++var2) {
  40.       }
  41.  
  42.       this.gtype = var5 == 47 ? 49 : var5;
  43.       if (var2 < var4) {
  44.          ++var2;
  45.       }
  46.  
  47.       this.gkey = var3.substring(var2);
  48.  
  49.       try {
  50.          ((NetworkClient)this).openServer(var1.getHost(), var1.getPort() <= 0 ? 70 : var1.getPort());
  51.       } catch (UnknownHostException var8) {
  52.          ((NetworkClient)this).openServer("sun-barr.ebay.sun.com", 3666);
  53.          super.serverOutput.print(var1.getHost() + " " + (var1.getPort() <= 0 ? 70 : var1.getPort()) + "\n");
  54.          super.serverOutput.flush();
  55.          var2 = 0;
  56.  
  57.          while((var5 = super.serverInput.read()) >= 0) {
  58.             if (var5 == 10) {
  59.                ++var2;
  60.                if (var2 >= 2) {
  61.                   break;
  62.                }
  63.             }
  64.          }
  65.  
  66.          if (var5 < 0) {
  67.             ((NetworkClient)this).closeServer();
  68.             throw new UnknownHostException(var1.getHost());
  69.          }
  70.       }
  71.  
  72.       MessageHeader var6 = new MessageHeader();
  73.       switch (this.gtype) {
  74.          case 48:
  75.          case 55:
  76.             var6.add("content-type", "text/plain");
  77.             break;
  78.          case 49:
  79.             var6.add("content-type", "text/html");
  80.             break;
  81.          case 73:
  82.          case 103:
  83.             var6.add("content-type", "image/gif");
  84.             break;
  85.          default:
  86.             var6.add("content-type", "content/unknown");
  87.       }
  88.  
  89.       if (this.gtype != 55) {
  90.          super.serverOutput.print(this.decodePercent(this.gkey) + "\r\n");
  91.          super.serverOutput.flush();
  92.       } else if ((var2 = this.gkey.indexOf(63)) >= 0) {
  93.          super.serverOutput.print(this.decodePercent(this.gkey.substring(0, var2) + "\t" + this.gkey.substring(var2 + 1) + "\r\n"));
  94.          super.serverOutput.flush();
  95.          var6.add("content-type", "text/html");
  96.       } else {
  97.          var6.add("content-type", "text/html");
  98.       }
  99.  
  100.       this.connection.setProperties(var6);
  101.       if (var6.findValue("content-type") == "text/html") {
  102.          this.field_0 = new PipedOutputStream();
  103.          PipedInputStream var7 = new PipedInputStream();
  104.          var7.connect(this.field_0);
  105.          (new Thread(this)).start();
  106.          return var7;
  107.       } else {
  108.          return new GopherInputStream(this, super.serverInput);
  109.       }
  110.    }
  111.  
  112.    private String decodePercent(String var1) {
  113.       if (var1 != null && var1.indexOf(37) >= 0) {
  114.          int var2 = var1.length();
  115.          char[] var3 = new char[var2];
  116.          int var4 = 0;
  117.  
  118.          for(int var5 = 0; var5 < var2; ++var5) {
  119.             int var6 = var1.charAt(var5);
  120.             if (var6 == 37 && var5 + 2 < var2) {
  121.                int var7 = var1.charAt(var5 + 1);
  122.                int var8 = var1.charAt(var5 + 2);
  123.                if (var7 >= 48 && var7 <= 57) {
  124.                   var7 -= 48;
  125.                } else if (var7 >= 97 && var7 <= 102) {
  126.                   var7 = var7 - 97 + 10;
  127.                } else if (var7 >= 65 && var7 <= 70) {
  128.                   var7 = var7 - 65 + 10;
  129.                } else {
  130.                   var7 = -1;
  131.                }
  132.  
  133.                if (var8 >= 48 && var8 <= 57) {
  134.                   var8 -= 48;
  135.                } else if (var8 >= 97 && var8 <= 102) {
  136.                   var8 = var8 - 97 + 10;
  137.                } else if (var8 >= 65 && var8 <= 70) {
  138.                   var8 = var8 - 65 + 10;
  139.                } else {
  140.                   var8 = -1;
  141.                }
  142.  
  143.                if (var7 >= 0 && var8 >= 0) {
  144.                   var6 = var7 << 4 | var8;
  145.                   var5 += 2;
  146.                }
  147.             }
  148.  
  149.             var3[var4++] = (char)var6;
  150.          }
  151.  
  152.          return new String(var3, 0, var4);
  153.       } else {
  154.          return var1;
  155.       }
  156.    }
  157.  
  158.    private String encodePercent(String var1) {
  159.       if (var1 == null) {
  160.          return var1;
  161.       } else {
  162.          int var2 = var1.length();
  163.          char[] var3 = null;
  164.          int var4 = 0;
  165.  
  166.          for(int var5 = 0; var5 < var2; ++var5) {
  167.             char var6 = var1.charAt(var5);
  168.             if (var6 > ' ' && var6 != '"' && var6 != '%') {
  169.                if (var3 != null) {
  170.                   if (var4 >= var3.length) {
  171.                      char[] var10 = new char[var4 + 10];
  172.                      System.arraycopy(var3, 0, var10, 0, var4);
  173.                      var3 = var10;
  174.                   }
  175.  
  176.                   var3[var4] = (char)var6;
  177.                }
  178.  
  179.                ++var4;
  180.             } else {
  181.                if (var3 == null) {
  182.                   var3 = var1.toCharArray();
  183.                }
  184.  
  185.                if (var4 + 3 >= var3.length) {
  186.                   char[] var7 = new char[var4 + 10];
  187.                   System.arraycopy(var3, 0, var7, 0, var4);
  188.                   var3 = var7;
  189.                }
  190.  
  191.                var3[var4] = '%';
  192.                int var8 = var6 >> 4 & 15;
  193.                var3[var4 + 1] = (char)(var8 < 10 ? 48 + var8 : 55 + var8);
  194.                var8 = var6 & 15;
  195.                var3[var4 + 2] = (char)(var8 < 10 ? 48 + var8 : 55 + var8);
  196.                var4 += 3;
  197.             }
  198.          }
  199.  
  200.          if (var3 == null) {
  201.             return var1;
  202.          } else {
  203.             return new String(var3, 0, var4);
  204.          }
  205.       }
  206.    }
  207.  
  208.    public void run() {
  209.       int var1 = -1;
  210.  
  211.       try {
  212.          if (this.gtype == 55 && (var1 = this.gkey.indexOf(63)) < 0) {
  213.             PrintStream var25 = new PrintStream(this.field_0);
  214.             var25.print("<html><head><title>Searchable Gopher Index</title></head>\n<body><h1>Searchable Gopher Index</h1><isindex>\n</body></html>\n");
  215.          } else if (this.gtype != 49 && this.gtype != 55) {
  216.             byte[] var24 = new byte[2048];
  217.  
  218.             int var27;
  219.             try {
  220.                while((var27 = super.serverInput.read(var24)) >= 0) {
  221.                   this.field_0.write(var24, 0, var27);
  222.                }
  223.             } catch (Exception var21) {
  224.             }
  225.          } else {
  226.             PrintStream var4 = new PrintStream(this.field_0);
  227.             Object var5 = null;
  228.             String var26;
  229.             if (this.gtype == 55) {
  230.                var26 = "Results of searching for \"" + this.gkey.substring(var1 + 1) + "\" on " + this.field_1.getHost();
  231.             } else {
  232.                var26 = "Gopher directory " + this.gkey + " from " + this.field_1.getHost();
  233.             }
  234.  
  235.             var4.print("<html><head><title>");
  236.             var4.print(var26);
  237.             var4.print("</title></head>\n<body>\n<H1>");
  238.             var4.print(var26);
  239.             var4.print("</h1><dl compact>\n");
  240.             DataInputStream var6 = new DataInputStream(super.serverInput);
  241.  
  242.             String var7;
  243.             while((var7 = var6.readLine()) != null) {
  244.                int var8;
  245.                for(var8 = var7.length(); var8 > 0 && var7.charAt(var8 - 1) <= ' '; --var8) {
  246.                }
  247.  
  248.                if (var8 > 0) {
  249.                   char var9 = var7.charAt(0);
  250.                   int var10 = var7.indexOf(9);
  251.                   int var11 = var10 > 0 ? var7.indexOf(9, var10 + 1) : -1;
  252.                   int var12 = var11 > 0 ? var7.indexOf(9, var11 + 1) : -1;
  253.                   if (var12 >= 0) {
  254.                      String var13 = var12 + 1 < var8 ? ":" + var7.substring(var12 + 1, var8) : "";
  255.                      String var14 = var11 + 1 < var12 ? var7.substring(var11 + 1, var12) : this.field_1.getHost();
  256.                      var4.print("<dt><a href=\"gopher://" + var14 + var13 + "/" + var7.substring(0, 1) + this.encodePercent(var7.substring(var10 + 1, var11)) + "\">\n");
  257.                      var4.print("<img align=middle border=0 width=25 height=32 src=doc:/lib/images/ftp/");
  258.                      switch (var9) {
  259.                         case '0':
  260.                            var4.print("text");
  261.                            break;
  262.                         case '1':
  263.                            var4.print("directory");
  264.                            break;
  265.                         case 'g':
  266.                            var4.print("gif");
  267.                            break;
  268.                         default:
  269.                            var4.print("file");
  270.                      }
  271.  
  272.                      var4.print(".gif align=middle><dd>\n");
  273.                      var4.print(var7.substring(1, var10) + "</a>\n");
  274.                   }
  275.                }
  276.             }
  277.  
  278.             var4.print("</dl></body>\n");
  279.             var4.close();
  280.          }
  281.       } catch (IOException var22) {
  282.       } finally {
  283.          try {
  284.             ((NetworkClient)this).closeServer();
  285.             this.field_0.close();
  286.          } catch (IOException var20) {
  287.          }
  288.  
  289.       }
  290.  
  291.    }
  292. }
  293.