1 # -*- encoding: binary -*-
3 # TODO: handle large responses without having it all in memory
4 module Rainbows::ReverseProxy::EventMachine
5 class Backend < EM::Connection
6 include Rainbows::ReverseProxy::EvClient # provides receive_data
8 # +addr+ is a packed sockaddr, so it can be either a UNIX or TCP socket
12 @parser = Kcar::Parser.new
13 @response = @body = nil
14 @headers = Rack::Utils::HeaderHash.new
17 # prevents us from sending too much at once and OOM-ing on large uploads
18 def stream_input(input)
19 if buf = input.read(16384)
21 EM.next_tick { stream_input(input) }
27 buf = @input.read(16384, @junk) and return write(buf)
33 @env[AsyncCallback].call(@response || Rainbows::ReverseProxy::E502)
37 UpstreamSocket = Rainbows::ReverseProxy::UpstreamSocket
39 input = prepare_input!(env)
40 io = UpstreamSocket.start(pick_upstream(env))
41 sock = EM.attach(io, Backend, env)
42 sock.send_data(build_headers(env, input))
43 sock.stream_input(input) if input