diff options
author | Eric Wong <normalperson@yhbt.net> | 2013-02-08 22:45:20 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2013-02-11 01:57:05 +0000 |
commit | e166cfe5e8d648b544b1291ec157bd234a425e21 (patch) | |
tree | 8ac56aadc51d81d4d250cfec696446f19ffd1d64 /t/hijack.ru | |
parent | e6faf9e26bcb172026a4984ecadbaa8b6789bcb7 (diff) | |
download | rainbows-e166cfe5e8d648b544b1291ec157bd234a425e21.tar.gz |
This requires Rack 1.5.x and unicorn 4.6.0 for hijacking support. Older versions of Rack continue to work fine, but we must use unicorn 4.6.0 features to support this.
Diffstat (limited to 't/hijack.ru')
-rw-r--r-- | t/hijack.ru | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/t/hijack.ru b/t/hijack.ru new file mode 100644 index 0000000..64c23d7 --- /dev/null +++ b/t/hijack.ru @@ -0,0 +1,56 @@ +use Rack::Lint +use Rack::ContentLength +use Rack::ContentType, "text/plain" +class DieIfUsed + def each + abort "body.each called after response hijack\n" + end + + def close + abort "body.close called after response hijack\n" + end +end +def lazy_close(io) + thr = Thread.new do + # wait and see if Rainbows! accidentally closes us + sleep((ENV["DELAY"] || 10).to_i) + begin + io.close + rescue => e + warn "E: #{e.message} (#{e.class})" + exit!(3) + end + end + at_exit { thr.join } +end + +run lambda { |env| + case env["PATH_INFO"] + when "/hijack_req" + if env["rack.hijack?"] + io = env["rack.hijack"].call + if io.respond_to?(:read_nonblock) && + env["rack.hijack_io"].respond_to?(:read_nonblock) + + # exercise both, since we Rack::Lint may use different objects + env["rack.hijack_io"].write("HTTP/1.0 200 OK\r\n\r\n") + io.write("request.hijacked") + lazy_close(io) + return [ 500, {}, DieIfUsed.new ] + end + end + [ 500, {}, [ "hijack BAD\n" ] ] + when "/hijack_res" + r = "response.hijacked" + [ 200, + { + "Content-Length" => r.bytesize.to_s, + "rack.hijack" => proc do |io| + io.write(r) + lazy_close(io) + end + }, + DieIfUsed.new + ] + end +} |