如何从简单服务器中生成的HTTP响应中删除Content-length头?

时间:2018-03-16 09:36:31

标签: java server response response-headers http-content-length

以下是我的示例HTTP服务器。我需要删除内容长度:'响应时生成的标头。我尝试了很多方法而没有成功。有没有办法从服务器响应中删除内容长度?

public class SimpleHttpServer {

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(9000), 0);
        server.createContext("/test", new TestHandler());
        server.setExecutor(null); // creates a default executor
        server.start();
    }

    static class TestHandler implements HttpHandler {
        public void handle(HttpExchange t) throws IOException {
            byte[] response = "Welcome to Test Server..!!\n".getBytes();
            t.sendResponseHeaders(200, response.length);
            OutputStream os = t.getResponseBody();
            os.write(response);
            os.close();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

解决方法可能是:

t.sendResponseHeaders(200, 0);

请注意

  

如果响应长度参数为0,则使用分块传输编码,并且可以发送任意数量的数据

答案 1 :(得分:0)

您必须在sendResponseHeaders的{​​{3}}中指定的响应长度中发送0:

  

responseLength - if> 0,指定固定的响应体长度,并且必须将精确的字节数写入从getResponseBody()获取的流,否则如果等于0,则使用分块编码,并且可以写入任意数量的字节。 if< = -1,则不指定响应体长度,也不能写入响应体。

t.sendResponseHeaders(200, 0);

这意味着它不会向浏览器发送响应的长度,也不会发送Content-Length标头而是发送响应为javadoc,如您所示,这是一个测试,它可能没问题

  

Chunked transfer encoding是超文本传输​​协议(HTTP)1.1版中提供的流数据传输机制。在分块传输编码中,数据流被分成一系列非重叠的"块"。这些块彼此独立地发送和接收。在任何给定时间,发送方和接收方都不需要了解当前正在处理的块之外的数据流。

答案 2 :(得分:0)

Content-Length header is always set, unless it's 0 or -1;

如果您查看HttpExchange sendResponseHeaders()的来源,您会找到此代码段,其中包含相关逻辑:

正如您在contentLen == 0和!http10时看到的那样,此标头已添加"Transfer-encoding", "chunked"

您可以使用getResponseHeaders()来返回标题的可变地图,以设置任何响应标头, "Date""Transfer-encoding"之外 - 阅读链接的来源代码,看看为什么。

207        if (contentLen == 0) {
208            if (http10) {
209                o.setWrappedStream (new UndefLengthOutputStream (this, ros));
210                close = true;
211            } else {
212                rspHdrs.set ("Transfer-encoding", "chunked");
213                o.setWrappedStream (new ChunkedOutputStream (this, ros));
214            }
215        } else {
216            if (contentLen == -1) {
217                noContentToSend = true;
218                contentLen = 0;
219            }
220            /* content len might already be set, eg to implement HEAD resp */
221            if (rspHdrs.getFirst ("Content-length") == null) {
222                rspHdrs.set ("Content-length", Long.toString(contentLen));
223            }
224            o.setWrappedStream (new FixedLengthOutputStream (this, ros, contentLen));
225        }

如果您需要更多灵活性,则需要使用其他构造,而不是普通HttpExchange。类具有约束,默认行为并以某种方式构建。