bayserver-docker-terminal 2.3.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/baykit/bayserver/docker/terminal/{fully_hijackers_yacht.rb → fully_hijackers_ship.rb} +12 -13
- data/lib/baykit/bayserver/docker/terminal/{hijackers_yacht.rb → hijackers_ship.rb} +21 -17
- data/lib/baykit/bayserver/docker/terminal/terminal_docker.rb +27 -11
- data/lib/baykit/bayserver/docker/terminal/terminal_train.rb +36 -17
- metadata +6 -7
- data/lib/baykit/bayserver/docker/terminal/hijacked_data_sender.rb +0 -170
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d0422892db504256f119338d783f258d696e1cca90fa79a7549ea835f4b21d3
|
4
|
+
data.tar.gz: 6dfeb2da9c9eec3ad56fa74c2b4f109f6e03c0a941a2be89a37a39621ac90282
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea80ce79c1c69923f0b2d3c2c9bbd9a12d9240e91b14489d6072a4f50869ba531713c844a7c60dc79f9aae544f1973d539fe8c0685bb43a75613eb1a2dadaa07
|
7
|
+
data.tar.gz: 2d0df64d8804a2a3efdb393350d662574283c0ea521c5f3584310f4e4c4a5a6a6b4b1fa82eb8f30c0b08dec4b80afec2110e5665f2e2e694823d88b3e68859a1
|
data/lib/baykit/bayserver/docker/terminal/{fully_hijackers_yacht.rb → fully_hijackers_ship.rb}
RENAMED
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'baykit/bayserver/agent/next_socket_action'
|
2
|
-
require 'baykit/bayserver/
|
2
|
+
require 'baykit/bayserver/protocol/package'
|
3
3
|
require 'baykit/bayserver/util/string_util'
|
4
4
|
require 'baykit/bayserver/util/reusable'
|
5
5
|
|
6
|
-
require 'baykit/bayserver/docker/terminal/
|
6
|
+
require 'baykit/bayserver/docker/terminal/hijackers_ship'
|
7
7
|
|
8
8
|
require 'baykit/bayserver/docker/http/h1/h1_command_handler'
|
9
9
|
|
@@ -11,7 +11,7 @@ module Baykit
|
|
11
11
|
module BayServer
|
12
12
|
module Docker
|
13
13
|
module Terminal
|
14
|
-
class
|
14
|
+
class FullyHijackersShip < HijackersShip
|
15
15
|
include Baykit::BayServer::Docker::Http::H1::H1CommandHandler # implements
|
16
16
|
|
17
17
|
include Baykit::BayServer::Util
|
@@ -35,7 +35,7 @@ module Baykit
|
|
35
35
|
# Init method
|
36
36
|
######################################################
|
37
37
|
#
|
38
|
-
def init(tur,
|
38
|
+
def init(tur, rd, tp)
|
39
39
|
super
|
40
40
|
@packet_store = PacketStore.new(tur.ship, H1PacketFactory.new)
|
41
41
|
@command_unpacker = H1CommandUnPacker.new(self, false)
|
@@ -56,7 +56,7 @@ module Baykit
|
|
56
56
|
######################################################
|
57
57
|
|
58
58
|
# Override
|
59
|
-
def notify_read(buf
|
59
|
+
def notify_read(buf)
|
60
60
|
@file_wrote_len += buf.length
|
61
61
|
|
62
62
|
BayLog.debug "#{self} read hijack #{buf.length} bytes: total=#{@file_wrote_len}"
|
@@ -65,7 +65,6 @@ module Baykit
|
|
65
65
|
|
66
66
|
end
|
67
67
|
|
68
|
-
|
69
68
|
######################################################
|
70
69
|
# Implements H1CommandHandler
|
71
70
|
######################################################
|
@@ -76,16 +75,16 @@ module Baykit
|
|
76
75
|
end
|
77
76
|
|
78
77
|
if @state != STATE_READ_HEADER
|
79
|
-
raise ProtocolException("Header command not expected: state=%d", @state)
|
78
|
+
raise ProtocolException.new("Header command not expected: state=%d", @state)
|
80
79
|
end
|
81
80
|
|
82
|
-
if BayServer.harbor.trace_header
|
81
|
+
if BayServer.harbor.trace_header
|
83
82
|
BayLog.info("%s hijack: resStatus: %d", self, cmd.status)
|
84
83
|
end
|
85
84
|
|
86
85
|
cmd.headers.each do |nv|
|
87
86
|
@tour.res.headers.add(nv[0], nv[1])
|
88
|
-
if BayServer.harbor.trace_header
|
87
|
+
if BayServer.harbor.trace_header
|
89
88
|
BayLog.info("%s hijack: resHeader: %s=%s", self, nv[0], nv[1]);
|
90
89
|
end
|
91
90
|
end
|
@@ -103,7 +102,7 @@ module Baykit
|
|
103
102
|
sid = @tour.ship.id()
|
104
103
|
@tour.res.set_consume_listener do |len, resume|
|
105
104
|
if resume
|
106
|
-
@tour.ship.
|
105
|
+
@tour.ship.resume_read(sid)
|
107
106
|
end
|
108
107
|
end
|
109
108
|
end
|
@@ -116,7 +115,7 @@ module Baykit
|
|
116
115
|
raise ProtocolException.new("Content command not expected")
|
117
116
|
end
|
118
117
|
|
119
|
-
available = @tour.res.
|
118
|
+
available = @tour.res.send_res_content(@tour_id, cmd.buf, cmd.start, cmd.len)
|
120
119
|
if @tour.res.bytes_posted == @tour.res.bytes_limit
|
121
120
|
end_res_content(@tour)
|
122
121
|
return NextSocketAction::CONTINUE
|
@@ -132,7 +131,7 @@ module Baykit
|
|
132
131
|
raise Sink.new()
|
133
132
|
end
|
134
133
|
|
135
|
-
def
|
134
|
+
def req_finished()
|
136
135
|
return @state == STATE_FINISHED
|
137
136
|
end
|
138
137
|
|
@@ -140,7 +139,7 @@ module Baykit
|
|
140
139
|
private
|
141
140
|
|
142
141
|
def end_res_content(tur)
|
143
|
-
tur.res.
|
142
|
+
tur.res.end_res_content(Tour::TOUR_ID_NOCHECK)
|
144
143
|
reset()
|
145
144
|
end
|
146
145
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'baykit/bayserver/agent/next_socket_action'
|
2
|
-
require 'baykit/bayserver/watercraft/yacht'
|
3
2
|
require 'baykit/bayserver/util/string_util'
|
4
3
|
require 'baykit/bayserver/util/reusable'
|
5
4
|
|
@@ -9,7 +8,7 @@ module Baykit
|
|
9
8
|
module BayServer
|
10
9
|
module Docker
|
11
10
|
module Terminal
|
12
|
-
class
|
11
|
+
class HijackersShip < Baykit::BayServer::Common::ReadOnlyShip
|
13
12
|
include Baykit::BayServer::Docker::Http::H1::H1CommandHandler # implements
|
14
13
|
|
15
14
|
include Baykit::BayServer::Util
|
@@ -21,7 +20,6 @@ module Baykit
|
|
21
20
|
attr :tour_id
|
22
21
|
|
23
22
|
attr :file_wrote_len
|
24
|
-
attr :pipe_io
|
25
23
|
|
26
24
|
attr :packet_store
|
27
25
|
attr :packet_unpacker
|
@@ -39,20 +37,12 @@ module Baykit
|
|
39
37
|
######################################################
|
40
38
|
# Init method
|
41
39
|
######################################################
|
40
|
+
def init(tur, rd, tp)
|
41
|
+
super(tur.ship.agent_id, rd, tp)
|
42
42
|
|
43
|
-
def init(tur, io, tp)
|
44
|
-
init_yacht()
|
45
43
|
@tour = tur
|
46
|
-
@tour_id =
|
47
|
-
|
48
|
-
tur.res.set_consume_listener do |len, resume|
|
49
|
-
if resume
|
50
|
-
tp.open_valve();
|
51
|
-
end
|
52
|
-
end
|
53
|
-
@pipe_io = io
|
44
|
+
@tour_id = tur.tour_id
|
54
45
|
@file_wrote_len = 0
|
55
|
-
@tour.ship.agent.non_blocking_handler.ask_to_read(@pipe_io)
|
56
46
|
end
|
57
47
|
|
58
48
|
|
@@ -71,12 +61,12 @@ module Baykit
|
|
71
61
|
# implements Yacht
|
72
62
|
######################################################
|
73
63
|
|
74
|
-
def notify_read(buf
|
64
|
+
def notify_read(buf)
|
75
65
|
@file_wrote_len += buf.length
|
76
66
|
|
77
67
|
BayLog.debug "#{self} read hijack #{buf.length} bytes: total=#{@file_wrote_len}"
|
78
68
|
|
79
|
-
available = @tour.res.
|
69
|
+
available = @tour.res.send_res_content(@tour_id, buf, 0, buf.length)
|
80
70
|
if !available
|
81
71
|
return NextSocketAction::SUSPEND
|
82
72
|
else
|
@@ -84,9 +74,23 @@ module Baykit
|
|
84
74
|
end
|
85
75
|
end
|
86
76
|
|
77
|
+
def notify_error(e)
|
78
|
+
BayLog.debug_e(e, "%s Hijack Error", self)
|
79
|
+
begin
|
80
|
+
@tour.res.send_error(@tour_id, HttpStatus::INTERNAL_SERVER_ERROR, nil, e)
|
81
|
+
rescue IOError => ex
|
82
|
+
BayLog.debug_e(ex)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
87
86
|
def notify_eof()
|
88
87
|
BayLog.debug "#{self} Hijack EOF"
|
89
|
-
|
88
|
+
BayLog.debug("%s EOF", self)
|
89
|
+
begin
|
90
|
+
@tour.res.end_res_content(@tour_id)
|
91
|
+
rescue IOError => e
|
92
|
+
BayLog.debug_e(ex)
|
93
|
+
end
|
90
94
|
return NextSocketAction::CLOSE
|
91
95
|
end
|
92
96
|
|
@@ -1,8 +1,10 @@
|
|
1
|
-
require 'baykit/bayserver/agent/
|
1
|
+
require 'baykit/bayserver/agent/grand_agent'
|
2
|
+
require 'baykit/bayserver/agent/multiplexer/plain_transporter'
|
3
|
+
require 'baykit/bayserver/rudders/io_rudder'
|
2
4
|
require 'baykit/bayserver/docker/base/port_base'
|
3
5
|
require 'baykit/bayserver/tours/content_consume_listener'
|
4
6
|
|
5
|
-
require 'baykit/bayserver/docker/terminal/
|
7
|
+
require 'baykit/bayserver/docker/terminal/fully_hijackers_ship'
|
6
8
|
require 'baykit/bayserver/docker/terminal/terminal_train'
|
7
9
|
|
8
10
|
module Baykit
|
@@ -12,7 +14,9 @@ module Baykit
|
|
12
14
|
class TerminalDocker < Baykit::BayServer::Docker::Base::ClubBase
|
13
15
|
include Baykit::BayServer::Bcf
|
14
16
|
include Baykit::BayServer::Util
|
15
|
-
include Baykit::BayServer::Agent
|
17
|
+
include Baykit::BayServer::Agent
|
18
|
+
include Baykit::BayServer::Agent::Multiplexer
|
19
|
+
include Baykit::BayServer::Rudders
|
16
20
|
include Baykit::BayServer::Tours
|
17
21
|
|
18
22
|
RACK_TERMINAL_PIPE = "rack.terminal.pipe"
|
@@ -104,8 +108,8 @@ module Baykit
|
|
104
108
|
tur.res.headers.set_content_type("text/plain")
|
105
109
|
tur.res.set_consume_listener(&ContentConsumeListener::DEV_NULL)
|
106
110
|
tur.res.send_headers(tur.id)
|
107
|
-
tur.res.
|
108
|
-
tur.res.
|
111
|
+
tur.res.send_res_content(tur.id, RACK_ERR, 0, RACK_ERR.length)
|
112
|
+
tur.res.end_res_content(tur.id)
|
109
113
|
return
|
110
114
|
end
|
111
115
|
|
@@ -168,7 +172,7 @@ module Baykit
|
|
168
172
|
env[Rack::RACK_ERRORS] = STDERR
|
169
173
|
env[Rack::RACK_INPUT] = nil
|
170
174
|
env[RACK_MULTITHREAD] = true
|
171
|
-
env[RACK_MULTIPROCESS] = BayServer.harbor.multi_core
|
175
|
+
env[RACK_MULTIPROCESS] = BayServer.harbor.multi_core
|
172
176
|
env[RACK_RUNONCE] = false
|
173
177
|
env[Rack::RACK_URL_SCHEME] = tur.is_secure ? "https" : "http"
|
174
178
|
env[Rack::RACK_IS_HIJACK] = true
|
@@ -181,13 +185,25 @@ module Baykit
|
|
181
185
|
|
182
186
|
env[RACK_HIJACK_IO] = w_pipe
|
183
187
|
|
184
|
-
|
188
|
+
agt = GrandAgent.get(tur.ship.agent_id)
|
189
|
+
mpx = agt.net_multiplexer
|
190
|
+
rd_read = IORudder.new(pip[0])
|
191
|
+
sip = FullyHijackersShip.new()
|
185
192
|
bufsize = tur.ship.protocol_handler.max_res_packet_data_size()
|
186
|
-
tp = PlainTransporter.new(false, bufsize)
|
187
193
|
|
188
|
-
|
189
|
-
|
190
|
-
|
194
|
+
tp = PlainTransporter.new(mpx, sip, false, bufsize, false)
|
195
|
+
|
196
|
+
sip.init(tur, rd_read, tp)
|
197
|
+
sid = sip.ship_id
|
198
|
+
|
199
|
+
tur.res.set_consume_listener do |len, resume|
|
200
|
+
if resume
|
201
|
+
sip.resume_read(sid)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
mpx.add_rudder_state(rd_read, RudderState.new(rd_read, tp))
|
206
|
+
mpx.req_read(rd_read)
|
191
207
|
|
192
208
|
w_pipe
|
193
209
|
end
|
@@ -1,4 +1,7 @@
|
|
1
|
-
require 'baykit/bayserver/agent/
|
1
|
+
require 'baykit/bayserver/agent/grand_agent'
|
2
|
+
require 'baykit/bayserver/agent/multiplexer/plain_transporter'
|
3
|
+
require 'baykit/bayserver/common/read_only_ship'
|
4
|
+
require 'baykit/bayserver/rudders/io_rudder'
|
2
5
|
require 'baykit/bayserver/train/train'
|
3
6
|
require 'baykit/bayserver/train/train_runner'
|
4
7
|
require 'baykit/bayserver/tours/tour'
|
@@ -7,7 +10,7 @@ require 'baykit/bayserver/tours/req_content_handler'
|
|
7
10
|
require 'baykit/bayserver/util/string_util'
|
8
11
|
require 'baykit/bayserver/util/http_status'
|
9
12
|
|
10
|
-
require 'baykit/bayserver/docker/terminal/
|
13
|
+
require 'baykit/bayserver/docker/terminal/hijackers_ship'
|
11
14
|
|
12
15
|
module Baykit
|
13
16
|
module BayServer
|
@@ -16,7 +19,9 @@ module Baykit
|
|
16
19
|
class TerminalTrain < Baykit::BayServer::Train::Train
|
17
20
|
include Baykit::BayServer::Tours::ReqContentHandler # implements
|
18
21
|
|
19
|
-
include Baykit::BayServer::Agent
|
22
|
+
include Baykit::BayServer::Agent
|
23
|
+
include Baykit::BayServer::Agent::Multiplexer
|
24
|
+
include Baykit::BayServer::Rudders
|
20
25
|
include Baykit::BayServer::Util
|
21
26
|
include Baykit::BayServer::Train
|
22
27
|
include Baykit::BayServer::Tours
|
@@ -75,7 +80,7 @@ module Baykit
|
|
75
80
|
end
|
76
81
|
|
77
82
|
|
78
|
-
if BayServer.harbor.trace_header
|
83
|
+
if BayServer.harbor.trace_header
|
79
84
|
@env.keys.each do |key|
|
80
85
|
value = @env[key]
|
81
86
|
BayLog.info("%s Terminal: env:%s=%s", @tour, key, value)
|
@@ -109,15 +114,25 @@ module Baykit
|
|
109
114
|
if hijack != nil
|
110
115
|
# Partially hijacked
|
111
116
|
BayLog.debug("%s Tour is partially hijacked", @tour)
|
112
|
-
|
117
|
+
agt = GrandAgent.get(@tour.ship.agent_id)
|
118
|
+
mpx = agt.net_multiplexer
|
113
119
|
pip = IO.pipe
|
114
|
-
|
120
|
+
rd_read = IORudder.new(pip[0])
|
121
|
+
sip = HijackersShip.new()
|
115
122
|
bufsize = @tour.ship.protocol_handler.max_res_packet_data_size()
|
116
|
-
tp = PlainTransporter.new(false, bufsize)
|
123
|
+
tp = PlainTransporter.new(mpx, sip, false, bufsize, false)
|
124
|
+
|
125
|
+
sip.init(@tour, rd_read, tp)
|
126
|
+
sid = sip.ship_id
|
117
127
|
|
118
|
-
|
119
|
-
|
120
|
-
|
128
|
+
@tour.res.set_consume_listener do |len, resume|
|
129
|
+
if resume
|
130
|
+
sip.resume_read(sid)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
mpx.add_rudder_state(rd_read, RudderState.new(rd_read, tp))
|
135
|
+
mpx.req_read(rd_read)
|
121
136
|
|
122
137
|
hijack.call pip[1]
|
123
138
|
|
@@ -135,13 +150,13 @@ module Baykit
|
|
135
150
|
body.each do | str |
|
136
151
|
bstr = StringUtil.to_bytes(str)
|
137
152
|
BayLog.trace("%s TerminalTask: read body: len=%d", @tour, bstr.length)
|
138
|
-
@available = @tour.res.
|
153
|
+
@available = @tour.res.send_res_content(@tour_id, bstr, 0, bstr.length)
|
139
154
|
while !@available
|
140
155
|
sleep 0.1
|
141
156
|
end
|
142
157
|
end
|
143
158
|
|
144
|
-
@tour.res.
|
159
|
+
@tour.res.end_res_content(@tour_id)
|
145
160
|
|
146
161
|
end
|
147
162
|
end
|
@@ -157,7 +172,7 @@ module Baykit
|
|
157
172
|
end
|
158
173
|
end
|
159
174
|
|
160
|
-
def
|
175
|
+
def on_read_req_content(tur, buf, start, len, &lis)
|
161
176
|
BayLog.trace("%s TerminalTask:onReadContent: len=%d", @tour, len)
|
162
177
|
|
163
178
|
if @req_cont != nil
|
@@ -168,11 +183,11 @@ module Baykit
|
|
168
183
|
@tmpfile.write(buf[start, len])
|
169
184
|
end
|
170
185
|
|
171
|
-
tur.req.consumed(Tour::TOUR_ID_NOCHECK, len)
|
186
|
+
tur.req.consumed(Tour::TOUR_ID_NOCHECK, len, &lis)
|
172
187
|
true
|
173
188
|
end
|
174
189
|
|
175
|
-
def
|
190
|
+
def on_end_req_content(tur)
|
176
191
|
BayLog.trace("%s TerminalTask:endContent", @tour)
|
177
192
|
|
178
193
|
if @req_cont != nil
|
@@ -185,12 +200,12 @@ module Baykit
|
|
185
200
|
end
|
186
201
|
env[Rack::RACK_INPUT] = rack_input
|
187
202
|
|
188
|
-
if !TrainRunner.post(self)
|
203
|
+
if !TrainRunner.post(tur.ship.agent_id, self)
|
189
204
|
raise HttpException.new(HttpStatus::SERVICE_UNAVAILABLE, "TrainRunner is busy")
|
190
205
|
end
|
191
206
|
end
|
192
207
|
|
193
|
-
def
|
208
|
+
def on_abort_req(tur)
|
194
209
|
BayLog.trace("%s TerminalTask:abort", @tour)
|
195
210
|
if @tmpfile
|
196
211
|
@tmpfile.close()
|
@@ -199,6 +214,10 @@ module Baykit
|
|
199
214
|
return false
|
200
215
|
end
|
201
216
|
|
217
|
+
def on_timer
|
218
|
+
BayLog.debug("%s TerminalTask:timer", @tour)
|
219
|
+
end
|
220
|
+
|
202
221
|
def inspect
|
203
222
|
"TerminalTask #{@tour}"
|
204
223
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bayserver-docker-terminal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michisuke-P
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bayserver-core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 3.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 3.0.0
|
27
27
|
description: BayServer is one of the high-speed web servers. It operates as a single-threaded,
|
28
28
|
asynchronous server, which makes it exceptionally fast. It also supports multi-core
|
29
29
|
processors, harnessing the full potential of the CPU's capabilities.
|
@@ -34,9 +34,8 @@ extra_rdoc_files: []
|
|
34
34
|
files:
|
35
35
|
- LICENSE.BAYKIT
|
36
36
|
- README.md
|
37
|
-
- lib/baykit/bayserver/docker/terminal/
|
38
|
-
- lib/baykit/bayserver/docker/terminal/
|
39
|
-
- lib/baykit/bayserver/docker/terminal/hijackers_yacht.rb
|
37
|
+
- lib/baykit/bayserver/docker/terminal/fully_hijackers_ship.rb
|
38
|
+
- lib/baykit/bayserver/docker/terminal/hijackers_ship.rb
|
40
39
|
- lib/baykit/bayserver/docker/terminal/terminal_docker.rb
|
41
40
|
- lib/baykit/bayserver/docker/terminal/terminal_train.rb
|
42
41
|
- lib/rack/handler/bayserver.rb
|
@@ -1,170 +0,0 @@
|
|
1
|
-
require 'baykit/bayserver/agent/next_socket_action'
|
2
|
-
require 'baykit/bayserver/protocol/packet_store'
|
3
|
-
require 'baykit/bayserver/docker/http/h1/h1_packet_unpacker'
|
4
|
-
require 'baykit/bayserver/docker/http/h1/h1_command_unpacker'
|
5
|
-
require 'baykit/bayserver/util/string_util'
|
6
|
-
require 'baykit/bayserver/util/http_status'
|
7
|
-
|
8
|
-
|
9
|
-
module Baykit
|
10
|
-
module BayServer
|
11
|
-
module Docker
|
12
|
-
module Terminal
|
13
|
-
#
|
14
|
-
# Send data of hijacked response
|
15
|
-
#
|
16
|
-
class HijackedDataSender
|
17
|
-
include Baykit::BayServer::Agent::NonBlockingHandler::ChannelListener # implements
|
18
|
-
include Baykit::BayServer::Util
|
19
|
-
include Baykit::BayServer::Agent
|
20
|
-
include Baykit::BayServer::Protocol
|
21
|
-
include Baykit::BayServer::Docker::Http::H1
|
22
|
-
|
23
|
-
attr :tour
|
24
|
-
attr :tour_id
|
25
|
-
attr :fully
|
26
|
-
|
27
|
-
attr :file_wrote_len
|
28
|
-
attr :file_buf_list
|
29
|
-
attr :cur_file_idx
|
30
|
-
attr :read_buf_size
|
31
|
-
attr :cur_file_idx
|
32
|
-
attr :pipe_io
|
33
|
-
|
34
|
-
attr :packet_store
|
35
|
-
attr :packet_unpacker
|
36
|
-
attr :command_unpacker
|
37
|
-
|
38
|
-
DEFAULT_FREAD_BUF_SIZE = 8192
|
39
|
-
|
40
|
-
def initialize(tur, fully)
|
41
|
-
@tour = tur
|
42
|
-
@tour_id = @tour.tour_id
|
43
|
-
@fully = fully
|
44
|
-
@file_buf_list = []
|
45
|
-
@read_buf_size = tour.ship.protocol_handler.max_res_packet_data_size
|
46
|
-
|
47
|
-
if @fully
|
48
|
-
@packet_store = PacketStore.new(tur.ship, H1PacketFactory.new)
|
49
|
-
@command_unpacker = H1CommandUnPacker.new(self, false)
|
50
|
-
@packet_unpacker = H1PacketUnPacker.new(@command_unpacker, @packet_store)
|
51
|
-
end
|
52
|
-
reset
|
53
|
-
end
|
54
|
-
|
55
|
-
def reset
|
56
|
-
@file_wrote_len = 0
|
57
|
-
@cur_file_idx = -1
|
58
|
-
end
|
59
|
-
|
60
|
-
def ship
|
61
|
-
@tour.ship
|
62
|
-
end
|
63
|
-
|
64
|
-
def on_readable(chk_fd)
|
65
|
-
BayLog.debug "#{self} Hijack Readable"
|
66
|
-
check_socket(chk_fd)
|
67
|
-
|
68
|
-
buf = new_file_buffer
|
69
|
-
begin
|
70
|
-
@pipe_io.read_nonblock(@read_buf_size, buf)
|
71
|
-
rescue EOFError => e
|
72
|
-
BayLog.debug "#{self} Hijack EOF"
|
73
|
-
@tour.res.end_content(@tour_id)
|
74
|
-
return NextSocketAction::CLOSE
|
75
|
-
end
|
76
|
-
|
77
|
-
@file_wrote_len += buf.length
|
78
|
-
|
79
|
-
BayLog.debug "#{self} read hijack #{buf.length} bytes: total=#{@file_wrote_len}"
|
80
|
-
|
81
|
-
if @fully
|
82
|
-
return @packet_unpacker.bytes_received(buf)
|
83
|
-
else
|
84
|
-
available = @tour.res.send_content(@tour_id, buf, 0, buf.length)
|
85
|
-
if !available
|
86
|
-
NextSocketAction::SUSPEND
|
87
|
-
else
|
88
|
-
NextSocketAction::CONTINUE
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|
93
|
-
|
94
|
-
def check_timeout(chk_fd, duration)
|
95
|
-
BayLog.debug "#{self} Hijack timeout(Ignore)"
|
96
|
-
end
|
97
|
-
|
98
|
-
def on_error(chk_fd, e)
|
99
|
-
BayLog.debug "#{self} Hijack Error"
|
100
|
-
check_socket(chk_fd)
|
101
|
-
|
102
|
-
BayLog.error_e e
|
103
|
-
end
|
104
|
-
|
105
|
-
def on_closed(chk_fd)
|
106
|
-
BayLog.debug "#{self} Hijack Closed(Ignore)"
|
107
|
-
check_socket(chk_fd)
|
108
|
-
end
|
109
|
-
|
110
|
-
|
111
|
-
def send_pipe_data(io)
|
112
|
-
BayLog.debug("#{self} Send hijacked data #{io.inspect}")
|
113
|
-
@pipe_io = io
|
114
|
-
@file_wrote_len = 0
|
115
|
-
@tour.ship.agent.non_blocking_handler.ask_to_read(@pipe_io)
|
116
|
-
end
|
117
|
-
|
118
|
-
# Implements H1CommandHandler
|
119
|
-
# Fully hijacked mode
|
120
|
-
def handle_header(cmd)
|
121
|
-
cmd.headers.each do |nv|
|
122
|
-
@tour.res.headers.add(nv[0], nv[1])
|
123
|
-
end
|
124
|
-
|
125
|
-
@tour.res.headers.status = cmd.status != nil ? cmd.status : HttpStatus::OK
|
126
|
-
@tour.send_headers(@tour_id)
|
127
|
-
|
128
|
-
return NextSocketAction::CONTINUE
|
129
|
-
end
|
130
|
-
|
131
|
-
# Implements H1CommandHandler
|
132
|
-
# Fully hijacked mode
|
133
|
-
def handle_content(cmd)
|
134
|
-
available = @tour.res.send_content(@tour_id, cmd.buf, cmd.start, cmd.len)
|
135
|
-
if !available
|
136
|
-
NextSocketAction::SUSPEND
|
137
|
-
else
|
138
|
-
NextSocketAction::CONTINUE
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
def resume
|
143
|
-
BayLog.debug("#{self} resume")
|
144
|
-
@tour.ship.agent.non_blocking_handler.ask_to_read(@pipe_io)
|
145
|
-
end
|
146
|
-
|
147
|
-
def to_s
|
148
|
-
"hijack[#{@pipe_io.inspect}]"
|
149
|
-
end
|
150
|
-
|
151
|
-
private
|
152
|
-
def check_socket(chk_fd)
|
153
|
-
if chk_fd != @pipe_io
|
154
|
-
raise RuntimeError.new("BUG: Invalid hijacked data sender instance (file was returned?): #{chk_fd}")
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def new_file_buffer
|
159
|
-
@cur_file_idx += 1
|
160
|
-
if @file_buf_list.length == @cur_file_idx
|
161
|
-
@file_buf_list << StringUtil.alloc(@read_buf_size)
|
162
|
-
end
|
163
|
-
@file_buf_list[@cur_file_idx]
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|