EventMachine Proxy - HTTP Proxy, смешивающий пары запрос / ответ - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть следующий код (просто в качестве теста), и я хочу создать HTTP-прокси с помощью EventMachine.Приведенный ниже код является примером на странице es-proxy GitHub.Однако, когда я запускаю это и открываю веб-сайт с умеренным количеством изображений, изображения начинают загружаться неправильно.Под этим я подразумеваю, что некоторые изображения загружаются дважды или, если я запрашиваю свой значок для панели навигации, вместо этого я получаю изображение профиля.Это особенно очевидно, если я обновлю страницу несколько раз.

Кажется, что ответы не соответствуют соответствующему запросу;в результате чего все перемешано.Однако я не уверен, почему это так.Код ниже кажется достаточно простым, чтобы это не было проблемой.

require 'rubygems'
require 'em-proxy'
require 'http/parser' # gem install http_parser.rb
require 'uuid'        # gem install uuid

# > ruby em-proxy-http.rb
# > curl --proxy localhost:9889 www.google.com

host = "0.0.0.0"
port = 9889
puts "listening on #{host}:#{port}..."

Proxy.start(:host => host, :port => port) do |conn|

  @p = Http::Parser.new
  @p.on_headers_complete = proc do |h|
    session = UUID.generate
    puts "New session: #{session} (#{h.inspect})"

    host, port = h['Host'].split(':')
    conn.server session, :host => host, :port => (port || 80)
    conn.relay_to_servers @buffer

    @buffer = ''
  end

  @buffer = ''

  conn.on_connect do |data,b|
    puts [:on_connect, data, b].inspect
  end

  conn.on_data do |data|
    @buffer << data
    @p << data

    data
  end

  conn.on_response do |backend, resp|
    #puts [:on_response, backend, resp].inspect
    resp
  end

  conn.on_finish do |backend, name|
    puts [:on_finish, name].inspect
  end
end

Обновление

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

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Вот правильный ответ:

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

Это недостаток использования событийного реактора, вы должны убедиться, что ничто не блокирует его.

0 голосов
/ 15 декабря 2011

Код не учитывает постоянные http-соединения.Может быть, вы могли бы попробовать браузер HTTP 1.0.

...