在PUT请求中处理gzipped正文到heroku

时间:2011-06-30 10:41:22

标签: ruby-on-rails ruby ruby-on-rails-3 heroku gzip

我正在使用通过宁静的xml界面与iphone应用程序通信的rails应用程序。自从他发送各种媒体以来,iphone应用程序开发人员想要抓住他的请求。我认为heroku会自动处理gzip压缩请求(http://adam.heroku.com/past/2009/4/22/gzip_makes_a_happy_web/)但它似乎并没有:我收到大量乱码文本我不知道如何处理。

我需要设置我的heroku应用程序来处理这个设置吗?或者他(iphone dev)需要发送的特定标题,并告诉heroku如何处理它?<​​/ p>

有点卡住,任何建议都表示赞赏! 谢谢,最大

2 个答案:

答案 0 :(得分:5)

我使用this gist中描述的方法透明地解压缩gzip压缩请求主体。 Rails的重要部分是在ActionDispatch::ParamsParser之前插入它。在config/environments/development.rbconfig/environments/production.rb

config.middleware.insert_before ActionDispatch::ParamsParser, "CompressedRequests"

将要点的内容放在lib/middleware/compressed_requests.rb的文件中,并确保将lib/middleware/添加到config/application.rb中的自动加载路径中:

config.autoload_paths += %W(#{config.root}/lib #{config.root}/lib/middleware)

使用此应用程序永远不会知道请求是gzip压缩的,它应该独立于任何支持机架的Web服务器。我已经将它与webrick和thin一起使用,没有任何问题。

编辑:使用gzip压缩请求正文的任何​​HTTP请求都应设置HTTP标头Content-Encoding: gzip。以下是curl的示例测试:

gzip my_file.txt
curl --header 'Content-Encoding: gzip' --data-binary @my_file.txt.gz http://example.com/path

答案 1 :(得分:1)

从您发布的链接:

  

部署到Heroku的所有应用都会自动压缩提供

的网页

在你的情况下,他们请求正文被gzip压缩,这不会被任何网络服务器自动处理,你需要在你的代码中夸大那个乱码字符串以获取正文:

def inflate(body)
  zstream = Zlib::Inflate.new
  buf = zstream.inflate(body)
  zstream.finish
  zstream.close
  buf # inflated body returned
end

(取自How to decompress Gzip string in ruby?

的例子