0

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

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

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

克隆了 repo 后,我改变了:

  • DEFAULT_MAX_FRAME_SIZEWebSocket00FrameDecoder(io.netty.handler.codec.http.websocketx)

  • HttpObjectDecoder默认构造函数在io.netty.handler.codec.http

Integer.MAX_VALUE适当的地方。

然而,即使有了这些新设置,它仍在使用中不断抛出“HTTP 标头大于 16384 字节”。

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

1 回答 1

0

到达解决方案,它远非优雅,但它有效 - 我的用例效率低/容错,因此请谨慎使用。

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

    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,然后在您自己的项目中使用它而不是原始 jar。

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

    • 全部/pom.xml
    • 编解码器-http/pom.xml
    • 编解码器-http/src/main/java/io/netty/handler/codec/http/HttpObjectDecoder.java
    • 编解码器-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameDecoder.java
    • 编解码器-http/src/test/java/io/netty/handler/codec/http/HttpRequestDecoderTest.java
    • 编解码器-http/src/test/java/io/netty/handler/codec/http/HttpResponseDecoderTest.java
  3. 除了对 Integer.MAX_VALUE 设置各种大小限制之外,我还注释掉了相关测试以确保 Maven “package”命令成功生成 jar。

  4. 此处提供git diff了更改:

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

    您可以将其作为补丁应用到 netty commit 04fac00c8c98ed26c5a75887c8e7e53b1e1b68d0

于 2018-04-26T22:39:59.783 回答