【问题标题】:Download file in Ruby that redirects to URL with spaces在 Ruby 中下载文件,该文件重定向到带有空格的 URL
【发布时间】:2017-04-27 10:30:49
【问题描述】:

我正在尝试下载一组图像,并提供了它们的 URL。一些 URL 重定向到包含空格的 URL,这会导致 OpenURI 引发错误。

即我收到了重定向到https://www.example.com/upload/comercial (2).jpghttp://www.example.com/upload/comercial%20(2).jpg。这会在负责下载的代码中引发错误:

url = 'http://www.example.com/upload/comercial%20(2).jpg'
download = open(url, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE, allow_redirections: :all})

OpenURI::HTTPError: 302 Redirect (Invalid Location URI)

有没有办法让 OpenURI 理解重定向?

观察: 在对空格进行编码后,OpenURI 可以正确处理生成的重定向 URL,如下所示:

redirected = 'https://www.example.com/upload/comercial (2).jpg'
encoded = URI.escape(redirected) 
# https://www.example.com/upload/comercial%20(2).jpg

download = open(encoded, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE, allow_redirections: :all})
# Success

在使用open() 调用之前,重定向 URL 显然是未知的。

【问题讨论】:

  • @AndreyDeineko 请检查我的编辑 - 重定向 URL 事先未知。问题是如何通过单个 open() 调用下载文件,而不管提供的 URL 重定向与否。
  • FWIW 问题出在这里:github.com/ruby/ruby/blob/… 当 OpenURI 命中重定向时,它会在 URL 上调用 URI.parseURI.parse 遵循 RFC-3986,不允许使用空格。如果你想使用 OpenURI,我想不出比 Sergio 下面的更好的解决方案。

标签: ruby open-uri


【解决方案1】:

您可以做的是手动处理重定向,方法是使用redirect: false 选项并从重定向异常(open-uri 在收到重定向响应时引发并且不允许执行它)中进行救援。然后您对 url 进行编码并重试。像这样的:

begin
  open(uri, redirect: false)
rescue OpenURI::HTTPRedirect => redirect
  uri = redirect.uri # assigned from the "Location" response header
  escaped = URI.escape(redirected) 
  open(escaped, redirect: false)
end

您可以将这个逻辑隐藏在一个方法中,它将对其调用者“一次调用”。抽象是好的。

【讨论】:

  • @JordanRunning: OpenURI::HTTPRedirect 特定错误。在这种情况下,由于redirect: false,它是由 open-uri 本身引发的。可能还有其他 http 错误,不是由重定向引起的。这些情况可能需要不同的处理方式(例如,来自远程服务器的 http 500)
  • @JordanRunning:不,那行代码在这里不起作用。它中止elsewhere
  • 感谢@SergioTulentsev。我可能需要将它放在一个循环中以处理多个重定向,同时限制重定向的数量以避免无限循环。除此之外,我想知道是否有一种解决方案可以避免处理控制流异常。
  • @mrt:使用 open-uri,您无法避免以这种方式使用异常(这就是它的工作原理)。但是您可能对其他库有更好的体验。
  • @mrt: 直接使用 Net::HTTP 可能值得一看,ruby 文档实际上有一个很好的例子,可以毫无例外地进行重定向限制和响应解析:ruby-doc.org/stdlib-2.4.1/libdoc/net/http/rdoc/Net/…跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多