Я пытаюсь использовать Gnip PowerTrack API, который требует от меня подключения к HTTPS-потоку JSON с базовой аутентификацией. Я чувствую, что это должно быть довольно тривиально, поэтому я надеюсь, что какой-нибудь рубин умнее меня укажет на мою очевидную ошибку.
Вот соответствующие части моего кода Ruby 1.9.3:
require 'eventmachine'
require 'em-http'
require 'json'
usage = "#{$0} "
abort usage unless user = ARGV.shift
abort usage unless password = ARGV.shift
GNIP_STREAMING_URL = 'https://stream.gnip.com:443/foo/bar/prod.json'
http = EM::HttpRequest.new(GNIP_STREAMING_URL)
EventMachine.run do
s = http.get(:head => { 'Authorization' => [user, password], 'accept' => 'application/json', 'Accept-Encoding' => 'gzip,deflate' }, :keepalive => true, :connect_timeout => 0, :inactivity_timeout => 0)
buffer = ""
s.stream do |chunk|
buffer << chunk
while line = buffer.slice!(/.+\r?\n/)
puts JSON.parse(line)
end
end
end
Поток подключается (моя панель управления Gnip сообщает о подключении), но затем просто буферизуется и никогда ничего не выводит. Фактически, кажется, что он никогда не входит в блок s.stream do ..
. Обратите внимание, что это поток в кодировке GZip.
Обратите внимание, что это работает:
curl --compressed -uusername $GNIP_STREAMING_URL
РЕДАКТИРОВАТЬ: Я уверен, что это неявно, но я не могу выдать никаких прав доступа или фактического URL-адреса, поэтому не спрашивайте;)
РЕДАКТИРОВАТЬ # 2 : yajl-ruby, вероятно, сработал бы, если бы я мог выяснить, как кодировать учетные данные для URL-адреса (простая кодировка URL-адреса, похоже, не работает, поскольку я не могу выполнить аутентификацию с помощью Gnip).
РЕДАКТИРОВАТЬ №3: @rweald обнаружил, что em-http не поддерживает потоковую передачу gzip, я создал здесь проблему с GitHub.
РЕДАКТИРОВАТЬ №4: Я раздвоил и исправил это в em-http-request, вы можете указать на мою вилку , если хотите использовать em-http таким образом. Патч был добавлен в репозиторий сопровождающего и будет работать в следующем выпуске.
РЕДАКТИРОВАТЬ №5: Мои исправления были опубликованы в em-http-request 1.0.3, так что это больше не должно быть проблемой.