1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
| | #\ -E none
use Rainbows::DevFdResponse
class ClosablePipe < ::IO
attr_accessor :env
def self.new(env)
rv = popen "echo hello", "rb"
rv.env = env
rv
end
def close
return if closed? # idempotent for Ruby 2.3.0 compatibility
super
$stdout.syswrite "path_info=#{@env['PATH_INFO']}\n"
end
end
class ClosableFile < ::File
attr_accessor :env
alias to_path path
def close
super
$stdout.syswrite "path_info=#{@env['PATH_INFO']}\n"
end
end
class Blob
def initialize(env)
@env = env
end
def each(&block)
yield "BLOB\n"
end
def close
$stdout.syswrite "path_info=#{@env['PATH_INFO']}\n"
end
end
run(lambda { |env|
case env["PATH_INFO"]
when %r{\A/pipe/}
[ 200,
[ %w(Content-Length 6), %w(Content-Type text/plain)],
ClosablePipe.new(env)
]
when %r{\A/file/}
f = ClosableFile.open("env.ru", "rb")
f.env = env
[ 200, {
'X-Req-Path' => env["PATH_INFO"],
'Content-Length' => f.stat.size.to_s,
'Content-Type' => 'text/plain' },
f
]
when %r{\A/blob/}
[ 200,
[%w(Content-Length 5), %w(Content-Type text/plain)],
Blob.new(env)
]
else
[ 404, [%w(Content-Length 0), %w(Content-Type text/plain)], [] ]
end
})
|