繁体   English   中英

在代理服务器的 HTTPS 中建立连接时出现问题。(CONNECT 方法)

[英]Problem in establishing connection in HTTPS in proxy server.(CONNECT Method)

我正在开发基于 java 的代理服务器。 对于简单的 http 请求,代理服务器正在工作。 但是对于 HTTPS 连接,连接超时。 这是我所做的步骤。 我首先从输入 stream 中读取一行并创建了一个套接字连接服务器。 之后,我给客户 200 状态。 之后,我在客户端套接字和服务器套接字之间进行异步读写。 但目前这不起作用,连接超时,我无法调试问题。

public class ProxyServer extends Thread {
private String host;
private int port;
private ServerSocket serverSocket;
private InputStream proxyToClientIP;
private OutputStream proxyToClientOP;
private InputStream proxyToServerIP;
private OutputStream proxyToServerOP;
private Socket socket;
private Socket socketFromProxyServer;


ProxyServer(ServerSocket serverSocket, Socket socket) {
    this.serverSocket = serverSocket;
    this.socket = socket;
    this.start();
}

public void run() {
    processInputRequest();
}

public void processInputRequest() {
    try {
        proxyToClientIP = socket.getInputStream();
        proxyToClientOP = socket.getOutputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(proxyToClientIP));
        String hostDetails = reader.readLine();
        System.out.println(hostDetails);
        boolean isConnect = false;
        //Need to parse request and find req type as GET or CONNECT
        //As of now we assume it to be Connect request
        if (!isConnect) {
            processGetRequest();
        } else {
            processConnectRequest();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

public void processConnectRequest() {
    //Need to get host name from request. Currently Hardcoded for developing purpose
    host = "harish-4072";
    port = 8383;
    try {
        socketFromProxyServer = new Socket(host, port);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(proxyToClientOP));
        writer.write("HTTP/1.1 200 Connection established\r\n" + "\r\n");
        writer.flush();
        proxyToServerOP = socketFromProxyServer.getOutputStream();
        proxyToServerIP = socketFromProxyServer.getInputStream();
        proxyRequest();
    } catch (IOException ex) {
        System.out.println(ex);
    }
}




public void proxyRequest() {
    try {
        new Thread() {
            @Override
            public void run() {
                try {
                    byte[] read = new byte[1024];
                    int in;
                    System.out.println("Reading");
                    while ((in = proxyToClientIP.read(read)) != -1) {
                        proxyToServerOP.write(read, 0, in);
                        proxyToServerOP.flush();
                    }
                } catch (SocketException e) {
                    System.out.println(e);
                } catch (IOException ex) {

                }
            }
        }.start();
        byte[] reply = new byte[1024];
        int out;
        System.out.println("Writing");
        while ((out = proxyToServerIP.read(reply)) != -1) {
            proxyToClientOP.write(reply, 0, out);

            proxyToClientOP.flush();
        }
    } catch (IOException ex) {

    }

    public void processGetRequest() {
   //
   }
}

我首先从输入 stream 中读取一行并创建了一个套接字连接服务器。 ...之后我在客户端套接字和服务器套接字之间异步读写。

问题是您只读取一行,而您需要从客户端读取完整的 HTTP 请求 header,即到请求结束之前的所有内容 Z099FB995346F31C749F6E40DB0R \r\n\r\n E)。

因为您没有这样做,所以 HTTP 请求的未读部分被转发到服务器。 但是服务器正在等待 TLS 握手的开始,这些数据使服务器感到困惑。 这可能会导致挂起或中止,具体取决于数据的内容和一种服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM