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

Java 将请求从服务器传递到客户端,java,http,Java,Http,我需要将响应从服务器传递到clinet(a'la proxy): private void pushProxyToClient(HttpExchange、HttpExchange、HttpURLConnection连接)引发IOException异常{ //传递标题 Headers respHeaders=httpExchange.getResponseHeaders(); Map headers=connection.getHeaderFields(); for(字符串键:headers.ke

我需要将响应从服务器传递到clinet(a'la proxy):

private void pushProxyToClient(HttpExchange、HttpExchange、HttpURLConnection连接)引发IOException异常{
//传递标题
Headers respHeaders=httpExchange.getResponseHeaders();
Map headers=connection.getHeaderFields();
for(字符串键:headers.keySet()){
if(key==null){
继续;
}
列表值=headers.get(键);
respHeader.put(键、值);
}
httpExchange.sendResponseHeaders(connection.getResponseCode(),connection.getContentLength());
//通行证主体
InputStreamReader isr=新的InputStreamReader(connection.getInputStream());
OutputStreamWriter isw=新的OutputStreamWriter(httpExchange.getResponseBody());
长计数=0;
while(count
不幸的是,客户端(firefox)尝试将响应下载为文件,而不是将其呈现为html。我做错了什么

更新 它现在可以工作了(sendResponseHeaders调用得太早),但现在我(从浏览器)得到错误,它无法解压缩正文

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

内容正文为空。为什么?

更新2
它几乎起作用了。问题是InputStreamWriter。将其更改为
InputStream
的读取帮助。无论如何。。。有些页面将其内容呈现两次。。不知道为什么。

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

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);
}
编辑::


不,没用。问题是<代码>httpExchange.sendResponseHeaders(connection.getResponseCode(),connection.getContentLength())-太早了!不幸的是,浏览器说请求正文的压缩是未知的。请看标题和内容,而不是浏览器所说的。在linux下,您可以在浏览器中尝试www-perl:GET-Ssed或developer工具。
Headers headers = httpExchange.getResponseHeaders();
for (String value: values) {
    headers.add(key, value);
}
Headers headers = httpExchange.getResponseHeaders();
headers.put(key, values);