3

我有一个 Play v1.2.5 应用程序,我已将其配置为依赖于Github 发布二进制文件。为了支持这一点,我在 dependencies.yml 文件中创建了一个自定义存储库,如下所示:

    - github:
       type: http 
       artifact: "https://github.com/[organisation]/[module]/releases/download/[revision]/[module]-[revision].zip"
       contains: 
           - tazmaniax -> *

这可以正常工作,并且 Ivy 能够构建正确的 URL,但在获取二进制资源时出现问题,因为 Github 重定向到 AWS S3 并在此过程中将协议从 https 更改为 http。显然,Ivy 使用的默认 Java HttpUrlConnection 将遵循重定向,只要协议没有更改。所以我正在寻找如何解决这个问题。

Play v1.2.5 在幕后使用 Ivy v2.2.0。Ivy 使用类 URLHandlerRegistry 来决定是使用 HttpUrlConnection 还是使用 Apache HttpClient v3.x(如果它存在于类路径中)。HttpClient v3.x 可能会导航使用不同协议的重定向,但无论如何默认框架库不包含 HttpClient v3.x,我试图避免自定义 Play,因为我需要将其部署到 Heroku。

最终这是一个 Ivy 问题(或 Github,取决于您的观点),因此从长远来看,选项是:

  1. 修补 org.apache.ivy.util.url.BasicURLHandler 以支持根据使用 Java 从 Github 下载二进制文件处理带有协议更改的重定向,然后在未来的 Play 版本中获取 Ivy 的更新版本。
  2. 修补 org.apache.ivy.util.url.URLHandlerRegistry 以加载更新版本的 Apache HttpClient,例如 v4.2,并确保 HttpClient 库与补丁一起包含在未来的 Play 版本中。但是,看起来 HttpClient v4.2 的早期版本本身也存在从 https 到 http 的重定向问题,HTTPClient 无法在 https 和 http 之间建立路由
  3. 在这种情况下,让 Github 更改其重定向策略以保持相同的协议 https。

谁能建议最好的行动方案是什么?谢谢

== 2013 年 9 月 6 日更新 ==

重定向协议的更改已由 github 解决,现在重定向保留了对 AWS S3 的请求的“https”协议。但是,现在当依赖关系得到解决时,重定向时会返回 403,从似乎缺少 AWS S3 身份验证所需的 cookie 中返回 - 我猜 Ivy 使用 HttpUrlConnection 的另一个问题,上述选项仍然主要相关,除了重点是添加缺少的 cookie 支持。

== 2014 年 10 月 18 日更新 ==

我尝试play deps . --sync -Djsse.enableSNIExtension=false按照建议运行,但问题仍然存在。相关的响应标头是:

Date:Sat, 18 Oct 2014 09:56:33 GMT
Location:https://s3.amazonaws.com/github-cloud/releases/25392769/2302c572-56ac-11e4-9623-393cafb2c0e5.zip?response-content-disposition=attachment%3B%20filename%3Dplay-markdown-1.9.zip&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1413626253&Signature=7gI7fe0CeCzuu73KmcklIVSVPSQ%3D
Server:GitHub.com
Set-Cookie:user_session=692wy9ubPTtFAGT-WGjwFdykXc06-SELUtGGhg3i56vyT0SEVEI5UVnhkDsdQigEQagDUq54dyjTSEUW; path=/; expires=Sat, 01-Nov-2014 09:56:33 GMT; secure; HttpOnly
Set-Cookie:_gh_sess=eyJsYXN0X3dyaXRlIjoxNDEzNjI1ODE1MzkwLCJzZXNzaW9uX2lkIjoiYzFmNzQ0NDRlNmMzYjAwZTE2ZDg4MzVhMDJjNmVhZmMiLCJzcHlfcmVwbyI6InRhem1hbmlheC9wbGF5LW1hcmtkb3duIiwic3B5X3JlcG9fYXQiOjE0MTM2MjYxOTMsInJlZmVycmFsX2NvZGUiOiJodHRwczovL2dpdGh1Yi5jb20vaXZheW5iZXJnL3NlbGVjdDIvY29tbWl0cy9tYXN0ZXIiLCJjb250ZXh0IjoiLyJ9--8c45e0231ec4859b693de524e966cbc4a6582442; path=/; secure; HttpOnly
Status:302 Found
Strict-Transport-Security:max-age=31536000; includeSubdomains; preload

我确信问题在于 Ivy(或 Ivy 调用的相关 HTTP 库)没有在 302 上设置 cookie,然后在没有这些 cookie 参数的情况下跟随位置,403 失败。

4

1 回答 1

1

我有一个类似的问题,通过禁用重定向失败的 Java HttpUrlConnection所做的一些检查来解决。您可以按照此处-Djsse.enableSNIExtension=false的 建议尝试使用该标志

于 2014-03-25T10:30:53.973 回答