我正在使用通过宁静的xml界面与iphone应用程序通信的rails应用程序。自从他发送各种媒体以来,iphone应用程序开发人员想要抓住他的请求。我认为heroku会自动处理gzip压缩请求(http://adam.heroku.com/past/2009/4/22/gzip_makes_a_happy_web/)但它似乎并没有:我收到大量乱码文本我不知道如何处理。
我需要设置我的heroku应用程序来处理这个设置吗?或者他(iphone dev)需要发送的特定标题,并告诉heroku如何处理它?</ p>
有点卡住,任何建议都表示赞赏! 谢谢,最大
答案 0 :(得分:5)
我使用this gist中描述的方法透明地解压缩gzip压缩请求主体。 Rails的重要部分是在ActionDispatch::ParamsParser
之前插入它。在config/environments/development.rb
或config/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
的例子