【发布时间】:2013-07-28 08:52:37
【问题描述】:
我有一个 Play v1.2.5 应用程序,我已将其配置为依赖于 Github release binary。为了支持这一点,我在 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,取决于你的观点),所以从长远来看,选项是:
- 修补 org.apache.ivy.util.url.BasicURLHandler 以支持根据 Download binary file from Github using Java 处理带有协议更改的重定向,然后在未来的 Play 版本中包含更新版本的 Ivy。
- 修补 org.apache.ivy.util.url.URLHandlerRegistry 以加载更新版本的 Apache HttpClient,例如v4.2,并确保 HttpClient 库与补丁一起包含在未来的 Play 版本中。但是,看起来 HttpClient v4.2 的早期版本本身也存在从 https 到 http 的重定向问题,HTTPClient unable to establish route between https and http
- 让 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。
【问题讨论】:
-
为什么不下载文件并将其放在您自己的存储库中?
-
@sdespolit,是的,我知道该怎么做,但只是尝试使用提供的依赖机制,如果只有 github 不会与协议混淆,它会更方便并且非常接近工作
-
写一个能处理 https 到 http 切换的代理吧?
-
更新了问题以反映问题现在是关于重定向时缺少 cookie 支持而不是重定向时协议更改
标签: github playframework ivy dependency-management playframework-1.x