【问题标题】:How to work around obsolete networking protocol in ruby 1.8.6如何解决 ruby​​ 1.8.6 中过时的网络协议
【发布时间】:2017-02-08 15:09:16
【问题描述】:

我有很多软件在带有 ruby​​ 1.8.6 的嵌入式系统上运行。一个脚本查询国家气象服务,几天前它停止工作:我开始收到<H1>Access Denied</H1>。这是一个公共接口,没有 API 密钥。

当我在我的开发机器上使用 ruby​​ 1.8.6 运行这个脚本时,我得到了同样的错误。当我使用 ruby​​ 1.9 运行它时,不会发生错误。

显然 NWS 上周以某种方式修改了他们的 HTTP 协议,这与 ruby​​ 1.8.6 中的 Net:HTTP 不兼容

网址是“http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?lat=37&lon=-105&product=time-series&begin=&end=&sky=sky&maxt=maxt&mint=mint&Submit=Submit

当我使用 curl 时,我得到了很好的响应。

代码是: begin xml = Net::HTTP.get_response(URI.parse(url)).body rescue

我有 RestClient 1.6 并尝试用它代替 Net:HTTP 但它只是在内部使用 Net:HTTP 并且我得到一个 403 Forbidden

有人知道协议中可能发生的变化以及解决方法吗?

我认为我可能能够从系统制造商处获得更新的固件,但我不愿走这条路,因为它会强制重写许多相当脆弱的黑客。

【问题讨论】:

  • 作为替代方案,托管您自己的迷你 api,代理您知道可与旧堆栈一起使用的数据
  • 尝试在您的开发机器上进行流量捕获(例如 tcpdump/Wireshark),包括工作和不工作的连接。如果从那里看不出差异,您可以尝试在此处发布 http 请求比较
  • 您介意添加minimal reproducible example 吗?我可以运行一些代码来重现问题吗?
  • @Alien_AV 那是票。 Net:HTTP 1.8.6 不包括 User-Agent 字段。我添加了一个像this 这样的问题。谢谢! (也许您可以发表您的评论作为答案?)

标签: ruby


【解决方案1】:

根据你的抓包分析,问题是1.8.6默认没有添加HTTP User-Agent字段。 添加它的一种方法是:

http = Net::HTTP.new("your.site.com", 80)
req = Net::HTTP::Get.new("/path/to/the/page.html", {'User-Agent' => 'your_agent'})
response = http.request(req)
puts response.body

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2021-06-21
    • 2013-12-14
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多