2011-06-30 6 views
3

私は安らかなxmlインターフェイスを介してiPhoneアプリと通信するレールアプリに取り組んでいます。 iPhoneアプリのデベロッパーは、さまざまなメディアを送っているので、彼のリクエストのボディをgzipしたいと思っています。私はherokuがgzippedリクエスト(http://adam.heroku.com/past/2009/4/22/gzip_makes_a_happy_web/)を自動的に処理すると思ったが、それはそうではないようだ。どのように対処するか分からない。herokuへのPUTリクエストでgzippedボディを扱う

これに対処するために私の英雄アプリで設定する必要がある設定はありますか?または彼(iphoneの開発者)はherokuに対処する方法を伝えるために彼の要求と一緒に送る必要がある特定のヘッダー?

ビットがスタックされている、何かアドバイスをいただきありがとうございます! おかげで、あなたは投稿のリンクから最大

答えて

1

Herokuのにデプロイされたすべてのアプリが自動的にされていない、彼らは体がgzip圧縮されている要求するあなたのケースでは

を果たすページを圧縮します自動的にどのWebサーバーでも処理される場合は、コードにその文字化けした文字列を入れて本文を取得する必要があります:

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?から採取した例)

+0

おかげダグラスは - でも、私は、これを使用するかどうかはわかりません。私は(にたStringIOを変換することはできませんそれに至るまでrequest.bodyを渡ししようとしたと 'TypeError例外を得ましたString) 'を' buf = zstream.inflate(body) '行から削除します。 –

5

Iは透過gzip圧縮されたリクエスト本体を解凍するthis gistに記載の方法を使用しました。 Railsの重要な部分は、ActionDispatch::ParamsParserの前に挿入することでした。 config/environments/development.rbでまたはconfig/environments/production.rb

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

場所lib/middleware/compressed_requests.rbでファイルへの要旨の内容とはconfig/application.rbに自動ロードパスにlib/middleware/を追加してください:

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

知っていることはありません。このアプリケーションを使用しますリクエストはgzipされ、ラック対応のWebサーバーとは独立している必要があります。 webrickとthinの両方で問題なく使用しました。

EDIT:gzippedリクエストボディを使用するすべてのHTTPリクエストは、HTTPヘッダーContent-Encoding: gzipを設定する必要があります。ここでは、カールとサンプルテストです:

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

これをあなたのレールアプリに追加できる便利なレールティームの宝石にまとめました。これは自動的にこれを処理します。 https://rubygems.org/gems/degzipper – andrhamm

+0

優秀!それを包装していただきありがとうございます。 – adamlamar

関連する問題