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
| | # -*- encoding: binary -*-
# :enddoc:
class Rainbows::Revactor::Client
autoload :TeeSocket, 'rainbows/revactor/client/tee_socket'
RD_ARGS = {}
Rainbows.server.keepalive_timeout > 0 and
RD_ARGS[:timeout] = Rainbows.server.keepalive_timeout
attr_reader :kgio_addr
def initialize(client)
@client, @rd_args, @ts = client, [ nil ], nil
io = client.instance_variable_get(:@_io)
io.close_on_exec = true
@kgio_addr = if Revactor::TCP::Socket === client
@rd_args << RD_ARGS
client.remote_addr
else
Kgio::LOCALHOST
end
end
def kgio_read!(nr, buf)
buf.replace(@client.read)
end
def write(buf)
@client.write(buf)
end
def timed_read(buf2)
buf2.replace(@client.read(*@rd_args))
end
def set_input(env, hp)
env[RACK_INPUT] = 0 == hp.content_length ?
NULL_IO : IC.new(@ts = TeeSocket.new(@client), hp)
end
def to_io
@client.instance_variable_get(:@_io)
end
def close
@client.close
@client = nil
end
def closed?
@client.nil?
end
def self.setup
self.const_set(:IC, Unicorn::HttpRequest.input_class)
include Rainbows::ProcessClient
include Methods
end
end
require 'rainbows/revactor/client/methods'
|