bayserver-core 3.0.2 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/baykit/bayserver/agent/command_receiver.rb +2 -0
- data/lib/baykit/bayserver/agent/grand_agent.rb +145 -133
- data/lib/baykit/bayserver/agent/letters/accepted_letter.rb +17 -0
- data/lib/baykit/bayserver/agent/letters/closed_letter.rb +14 -0
- data/lib/baykit/bayserver/agent/letters/connected_letter.rb +14 -0
- data/lib/baykit/bayserver/agent/letters/error_letter.rb +16 -0
- data/lib/baykit/bayserver/agent/letters/letter.rb +19 -0
- data/lib/baykit/bayserver/agent/letters/package.rb +9 -0
- data/lib/baykit/bayserver/agent/letters/read_letter.rb +20 -0
- data/lib/baykit/bayserver/agent/letters/wrote_letter.rb +17 -0
- data/lib/baykit/bayserver/agent/monitor/grand_agent_monitor.rb +49 -49
- data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer.rb +47 -32
- data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer_base.rb +5 -0
- data/lib/baykit/bayserver/agent/multiplexer/multiplexer_base.rb +12 -28
- data/lib/baykit/bayserver/agent/multiplexer/plain_transporter.rb +20 -5
- data/lib/baykit/bayserver/agent/multiplexer/spider_multiplexer.rb +125 -87
- data/lib/baykit/bayserver/agent/multiplexer/spin_multiplexer.rb +24 -19
- data/lib/baykit/bayserver/agent/multiplexer/taxi_multiplexer.rb +21 -15
- data/lib/baykit/bayserver/bay_log.rb +20 -16
- data/lib/baykit/bayserver/bayserver.rb +8 -15
- data/lib/baykit/bayserver/common/cities.rb +1 -1
- data/lib/baykit/bayserver/common/inbound_ship.rb +5 -45
- data/lib/baykit/bayserver/common/inbound_ship_store.rb +0 -1
- data/lib/baykit/bayserver/common/multiplexer.rb +5 -1
- data/lib/baykit/bayserver/{agent/multiplexer → common}/rudder_state.rb +42 -11
- data/lib/baykit/bayserver/common/rudder_state_store.rb +63 -0
- data/lib/baykit/bayserver/{agent/multiplexer → common}/transporter.rb +2 -4
- data/lib/baykit/bayserver/common/warp_ship.rb +12 -7
- data/lib/baykit/bayserver/{agent/multiplexer → common}/write_unit.rb +2 -4
- data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +0 -1
- data/lib/baykit/bayserver/docker/base/port_base.rb +5 -5
- data/lib/baykit/bayserver/docker/base/warp_base.rb +7 -4
- data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +1 -1
- data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +25 -2
- data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +43 -35
- data/lib/baykit/bayserver/docker/harbor.rb +14 -0
- data/lib/baykit/bayserver/docker/send_file/file_content.rb +66 -0
- data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +113 -29
- data/lib/baykit/bayserver/docker/send_file/file_store.rb +117 -0
- data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +13 -5
- data/lib/baykit/bayserver/docker/send_file/send_file_ship.rb +11 -2
- data/lib/baykit/bayserver/docker/send_file/wait_file_ship.rb +92 -0
- data/lib/baykit/bayserver/mem_usage.rb +2 -0
- data/lib/baykit/bayserver/protocol/packet.rb +2 -1
- data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +5 -5
- data/lib/baykit/bayserver/protocol/protocol_exception.rb +7 -1
- data/lib/baykit/bayserver/rudders/io_rudder.rb +2 -2
- data/lib/baykit/bayserver/rudders/rudder.rb +4 -0
- data/lib/baykit/bayserver/rudders/rudder_base.rb +21 -0
- data/lib/baykit/bayserver/tours/req_content_handler.rb +13 -13
- data/lib/baykit/bayserver/tours/tour.rb +18 -13
- data/lib/baykit/bayserver/tours/tour_req.rb +13 -15
- data/lib/baykit/bayserver/tours/tour_res.rb +42 -19
- data/lib/baykit/bayserver/util/cgi_util.rb +7 -2
- data/lib/baykit/bayserver/util/headers.rb +2 -2
- data/lib/baykit/bayserver/util/http_status.rb +7 -0
- data/lib/baykit/bayserver/util/http_util.rb +16 -0
- data/lib/baykit/bayserver/util/nio_selector.rb +103 -0
- data/lib/baykit/bayserver/util/rb_selector.rb +55 -0
- data/lib/baykit/bayserver/util/selector.rb +43 -80
- data/lib/baykit/bayserver/util/simple_buffer.rb +1 -1
- data/lib/baykit/bayserver/version.rb +1 -1
- metadata +24 -21
- data/lib/baykit/bayserver/agent/accept_handler.rb +0 -71
- data/lib/baykit/bayserver/agent/channel_listener.rb +0 -35
- data/lib/baykit/bayserver/agent/letter.rb +0 -30
- data/lib/baykit/bayserver/agent/transporter/data_listener.rb +0 -38
- data/lib/baykit/bayserver/agent/transporter/package.rb +0 -0
- data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +0 -111
- data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +0 -125
- data/lib/baykit/bayserver/agent/transporter/transporter.rb +0 -332
- data/lib/baykit/bayserver/docker/built_in/log_boat.rb +0 -71
- data/lib/baykit/bayserver/tours/send_file_yacht.rb +0 -97
- data/lib/baykit/bayserver/watercraft/boat.rb +0 -43
- data/lib/baykit/bayserver/watercraft/yacht.rb +0 -42
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require 'baykit/bayserver/tours/tour'
|
|
2
|
+
require 'baykit/bayserver/common/read_only_ship'
|
|
3
|
+
|
|
4
|
+
module Baykit
|
|
5
|
+
module BayServer
|
|
6
|
+
module Docker
|
|
7
|
+
module SendFile
|
|
8
|
+
class WaitFileShip < Baykit::BayServer::Common::ReadOnlyShip
|
|
9
|
+
|
|
10
|
+
include Baykit::BayServer::Agent
|
|
11
|
+
include Baykit::BayServer::Tours
|
|
12
|
+
|
|
13
|
+
attr :file_content
|
|
14
|
+
attr :handler
|
|
15
|
+
|
|
16
|
+
attr :tour
|
|
17
|
+
attr :tour_id
|
|
18
|
+
def initialize()
|
|
19
|
+
@file_content = nil
|
|
20
|
+
@handler = nil
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def init(rd, tp, tur, file_content, handler)
|
|
24
|
+
super(tur.ship.agent_id, rd, tp)
|
|
25
|
+
@tour = tur
|
|
26
|
+
@tour_id = tur.tour_id
|
|
27
|
+
@file_content = file_content
|
|
28
|
+
@handler = handler
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def to_s
|
|
32
|
+
return "agt#" + @agent_id.to_s + " wait_file#" + @ship_id.to_s + "/" + @object_id.to_s
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
######################################################
|
|
36
|
+
# Implements Reusable
|
|
37
|
+
######################################################
|
|
38
|
+
|
|
39
|
+
def reset
|
|
40
|
+
super
|
|
41
|
+
@file_content = nil
|
|
42
|
+
@tour_id = 0
|
|
43
|
+
@tour = nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
######################################################
|
|
47
|
+
# Implements ReadOnlyShip
|
|
48
|
+
######################################################
|
|
49
|
+
|
|
50
|
+
def notify_read(buf)
|
|
51
|
+
|
|
52
|
+
BayLog.debug("%s file read completed", self)
|
|
53
|
+
|
|
54
|
+
begin
|
|
55
|
+
@handler.send_file_from_cache
|
|
56
|
+
rescue HttpException => e
|
|
57
|
+
begin
|
|
58
|
+
@tour.res.send_error(Tour::TOUR_ID_NOCHECK, e.status, e.message)
|
|
59
|
+
rescue IOError => ex
|
|
60
|
+
notify_error(ex)
|
|
61
|
+
return NextSocketAction::CLOSE
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
return NextSocketAction::CONTINUE
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def notify_error(e)
|
|
69
|
+
BayLog.debug_e(e, "%s Error notified", self)
|
|
70
|
+
begin
|
|
71
|
+
@tour.res.send_error(@tour_id, HttpStatus.INTERNAL_SERVER_ERROR, null, e)
|
|
72
|
+
rescue IOError => ex
|
|
73
|
+
BayLog.debug_e(ex)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def notify_eof()
|
|
78
|
+
raise Sink.new
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def notify_close
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def check_timeout(duration_sec)
|
|
85
|
+
return false
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -5,6 +5,7 @@ require 'baykit/bayserver/protocol/protocol_handler_store'
|
|
|
5
5
|
require 'baykit/bayserver/protocol/packet_store'
|
|
6
6
|
require 'baykit/bayserver/tours/tour_store'
|
|
7
7
|
require 'baykit/bayserver/common/inbound_ship_store'
|
|
8
|
+
require 'baykit/bayserver/common/rudder_state_store'
|
|
8
9
|
require 'baykit/bayserver/docker/base/warp_base'
|
|
9
10
|
|
|
10
11
|
require 'baykit/bayserver/util/string_util'
|
|
@@ -52,6 +53,7 @@ module Baykit
|
|
|
52
53
|
PacketStore.get_stores(@agent_id).each do |store|
|
|
53
54
|
store.print_usage(indent+1)
|
|
54
55
|
end
|
|
56
|
+
RudderStateStore.get_store(@agent_id).print_usage(indent+1)
|
|
55
57
|
TourStore.get_store(@agent_id).print_usage(indent+1);
|
|
56
58
|
BayServer.cities.cities.each do |city|
|
|
57
59
|
print_city_usage(nil, city, indent)
|
|
@@ -29,9 +29,9 @@ module Baykit
|
|
|
29
29
|
def put_bytes(buf, ofs=0, len=buf.length)
|
|
30
30
|
if len > 0
|
|
31
31
|
check_write(len)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
while @start + @pos + len > @packet.buf.length
|
|
33
|
+
packet.expand
|
|
34
|
+
end
|
|
35
35
|
begin
|
|
36
36
|
@packet.buf[@start + @pos, len] = buf[ofs, len]
|
|
37
37
|
rescue IndexError => e
|
|
@@ -100,13 +100,13 @@ module Baykit
|
|
|
100
100
|
def check_read(len)
|
|
101
101
|
max_len = (@max_len >= 0) ? @max_len : (@packet.buf_len - @start)
|
|
102
102
|
if @pos + len > max_len
|
|
103
|
-
raise
|
|
103
|
+
raise IOError.new("Invalid array index: @pos=#{@pos} @max=#{@max_len} len=#{len}")
|
|
104
104
|
end
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
def check_write(len)
|
|
108
108
|
if @max_len > 0 && @pos + len > @max_len
|
|
109
|
-
raise
|
|
109
|
+
raise IOError.new("Buffer overflow: @pos=#{@pos} @max=#{@max_len} len=#{len}")
|
|
110
110
|
end
|
|
111
111
|
end
|
|
112
112
|
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
#
|
|
2
|
+
# ProtocolException is thrown when protocol-level violations are detected,
|
|
3
|
+
# such as invalid packet framing or incorrect packet ordering.
|
|
4
|
+
# (Invalid HTTP headers or content length values result in an HttpException,
|
|
5
|
+
# which causes a 400 Bad Request response to be returned to the client.)
|
|
6
|
+
#
|
|
1
7
|
module Baykit
|
|
2
8
|
module BayServer
|
|
3
9
|
module Protocol
|
|
@@ -5,7 +11,7 @@ module Baykit
|
|
|
5
11
|
def initialize(fmt = nil, *args)
|
|
6
12
|
super(if fmt == nil
|
|
7
13
|
nil
|
|
8
|
-
elsif args
|
|
14
|
+
elsif args.empty?
|
|
9
15
|
sprintf("%s", fmt)
|
|
10
16
|
else
|
|
11
17
|
sprintf(fmt, *args)
|
|
@@ -15,26 +15,26 @@ module Baykit
|
|
|
15
15
|
raise NotImplementedError.new
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
#DEV_NULL = nil
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
class DevNullReqContentHandler
|
|
21
|
+
include ReqContentHandler # implements
|
|
22
|
+
def on_read_req_content(tur, buf, start, len)
|
|
23
|
+
end
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
def on_end_req_content(tur)
|
|
26
|
+
end
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
end
|
|
28
|
+
def on_abort_req(tur)
|
|
29
|
+
return false
|
|
30
|
+
end
|
|
32
31
|
|
|
33
|
-
|
|
34
|
-
DEV_NULL = DevNullReqContentHandler.new()
|
|
32
|
+
end
|
|
35
33
|
end
|
|
36
34
|
end
|
|
37
35
|
end
|
|
38
36
|
end
|
|
39
37
|
|
|
38
|
+
Baykit::BayServer::Tours::ReqContentHandler::DEV_NULL = Baykit::BayServer::Tours::ReqContentHandler::DevNullReqContentHandler.new
|
|
39
|
+
|
|
40
40
|
|
|
@@ -17,10 +17,11 @@ module Baykit
|
|
|
17
17
|
class TourState
|
|
18
18
|
UNINITIALIZED = 0
|
|
19
19
|
PREPARING = 1
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
READING = 2
|
|
21
|
+
RUNNING = 3
|
|
22
|
+
ABORTED = 4
|
|
23
|
+
ENDED = 5
|
|
24
|
+
ZOMBIE = 6
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
# class variables
|
|
@@ -65,7 +66,7 @@ module Baykit
|
|
|
65
66
|
end
|
|
66
67
|
|
|
67
68
|
def to_s()
|
|
68
|
-
return "#{@ship}
|
|
69
|
+
return "#{@ship} tur##{@tour_id}/#{@obj_id}[key=#{@req.key}]"
|
|
69
70
|
end
|
|
70
71
|
|
|
71
72
|
######################################################
|
|
@@ -110,7 +111,11 @@ module Baykit
|
|
|
110
111
|
end
|
|
111
112
|
|
|
112
113
|
def go
|
|
113
|
-
|
|
114
|
+
if(req.headers.content_length > 0)
|
|
115
|
+
change_state(TOUR_ID_NOCHECK, TourState::READING)
|
|
116
|
+
else
|
|
117
|
+
change_state(TOUR_ID_NOCHECK, TourState::RUNNING)
|
|
118
|
+
end
|
|
114
119
|
|
|
115
120
|
city = @ship.port_docker.find_city(@req.req_host)
|
|
116
121
|
if city == nil
|
|
@@ -121,23 +126,23 @@ module Baykit
|
|
|
121
126
|
if city == nil
|
|
122
127
|
raise HttpException.new HttpStatus::NOT_FOUND, @req.uri
|
|
123
128
|
else
|
|
124
|
-
|
|
125
|
-
city.enter(self)
|
|
126
|
-
rescue HttpException => e
|
|
127
|
-
change_state(TOUR_ID_NOCHECK, TourState::ABORTED)
|
|
128
|
-
raise e
|
|
129
|
-
end
|
|
129
|
+
city.enter(self)
|
|
130
130
|
end
|
|
131
131
|
end
|
|
132
132
|
|
|
133
133
|
def valid?()
|
|
134
|
-
return @state == TourState::PREPARING || @state == TourState::RUNNING
|
|
134
|
+
return @state == TourState::PREPARING || @state == TourState::READING || @state == TourState::RUNNING
|
|
135
135
|
end
|
|
136
136
|
|
|
137
137
|
def preparing?()
|
|
138
138
|
return @state == TourState::PREPARING
|
|
139
139
|
end
|
|
140
140
|
|
|
141
|
+
def reading?()
|
|
142
|
+
return @state == TourState::READING
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
|
|
141
146
|
def running?()
|
|
142
147
|
return @state == TourState::RUNNING
|
|
143
148
|
end
|
|
@@ -8,6 +8,7 @@ module Baykit
|
|
|
8
8
|
class TourReq
|
|
9
9
|
include Baykit::BayServer::Util::Reusable # implements
|
|
10
10
|
|
|
11
|
+
include Baykit::BayServer
|
|
11
12
|
include Baykit::BayServer::Protocol
|
|
12
13
|
include Baykit::BayServer::Util
|
|
13
14
|
|
|
@@ -123,8 +124,12 @@ module Baykit
|
|
|
123
124
|
@tour.check_tour_id(check_id)
|
|
124
125
|
|
|
125
126
|
data_passed = false
|
|
126
|
-
if
|
|
127
|
-
|
|
127
|
+
if @tour.error != nil
|
|
128
|
+
# If has error, only read content. (Do not call content handler)
|
|
129
|
+
BayLog.debug("%s tour has error.", @tour)
|
|
130
|
+
|
|
131
|
+
elsif !@tour.reading?
|
|
132
|
+
raise HttpException.new(HttpStatus.BAD_REQUEST, "%s tour is not reading.", @tour)
|
|
128
133
|
|
|
129
134
|
elsif @content_handler == nil
|
|
130
135
|
BayLog.warn("%s content read, but no content handler", tour)
|
|
@@ -132,17 +137,13 @@ module Baykit
|
|
|
132
137
|
elsif @bytes_posted + len > @bytes_limit
|
|
133
138
|
raise ProtocolException.new("Read data exceed content-length: %d/%d", @bytes_posted + len, @bytes_limit)
|
|
134
139
|
|
|
135
|
-
elsif @tour.error != nil
|
|
136
|
-
# If has error, only read content. (Do not call content handler)
|
|
137
|
-
BayLog.debug("%s tour has error.", @tour)
|
|
138
|
-
|
|
139
140
|
else
|
|
140
141
|
@content_handler.on_read_req_content(@tour, data, start, len, &callback)
|
|
141
142
|
data_passed = true
|
|
142
143
|
end
|
|
143
144
|
|
|
144
145
|
@bytes_posted += len
|
|
145
|
-
BayLog.debug("%s
|
|
146
|
+
BayLog.debug("%s post req content: len=%d posted=%d limit=%d consumed=%d",
|
|
146
147
|
@tour, len, @bytes_posted, @bytes_limit, @bytes_consumed)
|
|
147
148
|
|
|
148
149
|
if !data_passed
|
|
@@ -166,6 +167,7 @@ module Baykit
|
|
|
166
167
|
if @ended
|
|
167
168
|
raise Sink.new("#{@tour} Request content is already ended")
|
|
168
169
|
end
|
|
170
|
+
@tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::RUNNING)
|
|
169
171
|
|
|
170
172
|
if @bytes_limit >= 0 && @bytes_posted != @bytes_limit
|
|
171
173
|
raise ProtocolException.new("Read data exceed content-length: #{@bytes_posted}/#{@bytes_limit}")
|
|
@@ -203,16 +205,12 @@ module Baykit
|
|
|
203
205
|
#@tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
|
|
204
206
|
return true
|
|
205
207
|
|
|
206
|
-
elsif @tour.
|
|
208
|
+
elsif @tour.reading?
|
|
207
209
|
aborted = true
|
|
208
210
|
if @content_handler != nil
|
|
209
211
|
aborted = @content_handler.on_abort_req(@tour)
|
|
210
212
|
end
|
|
211
213
|
|
|
212
|
-
#if aborted
|
|
213
|
-
# @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
|
|
214
|
-
#end
|
|
215
|
-
|
|
216
214
|
return aborted
|
|
217
215
|
else
|
|
218
216
|
BayLog.debug("%s tour is not preparing or not running", @tour)
|
|
@@ -225,9 +223,9 @@ module Baykit
|
|
|
225
223
|
if hnd == nil
|
|
226
224
|
raise Sink.new("nil")
|
|
227
225
|
end
|
|
228
|
-
if @content_handler != nil
|
|
229
|
-
|
|
230
|
-
end
|
|
226
|
+
#if @content_handler != nil
|
|
227
|
+
# raise Sink.new("content handler already set")
|
|
228
|
+
#end
|
|
231
229
|
|
|
232
230
|
@content_handler = hnd
|
|
233
231
|
end
|
|
@@ -3,7 +3,6 @@ require 'baykit/bayserver/protocol/protocol_exception'
|
|
|
3
3
|
require 'baykit/bayserver/agent/multiplexer/plain_transporter'
|
|
4
4
|
require 'baykit/bayserver/taxi/taxi_runner'
|
|
5
5
|
require 'baykit/bayserver/docker/harbor'
|
|
6
|
-
require 'baykit/bayserver/tours/send_file_yacht'
|
|
7
6
|
require 'baykit/bayserver/tours/read_file_taxi'
|
|
8
7
|
require 'baykit/bayserver/tours/content_consume_listener'
|
|
9
8
|
|
|
@@ -22,7 +21,6 @@ module Baykit
|
|
|
22
21
|
include Baykit::BayServer::Docker
|
|
23
22
|
include Baykit::BayServer::Tours
|
|
24
23
|
include Baykit::BayServer::Taxi
|
|
25
|
-
include Baykit::BayServer::Agent::Transporter
|
|
26
24
|
|
|
27
25
|
attr :tour
|
|
28
26
|
|
|
@@ -35,7 +33,6 @@ module Baykit
|
|
|
35
33
|
attr :res_consume_listener
|
|
36
34
|
|
|
37
35
|
attr_accessor :header_sent
|
|
38
|
-
attr :yacht
|
|
39
36
|
|
|
40
37
|
###########################
|
|
41
38
|
# Response Content info
|
|
@@ -55,7 +52,6 @@ module Baykit
|
|
|
55
52
|
end
|
|
56
53
|
|
|
57
54
|
def init()
|
|
58
|
-
@yacht = SendFileYacht.new()
|
|
59
55
|
end
|
|
60
56
|
|
|
61
57
|
def to_s()
|
|
@@ -69,9 +65,6 @@ module Baykit
|
|
|
69
65
|
def reset()
|
|
70
66
|
@charset = nil
|
|
71
67
|
@header_sent = false
|
|
72
|
-
if @yacht != nil
|
|
73
|
-
@yacht.reset()
|
|
74
|
-
end
|
|
75
68
|
|
|
76
69
|
@available = false
|
|
77
70
|
@res_consume_listener = nil
|
|
@@ -124,7 +117,42 @@ module Baykit
|
|
|
124
117
|
end
|
|
125
118
|
|
|
126
119
|
begin
|
|
127
|
-
|
|
120
|
+
handled = false
|
|
121
|
+
if !@tour.error_handling && @tour.res.headers.status >= 400
|
|
122
|
+
trouble = BayServer.harbor.trouble
|
|
123
|
+
if trouble != nil
|
|
124
|
+
cmd = trouble.find(tur.res.headers.status)
|
|
125
|
+
if cmd != nil
|
|
126
|
+
err_tour = get_error_tour
|
|
127
|
+
err_tour.req.uri = cmd.target
|
|
128
|
+
@tour.req.headers.copy_to(err_tour.req.headers)
|
|
129
|
+
@tour.res.headers.copy_to(err_tour.res.headers)
|
|
130
|
+
err_tour.req.remote_port = @tour.req.remote_port
|
|
131
|
+
err_tour.req.remote_address = @tour.req.remote_address
|
|
132
|
+
err_tour.req.server_address = @tour.req.server_address
|
|
133
|
+
err_tour.req.server_port = @tour.req.server_port
|
|
134
|
+
err_tour.req.server_name = @tour.req.server_name
|
|
135
|
+
err_tour.res.header_sent = @tour.res.header_sent
|
|
136
|
+
@tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ZOMBIE)
|
|
137
|
+
case cmd.method
|
|
138
|
+
when :GUIDE
|
|
139
|
+
err_tour.go
|
|
140
|
+
when :TEXT
|
|
141
|
+
@protocol_handler.send_headers(err_tour)
|
|
142
|
+
data = cmd.target
|
|
143
|
+
err_tour.res.send_res_content(Tour::TOUR_ID_NOCHECK, data, 0, data.length)
|
|
144
|
+
err_tour.end_res_content(Tour::TOUR_ID_NOCHECK)
|
|
145
|
+
when :REROUTE
|
|
146
|
+
err_tour.res.send_http_exception(Tour::TOUR_ID_NOCHECK, HttpException.moved_temp(cmd.target))
|
|
147
|
+
end
|
|
148
|
+
handled = true
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
if !handled
|
|
154
|
+
@tour.ship.send_headers(@tour.ship_id, @tour)
|
|
155
|
+
end
|
|
128
156
|
rescue IOError => e
|
|
129
157
|
BayLog.debug_e(e, "%s abort: %s", @tour, e)
|
|
130
158
|
@tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
|
|
@@ -149,7 +177,7 @@ module Baykit
|
|
|
149
177
|
raise e
|
|
150
178
|
ensure
|
|
151
179
|
@header_sent = true
|
|
152
|
-
|
|
180
|
+
end_res_content(chk_tour_id)
|
|
153
181
|
end
|
|
154
182
|
end
|
|
155
183
|
|
|
@@ -162,10 +190,6 @@ module Baykit
|
|
|
162
190
|
@available = true
|
|
163
191
|
end
|
|
164
192
|
|
|
165
|
-
def detach_consume_listener
|
|
166
|
-
@res_consume_listener = nil
|
|
167
|
-
end
|
|
168
|
-
|
|
169
193
|
def send_res_content(chk_tour_id, buf, ofs, len)
|
|
170
194
|
@tour.check_tour_id(chk_tour_id)
|
|
171
195
|
BayLog.debug("%s sendContent len=%d", @tour, len)
|
|
@@ -281,6 +305,9 @@ module Baykit
|
|
|
281
305
|
|
|
282
306
|
def consumed(check_id, length)
|
|
283
307
|
@tour.check_tour_id(check_id)
|
|
308
|
+
if @res_consume_listener == nil
|
|
309
|
+
raise Sink.new("Response consume listener is null")
|
|
310
|
+
end
|
|
284
311
|
|
|
285
312
|
@bytes_consumed += length
|
|
286
313
|
|
|
@@ -297,12 +324,8 @@ module Baykit
|
|
|
297
324
|
resume = true
|
|
298
325
|
end
|
|
299
326
|
|
|
300
|
-
if
|
|
301
|
-
|
|
302
|
-
BayLog.debug("%s Consume listener is null, so can not invoke callback", self)
|
|
303
|
-
else
|
|
304
|
-
@res_consume_listener.call(length, resume)
|
|
305
|
-
end
|
|
327
|
+
if @tour.running?
|
|
328
|
+
@res_consume_listener.call(length, resume)
|
|
306
329
|
end
|
|
307
330
|
end
|
|
308
331
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require 'date'
|
|
1
2
|
require 'baykit/bayserver/util/string_util'
|
|
2
3
|
|
|
3
4
|
module Baykit
|
|
@@ -105,8 +106,12 @@ module Baykit
|
|
|
105
106
|
end
|
|
106
107
|
end
|
|
107
108
|
|
|
108
|
-
|
|
109
|
-
|
|
109
|
+
if tur.req.remote_address
|
|
110
|
+
add_env(REMOTE_ADDR, tur.req.remote_address, &block)
|
|
111
|
+
end
|
|
112
|
+
if tur.req.remote_port
|
|
113
|
+
add_env(REMOTE_PORT, tur.req.remote_port, &block)
|
|
114
|
+
end
|
|
110
115
|
#add_env(REMOTE_USER, "unknown")
|
|
111
116
|
|
|
112
117
|
add_env(REQUEST_SCHEME, tur.is_secure ? "https": "http", &block)
|
|
@@ -36,7 +36,7 @@ module Baykit
|
|
|
36
36
|
CONNECTION_CLOSE = 1
|
|
37
37
|
CONNECTION_KEEP_ALIVE = 2
|
|
38
38
|
CONNECTION_UPGRADE = 3
|
|
39
|
-
|
|
39
|
+
CONNECTION_UNKNOWN = 4
|
|
40
40
|
|
|
41
41
|
attr :status
|
|
42
42
|
attr :headers
|
|
@@ -185,7 +185,7 @@ module Baykit
|
|
|
185
185
|
when "upgrade" then
|
|
186
186
|
return CONNECTION_UPGRADE
|
|
187
187
|
else
|
|
188
|
-
return
|
|
188
|
+
return CONNECTION_UNKNOWN
|
|
189
189
|
end
|
|
190
190
|
end
|
|
191
191
|
end
|
|
@@ -29,6 +29,7 @@ module Baykit
|
|
|
29
29
|
end
|
|
30
30
|
@status = {}
|
|
31
31
|
@initialized = false
|
|
32
|
+
@desc_ok = nil
|
|
32
33
|
|
|
33
34
|
def self.init(bcf_file)
|
|
34
35
|
if(@initialized)
|
|
@@ -42,10 +43,16 @@ module Baykit
|
|
|
42
43
|
@status[kv.key.to_i] = kv.value
|
|
43
44
|
end
|
|
44
45
|
end
|
|
46
|
+
|
|
47
|
+
@desc_ok = @status[OK]
|
|
45
48
|
@initialized = true
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
def self.description(status_code)
|
|
52
|
+
if status_code == OK
|
|
53
|
+
return @desc_ok
|
|
54
|
+
end
|
|
55
|
+
|
|
49
56
|
desc = @status[status_code]
|
|
50
57
|
if(desc == nil)
|
|
51
58
|
BayLog.error("Status #{status_code} is invalid.")
|
|
@@ -5,12 +5,14 @@ require 'baykit/bayserver/util/string_util'
|
|
|
5
5
|
require 'baykit/bayserver/util/char_util'
|
|
6
6
|
require 'baykit/bayserver/util/headers'
|
|
7
7
|
require 'baykit/bayserver/util/http_util'
|
|
8
|
+
require 'baykit/bayserver/protocol/protocol_exception'
|
|
8
9
|
|
|
9
10
|
module Baykit
|
|
10
11
|
module BayServer
|
|
11
12
|
module Util
|
|
12
13
|
class HttpUtil
|
|
13
14
|
include Baykit::BayServer::Util
|
|
15
|
+
include Baykit::BayServer::Protocol
|
|
14
16
|
|
|
15
17
|
MAX_LINE_LEN = 5000
|
|
16
18
|
|
|
@@ -151,6 +153,20 @@ module Baykit
|
|
|
151
153
|
return nil
|
|
152
154
|
end
|
|
153
155
|
end
|
|
156
|
+
|
|
157
|
+
def HttpUtil.check_uri(uri)
|
|
158
|
+
if uri == nil
|
|
159
|
+
raise ProtocolException, "path is null"
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
if uri.include?("\x00")
|
|
163
|
+
raise ProtocolException, "path contains null byte"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
if uri.each_char.any? { |ch| (ch.ord < 0x20) || (ch.ord == 0x7f) }
|
|
167
|
+
raise ProtocolException, "path contains control character"
|
|
168
|
+
end
|
|
169
|
+
end
|
|
154
170
|
end
|
|
155
171
|
end
|
|
156
172
|
end
|