我有一个测试服务器和一个客户端应用程序。服务器使用Vert.x 3.2.1
(用户Netty 4.0.33.Final)和客户端Apache httpclient 4.5.1
构建。
已将服务器配置为接受maxHeaderSize
为8KB。当我从客户端发送请求时,我看到承载标题大小约为3KB的请求开始失败,服务器上出现以下异常。
io.netty.handler.codec.TooLongFrameException:HTTP标头大于8192字节
共享服务器和客户端代码以供参考。
服务器
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
HttpServerOptions options = new HttpServerOptions();
options.setMaxHeaderSize(1024*8);
HttpServer httpServer = (HttpServer) vertx.createHttpServer(options );
httpServer.requestHandler(req -> {
System.out.println(req.headers().names());
for(String h : req.headers().names()){
System.out.println(h+": "+req.headers().get(h).length()+": "+(h.length()+req.headers().get(h).length()));
}
req.response().setStatusCode(200).end();
});
httpServer.listen(6565);
}
客户端:
public static void main(String[] args) {
try {
CloseableHttpClient httpclient = HttpClients.custom().build();
HttpGet get = new HttpGet("http://localhost:6565");
String headerValue = generateHeader(3045);
get.addHeader("myheader", headerValue);
HttpResponse response = httpclient.execute(get);
String resp = IOUtils.toString(response.getEntity().getContent());
System.out.println(response.getStatusLine());
httpclient.close();
} catch (Exception e) {
e.printStackTrace();
}
}
generateHeader()
是一个生成指定长度字符串的方法 - 当输入3时,结果为" aaa"。
Apache http客户端还添加了一些标题 - 主机,连接,用户代理和接受编码。除了所有这些之外,我注意到的行为是当我将3045或更高版本作为输入传递给generateHeader()
时服务器失败,但是成功获得任何更低的值。
虽然配置为8k,但我无法理解为什么会出现这种较低值的故障。
答案 0 :(得分:0)
这可能是Netty的一个错误。请在Netty问题跟踪器中打开错误报告,并提供有关如何重现它的详细信息: