如何从简单服务器中生成的HTTP响应中删除内容长度标头?



以下是我的示例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();
}
}
}

解决方法可能是:

t.sendResponseHeaders(200, 0);

请注意,

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

您必须在响应长度中发送 0,如 javadoc 中为sendResponseHeaders指定的那样:

responseLength - 如果> 0,则指定固定的响应正文长度,

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

t.sendResponseHeaders(200, 0);

这意味着它不会向浏览器发送响应的长度,也不会发送 Content-Length 标头,而是将响应作为分块编码发送,正如您指示这是用于测试的那样,它可能没问题。

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

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。类带有约束、默认行为并以某种方式构建。

最新更新