删除“TooLongFrameException”限制(http)

时间:2018-04-26 13:19:46

标签: selenium http netty browsermob-proxy

我正在使用selenium和browsermob-proxy,最终由“netty-all”驱动,以访问一个站点(我的控制之外),它提供了巨大的标头作为其身份验证过程的一部分。代理失败并出现netty错误:

io.netty.handler.codec.TooLongFrameException: HTTP header is larger than 16384 bytes., version: HTTP/1.1

我需要从我的browsermob-proxy所依赖的netty-all jar中删除所有这些限制,可扩展性,性能和内存保护与此用例无关。

克隆了回购后,我改变了:

  • DEFAULT_MAX_FRAME_SIZE WebSocket00FrameDecoder(io.netty.handler.codec.http.websocketx)

  • HttpObjectDecoder io.netty.handler.codec.http

  • 中的默认构造函数
在适当情况下

Integer.MAX_VALUE

但是,即使使用这些新设置,它仍然会在使用中丢弃“HTTP标头大于16384字节”。

  1. 这个16384限制还能来自哪里?
  2. 如何在保留全部功能的同时将其删除(以可接受的效率/内存使用成本等)

1 个答案:

答案 0 :(得分:0)

到了解决方案,它远非优雅,但它的工作原理 - 我的用例效率低下/容错,所以要小心使用。

  1. 我不会用Maven恶作剧污染这个答案,因为它们并不严格相关,但请注意netty-all默认从Maven仓库中提取所有组件。要更改netty-all内部,您需要生成一个必需组件的jar(在这种情况下为handler.codec.http),然后更改pom.xml以拉入修改后的jar。有几种方法可以做到这一点,唯一适用于我的方法是使用mvn install将jar放在本地.m2 repo中:

    mvn install:install-file -Dfile=netty-codec-http-4.1.25.Final-SNAPSHOT.jar -DgroupId=io.netty -DartifactId=netty-codec-http -Dversion=4.1.25.Final-SNAPSHOT -Dpackaging=jar

    然后构建netty-all以获取最终的jar,然后在您自己的项目中使用它而不是原始的。

  2. 修改了文件以从http操作中删除大小限制:

    • 所有/ pom.xml的
    • 编解码器的http / pom.xml的
    • 编解码器的http / SRC /主/ JAVA / IO /网状/处理/编解码器/ HTTP / HttpObjectDecoder.java
    • 编解码器的http / SRC /主/ JAVA / IO /网状/处理/编解码器/ HTTP / websocketx / WebSocket00FrameDecoder.java
    • 编解码器的http / SRC /测试/ JAVA / IO /网状/处理/编解码器/ HTTP / HttpRequestDecoderTest.java
    • 编解码器的http / SRC /测试/ JAVA / IO /网状/处理/编解码器/ HTTP / HttpResponseDecoderTest.java
  3. 除了将各种大小限制设置为Integer.MAX_VALUE之外,我还评论了相关测试,以确保Maven" package"命令成功生成jar。

  4. 此处提供git diff更改:

    https://gist.github.com/granite-zero/723fa55ae628494ff9b833dde1973a00

    您可以将其作为补丁应用于网络提交04fac00c8c98ed26c5a75887c8e7e53b1e1b68d0