Netty TooLongFrameException:如何计算长度?

时间:2016-02-19 09:48:09

标签: java netty vert.x

我有一个测试服务器和一个客户端应用程序。服务器使用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,但我无法理解为什么会出现这种较低值的故障。

1 个答案:

答案 0 :(得分:0)

这可能是Netty的一个错误。请在Netty问题跟踪器中打开错误报告,并提供有关如何重现它的详细信息:

https://github.com/netty/netty/issues