2

代码

public HttpRequest(BufferedReader from) {
String firstLine = "";

try {
    firstLine = from.readLine();
} catch (IOException e) {
    System.out.println("Error reading request line: " + e);
}

String[] tmp = firstLine.split(" ");
method = tmp[0];
URI = tmp[1];
version = tmp[2];
System.out.println("URI is: " + URI);

if(method.equals("POST")){
    try {
        String line = from.readLine();
        while (line.length() != 0) {
            headers += line + CRLF;
            if (line.startsWith("Host:")) {
                tmp = line.split(" ");
                if (tmp[1].indexOf(':') > 0) {
                    String[] tmp2 = tmp[1].split(":");
                    host = tmp2[0];
                    port = Integer.parseInt(tmp2[1]);
                } else {
                    host = tmp[1];
                    port = HTTP_PORT;
                }
            }
            line = from.readLine();
        }
        headers += "Connection: close" + CRLF;
        headers += CRLF;
    } 
    catch (IOException e) {
        System.out.println("Error reading from socket: " + e);
        return;
    }       
}
else {
    System.out.println("Error: Method not supported");
    return;
}

System.out.println("Host to contact is: " + host + " at port " + port); 
    }

问题

我正在使用 Java 制作代理服务器。

上面的代码处理一个 HTTP POST 请求。它成功读取了 POST 标头并在命令提示符下打印它,但正文丢失了。

你能看看我的代码,看看问题吗?谢谢。

(注意:我排除了 GET 部分,因为它没有问题。)

结果

结果

结果

4

2 回答 2

2

问题是您仍然需要在 InputStream 上阅读内容。这就是为什么当您关闭浏览器时,没有其他内容可读取,因此会打印出来。您必须准确读取“Content-Length”中声明的字节数

尝试这样的事情:

int cL = Integer.valueOf(contentLength);
byte[]  buffer      = new byte[cL];
String  postData    = "";

System.out.println("Reading "+ cL + "bytes");
in.read(buffer, 0, cL);
postData = new String(buffer, 0, buffer.length);
System.out.println(postData);

正文请求将在 postData 字符串中。

于 2013-05-27T21:19:32.913 回答
0

这不是如何编写代理服务器。代理服务器只需执行以下操作:

  1. 接受传入连接。对于每个连接:
  2. 读取 HTTP CONNECT 请求。
  3. 连接到 CONNECT 请求中指定的目标主机并向客户端发送适当的响应。
  4. 如果连接成功,则在上游服务器和下游客户端之间同时在两个方向上复制字节。
  5. 当您在一个方向读取 EOS 时,关闭相反的插座以进行输出。
  6. 当您在两个方向都关闭时,关闭两个套接字。

就是这样。不需要解析 POST 请求或其他任何内容。甚至不是读者。

于 2012-10-04T07:37:33.233 回答