繁体   English   中英

代理服务器-编码错误

[英]Proxy server - wrong encoding

我正在尝试编写简单的代理服务器(处理GET请求)。 我写了以下代码:

public void handle(Socket socket) throws IOException, URISyntaxException {

    /* CLIENT -> SERVER */
    Scanner clientInputScanner = new Scanner(socket.getInputStream());

    List<String> clientHeaders = new ArrayList<String>();

    String line;
    String targetUrl = null;

    boolean firstLine = true;

    while ((line = clientInputScanner.nextLine()) != null) {

        if (line.length() <= 0) {
            break;
        }

        if (firstLine) {

            String[] tokens = line.split(" ");
            targetUrl = tokens[1];

            line = tokens[0] + " " + this.extractPath(tokens[1]) + " " + tokens[2];

            firstLine = false;
        }

        clientHeaders.add(line);
    }


    Socket server = new Socket(this.extractHostName(targetUrl), 80);
    PrintWriter serverPrint = new PrintWriter(server.getOutputStream());

    for (String header: clientHeaders) {
        serverPrint.println(header);
    }

    serverPrint.println("");
    serverPrint.flush();

    /* SERVER -> CLIENT */
    Scanner serverScanner = new Scanner(server.getInputStream());
    PrintWriter clientPrinter = new PrintWriter(socket.getOutputStream());

    List<String> serverHeaders = new ArrayList<String>();
    int serverContentLength = 0;

    while ((line = serverScanner.nextLine()) != null) {

        if (line.length() <= 0) {
            break;
        }

        serverHeaders.add(line);

        if (line.startsWith("Content-Length: ")) {
            // content-length
            int index = line.indexOf(':') + 1;
            String len = line.substring(index).trim();
            serverContentLength = Integer.parseInt(len);
        }
    }

    for (String header: serverHeaders) {
        clientPrinter.println(header);
    }

    clientPrinter.println("");
    clientPrinter.flush();

    if (serverContentLength > 0) {

        InputStream serverReader = server.getInputStream();
        OutputStream clientWriter = socket.getOutputStream();

        byte[] buff = new byte[1024];
        int bytesRead;
        int count = 0;

        while ((bytesRead = serverReader.read(buff)) != -1) {

            if (count == serverContentLength) {
                break;
            }

            clientWriter.write(buff, 0, bytesRead);
            clientWriter.flush();
            count += bytesRead;
        }

        clientWriter.close();
        serverReader.close();
    }

    clientInputScanner.close();
}

问题是编码-webbrowser无法理解正文请求(显示奇怪的字符) 我正在传递原始字节(没有将其解释为字符),所以不知道有什么问题。 Content-Type标头正确传递(具有良好的编码)

注意:这仅仅是POC的代码,我只需要使它工作即可。 所以,代码风格很难看:)

扫描程序将读取整个缓冲区中的数据。 它不会在当前行的末尾停止读取。 因此,扫描程序将已经从您的身体读取了数据-当您执行InputStream serverReader = server.getInputStream();的那一刻InputStream serverReader = server.getInputStream(); ,来自人体的一些(或全部)数据已被扫描仪消耗。

您将必须坚持从套接字读取的一个类,并且由于要读取二进制数据,因此必须是普通的InputStream 无法使用BufferedReaderScanner因为它们将读取行尾以外的缓冲区

您可以在InputStream上实现自己的readLine方法-只要看到行尾时就停止读取,其余数据仍将在那里供您作为主体的一部分使用。

这可能会或可能不会解释奇怪的字符 -我们需要确定您要发送的数据以及如何查看数据才能确定。

暂无
暂无

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

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