home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / sun / net / www / http / HttpClient.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  9.6 KB  |  531 lines

  1. package sun.net.www.http;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.BufferedOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.io.PrintStream;
  9. import java.io.PushbackInputStream;
  10. import java.net.InetAddress;
  11. import java.net.SocketException;
  12. import java.net.URL;
  13. import java.net.UnknownHostException;
  14. import java.security.AccessController;
  15. import java.security.PrivilegedActionException;
  16. import java.util.StringTokenizer;
  17. import sun.misc.REException;
  18. import sun.misc.RegexpPool;
  19. import sun.net.NetworkClient;
  20. import sun.net.ProgressData;
  21. import sun.net.ProgressEntry;
  22. import sun.net.www.HeaderParser;
  23. import sun.net.www.MessageHeader;
  24. import sun.net.www.MeteredStream;
  25. import sun.security.action.GetPropertyAction;
  26.  
  27. public class HttpClient extends NetworkClient {
  28.    MessageHeader requests;
  29.    boolean failedOnce;
  30.    KeepAliveStream kas;
  31.    private static RegexpPool dontProxy = new RegexpPool();
  32.    private static String dontProxySource = null;
  33.    private static final int HTTP_CONTINUE = 100;
  34.    static final int httpPortNumber = 80;
  35.    public static String proxyHost = null;
  36.    public static int proxyPort = 80;
  37.    private String instProxy;
  38.    private int instProxyPort;
  39.    protected boolean proxyDisabled;
  40.    public boolean usingProxy;
  41.    private String host;
  42.    private int port;
  43.    protected static KeepAliveCache kac = new KeepAliveCache();
  44.    boolean keepingAlive;
  45.    int keepAliveConnections;
  46.    int keepAliveTimeout;
  47.    protected URL url;
  48.  
  49.    protected int getDefaultPort() {
  50.       return 80;
  51.    }
  52.  
  53.    public static synchronized void resetProperties() {
  54.    }
  55.  
  56.    private String getProxyHost() {
  57.       String var1 = (String)AccessController.doPrivileged(new GetPropertyAction("http.proxyHost"));
  58.       if (var1 == null) {
  59.          var1 = (String)AccessController.doPrivileged(new GetPropertyAction("proxyHost"));
  60.       }
  61.  
  62.       if (var1 != null && var1.length() == 0) {
  63.          var1 = null;
  64.       }
  65.  
  66.       return var1;
  67.    }
  68.  
  69.    private int getProxyPort() {
  70.       int[] var1 = new int[]{0};
  71.       AccessController.doPrivileged(new 1(this, var1));
  72.       return var1[0];
  73.    }
  74.  
  75.    public boolean getHttpKeepAliveSet() {
  76.       boolean var1 = true;
  77.       String var2 = (String)AccessController.doPrivileged(new 2(this));
  78.       if (var2 != null) {
  79.          var1 = Boolean.valueOf(var2);
  80.       }
  81.  
  82.       return var1;
  83.    }
  84.  
  85.    private static RegexpPool getDontProxy() {
  86.       RegexpPool var0 = dontProxy;
  87.       synchronized(var0) {
  88.          String var1 = (String)AccessController.doPrivileged(new GetPropertyAction("http.nonProxyHosts"));
  89.          if (var1 == dontProxySource) {
  90.             RegexpPool var8 = dontProxy;
  91.             return var8;
  92.          }
  93.  
  94.          RegexpPool var2 = new RegexpPool();
  95.          if (var1 != null) {
  96.             StringTokenizer var3 = new StringTokenizer(var1, "|", false);
  97.  
  98.             try {
  99.                while(var3.hasMoreTokens()) {
  100.                   var2.add(var3.nextToken().toLowerCase(), Boolean.TRUE);
  101.                }
  102.             } catch (REException var6) {
  103.                System.err.println("Error in http.nonProxyHosts system property:  " + var6);
  104.             }
  105.          }
  106.  
  107.          dontProxySource = var1;
  108.          dontProxy = var2;
  109.       }
  110.  
  111.       return dontProxy;
  112.    }
  113.  
  114.    public HttpClient(URL var1, String var2, int var3) throws IOException {
  115.       this(var1, var2, var3, false);
  116.    }
  117.  
  118.    private HttpClient(URL var1, String var2, int var3, boolean var4) throws IOException {
  119.       this.failedOnce = false;
  120.       this.instProxy = null;
  121.       this.instProxyPort = -1;
  122.       this.usingProxy = false;
  123.       this.keepingAlive = false;
  124.       this.keepAliveConnections = -1;
  125.       this.keepAliveTimeout = 0;
  126.       this.proxyDisabled = var4;
  127.       if (!var4) {
  128.          this.instProxy = var2;
  129.          this.instProxyPort = var3 < 0 ? this.getDefaultPort() : var3;
  130.       }
  131.  
  132.       try {
  133.          InetAddress var5 = InetAddress.getByName(var1.getHost());
  134.          this.host = var5.getHostAddress();
  135.       } catch (UnknownHostException var6) {
  136.          this.host = var1.getHost();
  137.       }
  138.  
  139.       this.url = var1;
  140.       this.port = var1.getPort();
  141.       if (this.port == -1) {
  142.          this.port = this.getDefaultPort();
  143.       }
  144.  
  145.       this.openServer();
  146.    }
  147.  
  148.    protected HttpClient(URL var1, boolean var2) throws IOException {
  149.       this(var1, (String)null, -1, var2);
  150.    }
  151.  
  152.    private HttpClient(URL var1) throws IOException {
  153.       this(var1, (String)null, -1, false);
  154.    }
  155.  
  156.    public static HttpClient New(URL var0) throws IOException {
  157.       HttpClient var1 = (HttpClient)kac.get(var0);
  158.       if (var1 == null) {
  159.          var1 = new HttpClient(var0);
  160.       } else {
  161.          SecurityManager var2 = System.getSecurityManager();
  162.          if (var2 != null) {
  163.             var2.checkConnect(var0.getHost(), var0.getPort());
  164.          }
  165.  
  166.          var1.url = var0;
  167.       }
  168.  
  169.       return var1;
  170.    }
  171.  
  172.    public static void finished(HttpClient var0) {
  173.       --var0.keepAliveConnections;
  174.       if (var0.keepAliveConnections > 0 && var0.keepingAlive && !var0.serverOutput.checkError()) {
  175.          kac.put(var0.url, var0);
  176.       } else {
  177.          var0.closeServer();
  178.       }
  179.  
  180.    }
  181.  
  182.    public void openServer(String var1, int var2) throws IOException {
  183.       super.serverSocket = ((NetworkClient)this).doConnect(var1, var2);
  184.       super.serverOutput = new PrintStream(new BufferedOutputStream(super.serverSocket.getOutputStream()));
  185.       super.serverSocket.setTcpNoDelay(true);
  186.    }
  187.  
  188.    private synchronized void privilegedOpenServer(String var1, int var2) throws IOException {
  189.       try {
  190.          AccessController.doPrivileged(new 3(this, var1, var2));
  191.       } catch (PrivilegedActionException var4) {
  192.          throw (IOException)var4.getException();
  193.       }
  194.    }
  195.  
  196.    private void superOpenServer(String var1, int var2) throws IOException, UnknownHostException {
  197.       super.openServer(var1, var2);
  198.    }
  199.  
  200.    private synchronized void privilegedSuperOpenServer(String var1, int var2) throws IOException {
  201.       try {
  202.          AccessController.doPrivileged(new 4(this, var1, var2));
  203.       } catch (PrivilegedActionException var4) {
  204.          throw (IOException)var4.getException();
  205.       }
  206.    }
  207.  
  208.    private boolean isLoopback(String var1) {
  209.       if (var1 != null && var1.length() != 0) {
  210.          if (var1.equalsIgnoreCase("localhost")) {
  211.             return true;
  212.          } else if (!Character.isDigit(var1.charAt(0))) {
  213.             return false;
  214.          } else {
  215.             boolean var2 = true;
  216.             int var3 = 0;
  217.             char[] var4 = var1.toCharArray();
  218.             int var5 = 0;
  219.  
  220.             label64:
  221.             while(var5 < var4.length) {
  222.                char var6 = var4[var5];
  223.                if (var6 >= '0' && var6 <= '9') {
  224.                   int var7 = 0;
  225.  
  226.                   while(true) {
  227.                      if (var6 != '.') {
  228.                         if (var6 < '0' || var6 > '9') {
  229.                            return false;
  230.                         }
  231.  
  232.                         var7 = var7 * 10 + var6 - 48;
  233.                         ++var5;
  234.                         if (var5 < var4.length) {
  235.                            var6 = var4[var5];
  236.                            continue;
  237.                         }
  238.                      }
  239.  
  240.                      if (var7 > 255) {
  241.                         return false;
  242.                      }
  243.  
  244.                      if (var2) {
  245.                         var2 = false;
  246.                         if (var7 != 127) {
  247.                            return false;
  248.                         }
  249.                      }
  250.  
  251.                      ++var3;
  252.                      ++var5;
  253.                      continue label64;
  254.                   }
  255.                }
  256.  
  257.                return false;
  258.             }
  259.  
  260.             if (var3 == 4 && !var1.endsWith(".")) {
  261.                return true;
  262.             } else {
  263.                return false;
  264.             }
  265.          }
  266.       } else {
  267.          return false;
  268.       }
  269.    }
  270.  
  271.    private synchronized void openServer() throws IOException {
  272.       SecurityManager var1 = System.getSecurityManager();
  273.       if (var1 != null) {
  274.          var1.checkConnect(this.host, this.port);
  275.       }
  276.  
  277.       if (!this.keepingAlive) {
  278.          RegexpPool var2 = getDontProxy();
  279.          String var3 = this.url.getHost().toLowerCase();
  280.          boolean var4 = this.isLoopback(var3);
  281.          if (this.url.getProtocol().equals("http")) {
  282.             if (this.instProxy != null && !var4) {
  283.                this.privilegedOpenServer(this.instProxy, this.instProxyPort);
  284.                this.usingProxy = true;
  285.             } else {
  286.                String var9 = this.getProxyHost();
  287.                if (var9 != null && !this.proxyDisabled && !var4 && var2.match(var3) == null && var2.match(this.host) == null) {
  288.                   try {
  289.                      int var10 = this.getProxyPort();
  290.                      this.privilegedOpenServer(var9, var10);
  291.                      this.instProxy = var9;
  292.                      this.instProxyPort = var10;
  293.                      this.usingProxy = true;
  294.                      return;
  295.                   } catch (IOException var7) {
  296.                   }
  297.                }
  298.  
  299.                this.openServer(this.host, this.port);
  300.                this.usingProxy = false;
  301.             }
  302.          } else if (this.instProxy != null && !var4) {
  303.             this.privilegedSuperOpenServer(this.instProxy, this.instProxyPort);
  304.             this.usingProxy = true;
  305.          } else {
  306.             String var5 = this.getProxyHost();
  307.             if (var5 != null && !this.proxyDisabled && !var4 && var2.match(var3) == null && var2.match(this.host) == null) {
  308.                try {
  309.                   int var6 = this.getProxyPort();
  310.                   this.privilegedSuperOpenServer(var5, var6);
  311.                   this.instProxy = var5;
  312.                   this.instProxyPort = var6;
  313.                   this.usingProxy = true;
  314.                   return;
  315.                } catch (IOException var8) {
  316.                }
  317.             }
  318.  
  319.             super.openServer(this.host, this.port);
  320.             this.usingProxy = false;
  321.          }
  322.       }
  323.    }
  324.  
  325.    public String getURLFile() {
  326.       String var1 = this.url.getFile();
  327.       if (var1 == null || var1.length() == 0) {
  328.          var1 = "/";
  329.       }
  330.  
  331.       if (this.usingProxy) {
  332.          String var2 = this.url.getProtocol() + "://" + this.url.getHost();
  333.          if (this.url.getPort() != -1) {
  334.             var2 = var2 + ":" + this.url.getPort();
  335.          }
  336.  
  337.          return var2 + var1;
  338.       } else {
  339.          return var1;
  340.       }
  341.    }
  342.  
  343.    public void writeRequests(MessageHeader var1) {
  344.       this.requests = var1;
  345.       this.requests.print(super.serverOutput);
  346.       super.serverOutput.flush();
  347.    }
  348.  
  349.    public boolean parseHTTP(MessageHeader var1, ProgressEntry var2) throws IOException {
  350.       try {
  351.          super.serverInput = super.serverSocket.getInputStream();
  352.          super.serverInput = new BufferedInputStream(super.serverInput);
  353.          super.serverInput = new PushbackInputStream(super.serverInput, 8);
  354.          return this.parseHTTPHeader(var1, var2);
  355.       } catch (IOException var4) {
  356.          this.closeServer();
  357.          if (!this.failedOnce && this.requests != null) {
  358.             this.failedOnce = true;
  359.             this.openServer();
  360.             this.writeRequests(this.requests);
  361.             return this.parseHTTP(var1, var2);
  362.          } else {
  363.             throw var4;
  364.          }
  365.       }
  366.    }
  367.  
  368.    private boolean parseHTTPHeader(MessageHeader var1, ProgressEntry var2) throws IOException {
  369.       this.keepAliveConnections = -1;
  370.       this.keepAliveTimeout = 0;
  371.       boolean var3 = false;
  372.       byte[] var4 = new byte[8];
  373.  
  374.       try {
  375.          int var5;
  376.          int var6;
  377.          for(var5 = 0; var5 < 8; var5 += var6) {
  378.             var6 = super.serverInput.read(var4, var5, 8 - var5);
  379.             if (var6 < 0) {
  380.                break;
  381.             }
  382.          }
  383.  
  384.          String var15 = null;
  385.          var3 = var4[0] == 72 && var4[1] == 84 && var4[2] == 84 && var4[3] == 80 && var4[4] == 47 && var4[5] == 49 && var4[6] == 46;
  386.          ((PushbackInputStream)super.serverInput).unread(var4);
  387.          if (var3) {
  388.             var1.parseHeader(super.serverInput);
  389.             if (this.usingProxy) {
  390.                var15 = var1.findValue("Proxy-Connection");
  391.             }
  392.  
  393.             if (var15 == null) {
  394.                var15 = var1.findValue("Connection");
  395.             }
  396.  
  397.             if (var15 != null && var15.toLowerCase().equals("keep-alive")) {
  398.                HeaderParser var7 = new HeaderParser(var1.findValue("Keep-Alive"));
  399.                if (var7 != null) {
  400.                   this.keepAliveConnections = var7.findInt("max", 5);
  401.                   this.keepAliveTimeout = var7.findInt("timeout", 5);
  402.                }
  403.             } else if (var4[7] != 48) {
  404.                if (var15 != null) {
  405.                   this.keepAliveConnections = 1;
  406.                } else {
  407.                   this.keepAliveConnections = 2;
  408.                }
  409.             }
  410.          } else {
  411.             if (var5 != 8) {
  412.                if (!this.failedOnce && this.requests != null) {
  413.                   this.failedOnce = true;
  414.                   this.closeServer();
  415.                   this.openServer();
  416.                   this.writeRequests(this.requests);
  417.                   return this.parseHTTP(var1, var2);
  418.                }
  419.  
  420.                throw new SocketException("Unexpected end of file from server");
  421.             }
  422.  
  423.             var1.set("Content-type", "unknown/unknown");
  424.          }
  425.       } catch (IOException var12) {
  426.          throw var12;
  427.       }
  428.  
  429.       int var14 = -1;
  430.  
  431.       try {
  432.          String var16 = var1.getValue(0);
  433.  
  434.          int var18;
  435.          for(var18 = var16.indexOf(32); var16.charAt(var18) == ' '; ++var18) {
  436.          }
  437.  
  438.          var14 = Integer.parseInt(var16.substring(var18, var18 + 3));
  439.       } catch (Exception var11) {
  440.       }
  441.  
  442.       if (var14 == 100) {
  443.          return this.parseHTTPHeader(var1, var2);
  444.       } else {
  445.          String var17 = null;
  446.  
  447.          try {
  448.             var17 = var1.findValue("Transfer-Encoding");
  449.          } catch (Exception var10) {
  450.          }
  451.  
  452.          if (var17 != null && var17.equalsIgnoreCase("chunked")) {
  453.             InputStream var19 = super.serverInput;
  454.             super.serverInput = new ChunkedInputStream(super.serverInput);
  455.             var1.set("content-length", Integer.toString(super.serverInput.available()));
  456.             var1.mergeHeader(var19);
  457.          }
  458.  
  459.          int var20 = -1;
  460.  
  461.          try {
  462.             var20 = Integer.parseInt(var1.findValue("content-length"));
  463.          } catch (Exception var9) {
  464.          }
  465.  
  466.          if (this.keepAliveConnections > 1 && var20 > 0) {
  467.             this.keepingAlive = true;
  468.          } else if (this.keepingAlive) {
  469.             this.keepingAlive = false;
  470.          }
  471.  
  472.          if (var20 > 0) {
  473.             var2.setType(this.url.getFile(), var1.findValue("content-type"));
  474.             var2.update(0, var20);
  475.             if (this.keepingAlive) {
  476.                this.kas = new KeepAliveStream(super.serverInput, var2, this);
  477.                super.serverInput = this.kas;
  478.                this.failedOnce = false;
  479.             } else {
  480.                super.serverInput = new MeteredStream(super.serverInput, var2);
  481.             }
  482.          } else {
  483.             ProgressData.pdata.unregister(var2);
  484.          }
  485.  
  486.          return var3;
  487.       }
  488.    }
  489.  
  490.    public synchronized InputStream getInputStream() {
  491.       return super.serverInput;
  492.    }
  493.  
  494.    public OutputStream getOutputStream() {
  495.       return super.serverOutput;
  496.    }
  497.  
  498.    public String toString() {
  499.       return this.getClass().getName() + "(" + this.url + ")";
  500.    }
  501.  
  502.    public final boolean isKeepingAlive() {
  503.       return this.getHttpKeepAliveSet() && this.keepingAlive;
  504.    }
  505.  
  506.    protected void finalize() throws Throwable {
  507.    }
  508.  
  509.    public void closeServer() {
  510.       try {
  511.          this.keepingAlive = false;
  512.          super.serverSocket.close();
  513.       } catch (Exception var2) {
  514.       }
  515.  
  516.    }
  517.  
  518.    public String getProxyHostUsed() {
  519.       return !this.usingProxy ? null : this.instProxy;
  520.    }
  521.  
  522.    public int getProxyPortUsed() {
  523.       return this.instProxyPort;
  524.    }
  525.  
  526.    // $FF: synthetic method
  527.    static void access$000(HttpClient var0, String var1, int var2) throws IOException, UnknownHostException {
  528.       var0.superOpenServer(var1, var2);
  529.    }
  530. }
  531.