Ruby on rails 处理gzipped body向heroku发出的PUT请求

Ruby on rails 处理gzipped body向heroku发出的PUT请求,ruby-on-rails,ruby,ruby-on-rails-3,heroku,gzip,Ruby On Rails,Ruby,Ruby On Rails 3,Heroku,Gzip,我正在开发一个rails应用程序,它通过RESTfulXML接口与iphone应用程序进行通信。iphone应用程序开发人员希望gzip处理他的请求,因为他正在发送各种媒体。我以为heroku会自动处理Gzip请求(http://adam.heroku.com/past/2009/4/22/gzip_makes_a_happy_web/)但事实似乎并非如此:我收到了一大堆乱七八糟的文本,我不知道如何处理这些文本 我是否需要为heroku应用程序设置一个设置来处理此问题?或者他(iphone开发人

我正在开发一个rails应用程序,它通过RESTfulXML接口与iphone应用程序进行通信。iphone应用程序开发人员希望gzip处理他的请求,因为他正在发送各种媒体。我以为heroku会自动处理Gzip请求(http://adam.heroku.com/past/2009/4/22/gzip_makes_a_happy_web/)但事实似乎并非如此:我收到了一大堆乱七八糟的文本,我不知道如何处理这些文本

我是否需要为heroku应用程序设置一个设置来处理此问题?或者他(iphone开发人员)需要发送一个特定的标题和请求,告诉heroku如何处理它

有点卡住了,谢谢你的建议!
谢谢,max,来自您发布的链接:

部署到Heroku的所有应用程序都会自动压缩它们提供的页面

在您的情况下,他们请求的主体是gzip,这不是由任何Web服务器自动处理的,您将需要在代码中放大该乱码字符串以获得主体:

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

(示例取自)

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

config.middleware.insert_before ActionDispatch::ParamsParser, "CompressedRequests"
config.autoload_paths += %W(#{config.root}/lib #{config.root}/lib/middleware)
将gist的内容放入文件
lib/middleware/compressed_requests.rb
,并确保将
lib/middleware/
添加到
config/application.rb
中的自动加载路径:

config.middleware.insert_before ActionDispatch::ParamsParser, "CompressedRequests"
config.autoload_paths += %W(#{config.root}/lib #{config.root}/lib/middleware)
使用此选项,您的应用程序将永远不会知道该请求是gzip发出的,并且它应该独立于任何支持机架的Web服务器。我对webrick和thin都使用过,没有任何问题

编辑:任何使用gzip请求体的HTTP请求都应该设置HTTP头
内容编码:gzip
。下面是一个带有curl的示例测试:

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

感谢道格拉斯-我不知道如何使用它:我尝试将request.body传递给它,但从
buf=zstream.inflate(body)
行返回
TypeError(无法将StringIO转换为字符串)
。我将其打包成一个方便的railtie gem,您可以将其添加到rails应用程序中,它将自动处理此问题。杰出的谢谢你的包装。