我需要将响应从服务器传递到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 过早调用),但现在我收到错误(来自浏览器)它无法解压缩身体。
您尝试查看的页面无法显示,因为它使用的是无效或不受支持的压缩形式。
内容正文为空。为什么呢?
它几乎可以工作。问题是 InputStreamWriter 。将其更改为InputStream
的阅读帮助。任何方式...一些页面呈现其内容两次..不知道为什么。
答案 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);