Image

SOCKS proxy failover using ProxySelector does not work.

XMLWordPrintable

    • Type: Image Enhancement
    • Resolution: Unresolved
    • Priority: Image P4
    • None
    • Affects Version/s: 7
    • Component/s: core-libs
    • x86
    • windows_7

      FULL PRODUCT VERSION :
      java version "1.7.0_02"
      Java(TM) SE Runtime Environment (build 1.7.0_02-b13)
      Java HotSpot(TM) Client VM (build 22.0-b10, mixed mode, sharing)


      ADDITIONAL OS VERSION INFORMATION :
      Windws 7 (Microsoft Windows [Version 6.1.7601])

      A DESCRIPTION OF THE PROBLEM :
      I have two proxy server.
      One is HTTP proxy listening port 8081.
      The other is SOCKS proxy listening port 1081.

      ProxySelector returns proxy list for fail-over.
      The First proxy is dead, The Seond proxy is alive.
      When calling URL.getContent() using HTTP proxy list, fail-over was successful.
      When calling socket.connect() using SOCK proxy list, fail-over did not work.



      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. compile sample code.
      2. run the sample

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      * Test for Proxy Alive...
      Connecting to /10.13.1.218:8080...
      proxy is dead. (java.net.ConnectException: Connection refused: connect)
      Connecting to /10.13.1.218:8081...
      proxy is alive.
      Connecting to /10.13.1.218:1080...
      proxy is dead. (java.net.ConnectException: Connection refused: connect)
      Connecting to /10.13.1.218:1081...
      proxy is alive.

      * Test for HTTP Proxy...
      http://www.oracle.com/index.html, /10.13.1.218:8080 java.net.ConnectException: Connection refused: connect
      Success

      * Test for SOCKS Proxy...
      socket://www.oracle.com:80, /10.13.1.218:1080 java.net.ConnectException: Connection refused: connect
      Success

      ACTUAL -
      * Test for Proxy Alive...
      Connecting to /10.13.1.218:8080...
      proxy is dead. (java.net.ConnectException: Connection refused: connect)
      Connecting to /10.13.1.218:8081...
      proxy is alive.
      Connecting to /10.13.1.218:1080...
      proxy is dead. (java.net.ConnectException: Connection refused: connect)
      Connecting to /10.13.1.218:1081...
      proxy is alive.

      * Test for HTTP Proxy...
      http://www.oracle.com/index.html, /10.13.1.218:8080 java.net.ConnectException: Connection refused: connect
      Success

      * Test for SOCKS Proxy...
      socket://www.oracle.com:80, /10.13.1.218:1080 java.net.ConnectException: Connection refused: connect
      socket://www.oracle.com:80, /10.13.1.218:1081 java.net.SocketException: Socket closed
      java.net.SocketException: Can't connect to SOCKS proxy:Socket closed
      at java.net.SocksSocketImpl.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at dmlim.net.SocksProxyBugTest.testSocks(SocksProxyBugTest.java:118)
      at dmlim.net.SocksProxyBugTest.main(SocksProxyBugTest.java:167)


      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      java.net.SocketException: Can't connect to SOCKS proxy:Socket closed
      at java.net.SocksSocketImpl.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at dmlim.net.SocksProxyBugTest.testSocks(SocksProxyBugTest.java:118)
      at dmlim.net.SocksProxyBugTest.main(SocksProxyBugTest.java:167)


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      package dmlim.net;

      import java.io.ByteArrayOutputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.net.InetSocketAddress;
      import java.net.Proxy;
      import java.net.ProxySelector;
      import java.net.Socket;
      import java.net.SocketAddress;
      import java.net.URI;
      import java.net.URL;
      import java.util.LinkedList;
      import java.util.List;

      public class SocksProxyBugTest
      {
      static InetSocketAddress DEAD__HTTP__PROXY_ADDR = new InetSocketAddress("10.13.1.218", 8080);
      static InetSocketAddress ALIVE_HTTP__PROXY_ADDR = new InetSocketAddress("10.13.1.218", 8081);

      static InetSocketAddress DEAD__SOCKS_PROXY_ADDR = new InetSocketAddress("10.13.1.218", 1080);
      static InetSocketAddress ALIVE_SOCKS_PROXY_ADDR = new InetSocketAddress("10.13.1.218", 1081);

      static LinkedList<Proxy> HTTP__PROXY_LIST = new LinkedList<Proxy>();
      static LinkedList<Proxy> SOCKS_PROXY_LIST = new LinkedList<Proxy>();

      static
      {
      HTTP__PROXY_LIST.add(new Proxy(Proxy.Type.HTTP, DEAD__HTTP__PROXY_ADDR));
      HTTP__PROXY_LIST.add(new Proxy(Proxy.Type.HTTP, ALIVE_HTTP__PROXY_ADDR));

      SOCKS_PROXY_LIST.add(new Proxy(Proxy.Type.SOCKS, DEAD__SOCKS_PROXY_ADDR));
      SOCKS_PROXY_LIST.add(new Proxy(Proxy.Type.SOCKS, ALIVE_SOCKS_PROXY_ADDR));

      }

      static class MyProxySelector extends ProxySelector
      {
      @Override
      public void connectFailed(URI uri, SocketAddress addr, IOException e)
      {
      System.err.println(uri + ", " + addr + " " + e);
      }

      @Override
      public List<Proxy> select(URI uri)
      {
      if ( uri.getScheme().equals("socket") )
      return SOCKS_PROXY_LIST;
      else
      return HTTP__PROXY_LIST;
      }
      }

      public static void testProxyAlive()
      {
      InetSocketAddress[] addrs = {
      DEAD__HTTP__PROXY_ADDR, ALIVE_HTTP__PROXY_ADDR, DEAD__SOCKS_PROXY_ADDR, ALIVE_SOCKS_PROXY_ADDR
      };

      for ( InetSocketAddress addr : addrs )
      {
      System.err.println("Connecting to " + addr + "...");
      Socket sock = null;
      try
      {
      sock = new Socket(Proxy.NO_PROXY);
      sock.connect(addr);
      System.err.println("\t proxy is alive.");
      }
      catch (Exception e)
      {
      System.err.println("\t proxy is dead. (" + e + ")");
      }
      finally
      {
      if ( sock != null ) try { sock.close(); } catch (Exception e) {}
      }
      }
      }

      public static void testHttp() throws IOException
      {
      URL url = new URL("http://www.oracle.com/index.html");
      ByteArrayOutputStream os = new ByteArrayOutputStream();
      InputStream is = null;

      try
      {
      is = (InputStream)url.getContent();
      byte[] buf = new byte[1024];
      for ( int nRead = 0 ; (nRead = is.read(buf)) != -1 ; )
      {
      os.write(buf, 0, nRead);
      }
      }
      finally
      {
      if ( is != null )
      is.close();
      }

      FileOutputStream fos = new FileOutputStream("index.http.html");
      fos.write(os.toByteArray());
      fos.close();
      }

      public static void testSocks() throws IOException
      {
      Socket sock = null;
      InputStream is = null;
      ByteArrayOutputStream os = new ByteArrayOutputStream();

      try
      {
      sock = new Socket();
      sock.connect(new InetSocketAddress("www.oracle.com", 80));
      sock.getOutputStream().write("GET /index.html HTTP/1.0\r\nHost: www.oracle.com\r\nUser-Agent: Mozilla/1.0\r\n\r\n".getBytes());
      sock.getOutputStream().flush();
      is = sock.getInputStream();
      byte[] buf = new byte[1024];
      for ( int nRead = 0 ; (nRead = is.read(buf)) != -1 ; )
      {
      os.write(buf, 0, nRead);
      }
      }
      finally
      {
      if ( is != null )
      is.close();
      if ( sock != null )
      sock.close();
      }

      FileOutputStream fos = new FileOutputStream("index.socks.html");
      fos.write(os.toByteArray());
      fos.close();
      }

      public static void main(String[] args)
      {
      System.err.println("* Test for Proxy Alive...");

      testProxyAlive();

      System.err.println();

      ProxySelector.setDefault(new MyProxySelector());

      try
      {
      System.err.println("* Test for HTTP Proxy...");
      testHttp();
      System.err.println("Success");
      }
      catch (Exception e)
      {
      e.printStackTrace();
      }

      System.err.println();

      try
      {
      System.err.println("* Test for SOCKS Proxy...");
      testSocks();
      System.err.println("Success");
      }
      catch (Exception e)
      {
      e.printStackTrace();
      }
      }
      }

      ---------- END SOURCE ----------

      SUPPORT :
      YES

            Assignee:
            Image Unassigned
            Reporter:
            Image Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Imported:
              Indexed: