Проблема в том, что Twitter закрывает одно соединение, когда вы открываете второе. Попробуйте запустить curl <a href="https://USER:PASSWORD@stream.twitter.com/1/statuses/filter.json?track=bar" rel="nofollow">https://USER:PASSWORD@stream.twitter.com/1/statuses/filter.json?track=bar</a>
на двух терминалах одновременно.
Кроме того, пытаясь выяснить, что не так, я провел довольно небольшой рефакторинг для улучшения читабельности:
require 'sinatra'
require 'sinatra/streaming'
require 'eventmachine'
require 'em-http'
require 'json'
enable :logging, :dump_errors, :raise_errors
template(:tweet) { "<p><b><%= @tweet['user']['screen_name'] %></b>: <%= @tweet['text'] %></p>" }
get '/test/:query' do |q|
stream(:keep_open) do |out|
http = EM::HttpRequest.new("https://stream.twitter.com/1/statuses/filter.json?track=#{q}")
EM.next_tick do
s = http.get :head => { 'Authorization' => ENV.values_at('USERNAME', 'PASSWORD') }
s.callback { out.close }
out.callback { s.close }
s.errback { out.close }
out.errback { s.close }
buffer = ""
s.stream do |chunk|
buffer << chunk
while line = buffer.slice!(/.+\r?\n/)
break if out.closed?
@tweet = JSON.parse(line)
out << erb(:tweet) if @tweet.length > 0 and @tweet['user']
end
end
end
end
end