Итак, у меня есть приложение Rack, которое действует как прокси. Я реализовал net / http api, чтобы справиться с коммуникацией, поэтому приложение стойки в основном называет его так:
api.new(request_method, rack_request, options).response
.response возвращает действительный ответ стойки [состояние, заголовки, тело].
Body является экземпляром API, и его реализация выглядит следующим образом (упрощенная версия):
def initialize
...
@proxy_connection = Net::HTTP.start(proxied_uri.host, proxied_uri.port)
@proxy_connection.request(@proxy_request) do |response|
@proxy_response = response
end
end
def each(&block)
@proxy_response.read_body(&block)
end
def to_s
@proxy_response.read_body
end
Приложение стойки может затем вызвать прокси-службу с полным ответом с помощью to_s или в виде потоковой передачи и получить ответ в виде кусков с каждым.
Дело в том, что когда я возвращаю ответ в стойке, я получаю следующую трассировку стека:
https://gist.github.com/1879724
Судя по всему, сервер или стойка вызывают «каждый» более одного раза, но я не уверен, что может быть причиной этого.
Приложение Rack работает под рельсами 3.2.1.