Merge remote-tracking branch 'origin/website-move'
[unicorn.git] / t / hijack.ru
blob4adec61bdcf81ac0f70d6487178be4774dd5ae18
1 use Rack::Lint
2 use Rack::ContentLength
3 use Rack::ContentType, "text/plain"
4 class DieIfUsed
5   @@n = 0
6   def each
7     abort "body.each called after response hijack\n"
8   end
10   def close
11     warn "closed DieIfUsed #{@@n += 1}\n"
12   end
13 end
14 run lambda { |env|
15   case env["PATH_INFO"]
16   when "/hijack_req"
17     if env["rack.hijack?"]
18       io = env["rack.hijack"].call
19       if io.respond_to?(:read_nonblock) &&
20          env["rack.hijack_io"].respond_to?(:read_nonblock)
22         # exercise both, since we Rack::Lint may use different objects
23         env["rack.hijack_io"].write("HTTP/1.0 200 OK\r\n\r\n")
24         io.write("request.hijacked")
25         io.close
26         return [ 500, {}, DieIfUsed.new ]
27       end
28     end
29     [ 500, {}, [ "hijack BAD\n" ] ]
30   when "/hijack_res"
31     r = "response.hijacked"
32     [ 200,
33       {
34         "Content-Length" => r.bytesize.to_s,
35         "rack.hijack" => proc do |io|
36           io.write(r)
37           io.close
38         end
39       },
40       DieIfUsed.new
41     ]
42   end