Search in sources :

Example 1 with SelfConnectionProxyData

use of com.trilead.ssh2.SelfConnectionProxyData in project intellij-community by JetBrains.

the class SocketFactory method open.

public static Socket open(final String hostname, final int port, final ProxyData proxyData, final int connectTimeout) throws IOException {
    final Socket sock = new Socket();
    if (proxyData == null) {
        InetAddress addr = TransportManager.createInetAddress(hostname);
        sock.connect(new InetSocketAddress(addr, port), connectTimeout);
        sock.setSoTimeout(0);
        return sock;
    }
    if (proxyData instanceof SelfConnectionProxyData) {
        // already connected
        return ((SelfConnectionProxyData) proxyData).connect();
    }
    if (proxyData instanceof HTTPProxyData) {
        HTTPProxyData pd = (HTTPProxyData) proxyData;
        /* At the moment, we only support HTTP proxies */
        InetAddress addr = TransportManager.createInetAddress(pd.proxyHost);
        sock.connect(new InetSocketAddress(addr, pd.proxyPort), connectTimeout);
        sock.setSoTimeout(0);
        /* OK, now tell the proxy where we actually want to connect to */
        StringBuffer sb = new StringBuffer();
        sb.append("CONNECT ");
        sb.append(hostname);
        sb.append(':');
        sb.append(port);
        sb.append(" HTTP/1.0\r\n");
        if ((pd.proxyUser != null) && (pd.proxyPass != null)) {
            String credentials = pd.proxyUser + ":" + pd.proxyPass;
            char[] encoded = Base64.encode(credentials.getBytes("ISO-8859-1"));
            sb.append("Proxy-Authorization: Basic ");
            sb.append(encoded);
            sb.append("\r\n");
        }
        if (pd.requestHeaderLines != null) {
            for (int i = 0; i < pd.requestHeaderLines.length; i++) {
                if (pd.requestHeaderLines[i] != null) {
                    sb.append(pd.requestHeaderLines[i]);
                    sb.append("\r\n");
                }
            }
        }
        sb.append("\r\n");
        OutputStream out = sock.getOutputStream();
        out.write(sb.toString().getBytes("ISO-8859-1"));
        out.flush();
        /* Now parse the HTTP response */
        byte[] buffer = new byte[1024];
        InputStream in = sock.getInputStream();
        int len = ClientServerHello.readLineRN(in, buffer);
        String httpReponse = new String(buffer, 0, len, "ISO-8859-1");
        if (httpReponse.startsWith("HTTP/") == false)
            throw new IOException("The proxy did not send back a valid HTTP response.");
        if ((httpReponse.length() < 14) || (httpReponse.charAt(8) != ' ') || (httpReponse.charAt(12) != ' '))
            throw new IOException("The proxy did not send back a valid HTTP response.");
        int errorCode = 0;
        try {
            errorCode = Integer.parseInt(httpReponse.substring(9, 12));
        } catch (NumberFormatException ignore) {
            throw new IOException("The proxy did not send back a valid HTTP response.");
        }
        if ((errorCode < 0) || (errorCode > 999))
            throw new IOException("The proxy did not send back a valid HTTP response.");
        if (errorCode != 200) {
            throw new HTTPProxyException(httpReponse.substring(13), errorCode);
        }
        while (true) {
            len = ClientServerHello.readLineRN(in, buffer);
            if (len == 0)
                break;
        }
        return sock;
    }
    throw new IOException("Unsupported ProxyData");
}
Also used : HTTPProxyException(com.trilead.ssh2.HTTPProxyException) InetSocketAddress(java.net.InetSocketAddress) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) IOException(java.io.IOException) SelfConnectionProxyData(com.trilead.ssh2.SelfConnectionProxyData) InetAddress(java.net.InetAddress) HTTPProxyData(com.trilead.ssh2.HTTPProxyData) Socket(java.net.Socket)

Aggregations

HTTPProxyData (com.trilead.ssh2.HTTPProxyData)1 HTTPProxyException (com.trilead.ssh2.HTTPProxyException)1 SelfConnectionProxyData (com.trilead.ssh2.SelfConnectionProxyData)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 OutputStream (java.io.OutputStream)1 InetAddress (java.net.InetAddress)1 InetSocketAddress (java.net.InetSocketAddress)1 Socket (java.net.Socket)1