将请求从服务器传递到客户端

时间:2014-03-14 20:09:27

标签: java http

我需要将响应从服务器传递到clinet(一个' la代理):

 private void pushProxyToClient(HttpExchange httpExchange, HttpURLConnection connection) throws IOException {

            // pass headers
    Headers respHeaders = httpExchange.getResponseHeaders();
    Map<String, List<String>> headers = connection.getHeaderFields();
    for (String key: headers.keySet()) {

        if (key == null){
            continue;
        }

        List<String> values = headers.get(key);

        respHeaders.put(key, values);
    }

    httpExchange.sendResponseHeaders(connection.getResponseCode(), connection.getContentLength());

    // pass body
    InputStreamReader isr = new InputStreamReader(connection.getInputStream());
    OutputStreamWriter isw = new OutputStreamWriter(httpExchange.getResponseBody());

    long count = 0;
    while (count < connection.getContentLengthLong()) {
        isw.write(isr.read());
        count += 1;
    }

  isr.close();
  isw.close();
}

Unfortunatley,客户端(firefox)尝试将响应下载为文件而不是将其呈现为html。我做错了什么?

更新

它现在正在工作( sendResponseHeaders 过早调用),但现在我收到错误(来自浏览器)它无法解压缩身体。

  

您尝试查看的页面无法显示,因为它使用的是无效或不受支持的压缩形式。

内容正文为空。为什么呢?

更新2

它几乎可以工作。问题是 InputStreamWriter 。将其更改为InputStream的阅读帮助。任何方式...一些页面呈现其内容两次..不知道为什么。

1 个答案:

答案 0 :(得分:0)

您是否设置了内容类型?您的内容类型应该相同(例如text / html),而不是像application / octet-stream。硬编码示例:

Headers headers = httpExchange.getResponseHeaders();
headers.add("Content-Type", "text/html");

在您的示例中设置:

httpExchange.setAttribute(key, this.flatRequestValues(values));

而不是headers.add。尝试:

Headers headers = httpExchange.getResponseHeaders();
for (String value: values) {
    headers.add(key, value);
}

编辑:or better

Headers headers = httpExchange.getResponseHeaders();
headers.put(key, values);