Разобраться с трупом в PUT-запросах к героку - PullRequest
3 голосов
/ 30 июня 2011

Я работаю над приложением rails, которое связывается с приложением iphone через спокойный xml-интерфейс. Разработчик приложения для iphone хочет сжать тело своих запросов, так как он отправляет различные медиа. Я думал, что heroku будет автоматически обрабатывать gzip-запросы (http://adam.heroku.com/past/2009/4/22/gzip_makes_a_happy_web/), но, похоже, не получается: я получаю кучу искаженного текста, из-за которого я не знаю, что делать.

Есть ли настройка, которую мне нужно установить с моим приложением heroku, чтобы справиться с этим? Или конкретный заголовок, который он (iphone dev) должен отправить со своими запросами, чтобы сообщить герою, как с этим бороться?

Немного застрял, любой совет приветствуется! спасибо, макс

Ответы [ 2 ]

5 голосов
/ 13 апреля 2012

Я использовал метод, описанный в этой сущности , чтобы прозрачно распаковать сжатые тела запроса.Важной частью Rails было вставить его до ActionDispatch::ParamsParserconfig/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)

При использовании этого приложения ваше приложение никогда не узнает, что запрос был отправлен в архив, и оно должно быть независимым от любого веб-сервера с поддержкой стойки.Я использовал его как с webrick, так и thin без проблем.

EDIT: Любой HTTP-запрос, использующий тело gzipped-запроса, должен установить 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 голос
/ 30 июня 2011

По ссылке, которую вы разместили:

Все приложения, развернутые в Heroku, автоматически сжимают страницы, которые они обслуживают

В вашем случае они запрашивают телоgzipped, который не обрабатывается автоматически каким-либо веб-сервером, вам нужно накачать эту искаженную строку в вашем коде, чтобы получить тело:

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

(пример взят из Как распаковать строку Gzip в ruby)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...