【问题标题】:Java and HttpUnit having GZip bugsJava 和 HttpUnit 存在 GZip 错误
【发布时间】:2012-05-29 19:45:50
【问题描述】:

我已经连续近 6 个小时试图找到解决此问题的方法,但无济于事。
我有一个简单的 HttpUnit 程序,可以登录网站。问题是当我最终提交登录表单时出现此错误:

Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
   at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:223)
   at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:141)
   at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:92)
   at com.meterware.httpunit.WebResponse.readFromStream(WebResponse.java:967)
                         ..and so on..  

在 JDK 管理 gzip 文件的方式中出现 a bug,早在 2002 年就有报道(!)。看来 Java 仍然有这个错误,唯一的解决方法是告诉 HttpUnit 不接受 gzip 编码的数据,如下所示:

WebConversation.getClientProperties().setAcceptGzip(false);

不幸的是,这是我做不到的。要成功登录,我需要启用 gzip,否则我只会被重定向到通用主页(未登录)。
我怀疑完成这项工作的唯一方法是更改​​ HttpUnit 的源代码并在其 gzip 解析中处理 EOF 异常。我迫切需要帮助。有人对此有解决方案吗?

如果没有,您能否推荐一些 Java 中相当简单的 API,例如 HttpUnit,用于填写表单和登录等任务。

【问题讨论】:

    标签: java unit-testing gzip zlib


    【解决方案1】:

    我怀疑完成这项工作的唯一方法是更改​​源 HttpUnit 的代码并在其 gzip 解析中处理 EOF 异常。

    当第三方库中存在错误时,这通常是开发人员的解决方案。如果您知道 HttpUnit 的问题所在,为什么不在本地修复它呢?您甚至可以将修复推送回项目并希望他们采用它。

    如果没有,您能否推荐一些 Java 中相当简单的 API,例如 HttpUnit,用于填写表单和登录等任务。

    如果您的意思是一个遍历网站的库,那么有很多。如果您想要一个“无头”HTTP 客户端,请尝试Apache HttpComponents HttpClient。如果你想要一些真正使用浏览器的东西,试试Selenium

    【讨论】:

    • 我不太确定如何修复它,坦率地说,进入源代码似乎有点可怕。是的,我正在寻找一个无头 HTTP 客户端。感谢您的建议。
    【解决方案2】:

    这个问题似乎在 HttpUnit 1.7 中得到了修复(我使用的是 1.6)。
    无论如何,我正在按照@ShaggyFrog 的建议转向 HttpComponents,因为现在我遇到了更大、未知的 cookie 和会话问题。

    编辑: HttpComponents 似乎过于复杂。在某一时刻,我不得不手动处理 Http 302 重定向。所以我决定转向 HtmlUnit,它与 HttpUnit 极其相似,但没有任何 cookie 或 gzip 问题。像魅力一样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多