Using Proxy

Using Proxy

import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;

import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ProxyDemo
{
    // Set to true if you want to see verbose output.
    private final static boolean bDebug = false;

    /**
    * This function makes an HTTP GET request of the specified URL using a proxy if provided.
    * If successfully, the HTTP response headers are printed out.
    * If the MIME type of the response is text/html, then the number of lines of text
    * is printed as well.
    *
    * @param strURL - A string representing the URL to request, eg, "http://bdn.borland.com/"
    * @param strProxy - A string representing either the IP address or host name of the proxy server.
    * @param iProxyPort - An integer that indicates the proxy port or -1 to indicate the default port for the protocol.
    * @return rc is true if the request succeeded and false otherwise.
    */
    static boolean doURLRequest(String strURL, String strProxy, int iProxyPort)
    {
        boolean rc = false;

        URL url = null;
        URLConnection c = null;

        try
        {
            System.out.println("\nHTTP Request: " + strURL);

            URL urlOriginal = new URL(strURL);

            if ((null != strProxy) && (0 < strProxy.length()))
            {
                URL urlProxy = new URL(urlOriginal.getProtocol(),
                strProxy,
                iProxyPort,// A value of -1 means use the default port for the specified protocol.
                strURL);// The original URL is passed as "the file on the host".

                System.out.println("Using Proxy: " + strProxy);
                if (-1 != iProxyPort)
                {
                    System.out.println("Using Proxy Port: " + iProxyPort);
                }

                url = urlProxy;
            }
            else
            {
                url = urlOriginal;
            }

            c = url.openConnection();

            // In this example, we only consider HTTP connections.
            if (c instanceof HttpURLConnection)// instanceof returns true only if the object is not null.
            {

                HttpURLConnection h = (HttpURLConnection) c;
                h.connect();

                String strStatus = h.getResponseMessage() + " (" + h.getResponseCode() + ")";
                System.out.println("HTTP Status: " + strStatus);

                System.out.println("HTTP Response Headers: ");

                // Evidently, index 0 always returns null, so we start with index 1.
                for (int i = 1; ; i++)
                {
                    String strKey = h.getHeaderFieldKey(i);
                    if (null == strKey)
                    {
                        break;
                    }
                    System.out.println(i + ": " + strKey + ": " + h.getHeaderField(i));
                }

                // Normally at this point, one would download data from the connection.
                // For example, if the MIME type is html, then download the string and display it.
                String strContentType = h.getContentType();
                if ((null != strContentType) && (0 == strContentType.compareTo("text/html")))
                {
                    // Set boolean bDebug to true if you want verbose output.
                    // For simplicity's sake, we just count the number of lines of text.
                    if (bDebug) System.out.println("Received text/html:[");

                        int iNumLines = 0;

                        try
                        {
                            InputStream in = h.getInputStream();
                            BufferedReader data = new BufferedReader(new InputStreamReader(in));

                            String line = null;
                            while((line = data.readLine()) != null)
                            {
                                if (bDebug) System.out.println(line);

                                iNumLines++;
                            }
                        }
                        catch(Exception exc2)
                        {
                            System.out.println("**** IO failure: " + exc2.toString());
                        }
                        finally
                        {
                            if (bDebug) System.out.println("]");
                            System.out.println("Received text/html has " + iNumLines + " lines");
                        }
                }

                h.disconnect();
            }
            else
            {
                System.out.println("**** No download: connection was not HTTP");
            }

            rc = true;
        }
        // Catch all exceptions.
        catch(Exception exc)
        {
            System.out.println("**** Connection failure: " + exc.toString());
            // System.out.println("**** Connection failure: " + exc.getMessage());// Same as above line but without the exception class name.
        }
        finally
        {
            // Do cleanup here.
            // For example, the following, in theory, could make garbage collection more efficient.
            // This might be the place where you choose to put your method call to your connection's "disconnect()";
            // curiously, while every URLConnection has a connect() method, they don't necessarily have a disconnect() method.
            // HttpURLConnection has a disconnect() which is called above.
            c = null;
            url = null;

            return rc;
        }
    }

    public static void main(String[] args)
    {
        // Simple request, not using a proxy server.
        ProxyDemo.doURLRequest("http://www.borland.com/", null, -1);
        ProxyDemo.doURLRequest("http://www.borland.com", null, -1);

        // Request, using a proxy server.
        /**
        * @todo: Note that the proxy indicated below will fail. Change to a valid server.
        * (If you do not have a proxy server available, then search for a web site that
        * lists public HTTP proxy servers.
        * I hesitate to list any here as I'm not sure about the "legitimacy" of all these sites.)
        */
        // *** If you don't change the proxy setting to something valid in the following,
        // then you will get the following error message:
        // **** Connection failure: java.net.BindException: Cannot assign requested address: connect
        ProxyDemo.doURLRequest("http://www.borland.com/", "0.0.0.0", -1); // **** Change this line to use a valid proxy.
    }
}


Written by