bayserver-core 2.2.0
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 +7 -0
- data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
- data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
- data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
- data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
- data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
- data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
- data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
- data/lib/baykit/bayserver/agent/package.rb +3 -0
- data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
- data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
- data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
- data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
- data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
- data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
- data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
- data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
- data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
- data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
- data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
- data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
- data/lib/baykit/bayserver/bay_dockers.rb +60 -0
- data/lib/baykit/bayserver/bay_exception.rb +12 -0
- data/lib/baykit/bayserver/bay_log.rb +148 -0
- data/lib/baykit/bayserver/bay_message.rb +20 -0
- data/lib/baykit/bayserver/bayserver.rb +529 -0
- data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
- data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
- data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
- data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
- data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
- data/lib/baykit/bayserver/bcf/package.rb +6 -0
- data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
- data/lib/baykit/bayserver/config_exception.rb +25 -0
- data/lib/baykit/bayserver/constants.rb +8 -0
- data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
- data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
- data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
- data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
- data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
- data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
- data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
- data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
- data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
- data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
- data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
- data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
- data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
- data/lib/baykit/bayserver/docker/city.rb +22 -0
- data/lib/baykit/bayserver/docker/club.rb +45 -0
- data/lib/baykit/bayserver/docker/docker.rb +8 -0
- data/lib/baykit/bayserver/docker/harbor.rb +34 -0
- data/lib/baykit/bayserver/docker/log.rb +17 -0
- data/lib/baykit/bayserver/docker/package.rb +12 -0
- data/lib/baykit/bayserver/docker/permission.rb +18 -0
- data/lib/baykit/bayserver/docker/port.rb +39 -0
- data/lib/baykit/bayserver/docker/reroute.rb +17 -0
- data/lib/baykit/bayserver/docker/secure.rb +22 -0
- data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
- data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
- data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
- data/lib/baykit/bayserver/docker/town.rb +30 -0
- data/lib/baykit/bayserver/docker/trouble.rb +17 -0
- data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
- data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
- data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
- data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
- data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
- data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
- data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
- data/lib/baykit/bayserver/http_exception.rb +33 -0
- data/lib/baykit/bayserver/mem_usage.rb +104 -0
- data/lib/baykit/bayserver/protocol/command.rb +21 -0
- data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
- data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
- data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
- data/lib/baykit/bayserver/protocol/package.rb +15 -0
- data/lib/baykit/bayserver/protocol/packet.rb +63 -0
- data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
- data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
- data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
- data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
- data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
- data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
- data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
- data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
- data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
- data/lib/baykit/bayserver/sink.rb +22 -0
- data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
- data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
- data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
- data/lib/baykit/bayserver/tours/package.rb +4 -0
- data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
- data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
- data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
- data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
- data/lib/baykit/bayserver/tours/tour.rb +195 -0
- data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
- data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
- data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
- data/lib/baykit/bayserver/train/train.rb +54 -0
- data/lib/baykit/bayserver/train/train_runner.rb +32 -0
- data/lib/baykit/bayserver/util/byte_array.rb +54 -0
- data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
- data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
- data/lib/baykit/bayserver/util/char_util.rb +22 -0
- data/lib/baykit/bayserver/util/cities.rb +45 -0
- data/lib/baykit/bayserver/util/class_util.rb +17 -0
- data/lib/baykit/bayserver/util/counter.rb +23 -0
- data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
- data/lib/baykit/bayserver/util/executor_service.rb +81 -0
- data/lib/baykit/bayserver/util/groups.rb +110 -0
- data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
- data/lib/baykit/bayserver/util/headers.rb +194 -0
- data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
- data/lib/baykit/bayserver/util/http_status.rb +60 -0
- data/lib/baykit/bayserver/util/http_util.rb +157 -0
- data/lib/baykit/bayserver/util/io_util.rb +32 -0
- data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
- data/lib/baykit/bayserver/util/key_val.rb +15 -0
- data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
- data/lib/baykit/bayserver/util/locale.rb +30 -0
- data/lib/baykit/bayserver/util/md5_password.rb +24 -0
- data/lib/baykit/bayserver/util/message.rb +56 -0
- data/lib/baykit/bayserver/util/mimes.rb +27 -0
- data/lib/baykit/bayserver/util/object_factory.rb +13 -0
- data/lib/baykit/bayserver/util/object_store.rb +74 -0
- data/lib/baykit/bayserver/util/postman.rb +35 -0
- data/lib/baykit/bayserver/util/reusable.rb +13 -0
- data/lib/baykit/bayserver/util/selector.rb +141 -0
- data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
- data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
- data/lib/baykit/bayserver/util/string_util.rb +73 -0
- data/lib/baykit/bayserver/util/sys_util.rb +138 -0
- data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
- data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
- data/lib/baykit/bayserver/util/valve.rb +15 -0
- data/lib/baykit/bayserver/version.rb +7 -0
- data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
- data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
- data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
- metadata +189 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require 'baykit/bayserver/agent/spin_handler'
|
|
2
|
+
require 'baykit/bayserver/util/string_util'
|
|
3
|
+
require 'baykit/bayserver/util/valve'
|
|
4
|
+
|
|
5
|
+
module Baykit
|
|
6
|
+
module BayServer
|
|
7
|
+
module Agent
|
|
8
|
+
module Transporter
|
|
9
|
+
class SpinReadTransporter
|
|
10
|
+
include Baykit::BayServer::Agent::SpinHandler::SpinListener # implements
|
|
11
|
+
include Baykit::BayServer::Util::Valve # implements
|
|
12
|
+
include Baykit::BayServer::Util
|
|
13
|
+
|
|
14
|
+
attr :spin_handler
|
|
15
|
+
attr :data_listener
|
|
16
|
+
attr :infile
|
|
17
|
+
attr :read_buf
|
|
18
|
+
attr :total_read
|
|
19
|
+
attr :file_len
|
|
20
|
+
attr :timeout_sec
|
|
21
|
+
attr :eof_checker
|
|
22
|
+
attr :is_closed
|
|
23
|
+
|
|
24
|
+
def initialize(buf_size)
|
|
25
|
+
@read_buf = StringUtil.alloc(buf_size)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def init(spin_hnd, lis, infile, limit, timeout_sec, eof_checker)
|
|
29
|
+
@spin_handler = spin_hnd
|
|
30
|
+
@data_listener = lis
|
|
31
|
+
@infile = infile
|
|
32
|
+
@file_len = limit
|
|
33
|
+
@total_read = 0
|
|
34
|
+
@timeout_sec = timeout_sec
|
|
35
|
+
@eof_checker = eof_checker
|
|
36
|
+
@is_closed = false
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def to_s
|
|
40
|
+
data_listener.to_s()
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
######################################################
|
|
44
|
+
# Implements Reusable
|
|
45
|
+
######################################################
|
|
46
|
+
|
|
47
|
+
def reset()
|
|
48
|
+
@data_listener = nil
|
|
49
|
+
@infile = nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
######################################################
|
|
53
|
+
# Implements SpinListener
|
|
54
|
+
######################################################
|
|
55
|
+
|
|
56
|
+
def lap()
|
|
57
|
+
begin
|
|
58
|
+
@infile.sysread(@buf_size, @read_buf)
|
|
59
|
+
|
|
60
|
+
if @read_buf.length == 0
|
|
61
|
+
return NextSocketAction::CONTINUE, true
|
|
62
|
+
end
|
|
63
|
+
@total_read += @read_buf.length
|
|
64
|
+
|
|
65
|
+
next_act = @yacht.notify_read(@read_buf)
|
|
66
|
+
|
|
67
|
+
if @total_read == @file_len
|
|
68
|
+
@data_listener.notify_eof()
|
|
69
|
+
close()
|
|
70
|
+
return NextSocketAction::CLOSE, false
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
return next_act, false
|
|
74
|
+
rescue Exception => e
|
|
75
|
+
BayLog.error_e(e)
|
|
76
|
+
close()
|
|
77
|
+
return NextSocketAction::CLOSE, false
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def check_timeout(duration_sec)
|
|
82
|
+
return duration_sec > @timeout_sec
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def close()
|
|
86
|
+
if @infile != nil
|
|
87
|
+
@infile.close()
|
|
88
|
+
end
|
|
89
|
+
@data_listener.notify_close()
|
|
90
|
+
@is_closed = true
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
######################################################
|
|
94
|
+
# Implements Valve
|
|
95
|
+
######################################################
|
|
96
|
+
|
|
97
|
+
def open_valve()
|
|
98
|
+
@spin_handler.ask_to_callback(self)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
######################################################
|
|
102
|
+
# Other methods
|
|
103
|
+
######################################################
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
require 'baykit/bayserver/agent/spin_handler'
|
|
2
|
+
require 'baykit/bayserver/util/string_util'
|
|
3
|
+
require 'baykit/bayserver/util/reusable'
|
|
4
|
+
require 'baykit/bayserver/util/valve'
|
|
5
|
+
require 'baykit/bayserver/util/postman'
|
|
6
|
+
|
|
7
|
+
module Baykit
|
|
8
|
+
module BayServer
|
|
9
|
+
module Agent
|
|
10
|
+
module Transporter
|
|
11
|
+
class SpinWriteTransporter < Baykit::BayServer::Agent::SpinHandler
|
|
12
|
+
include Baykit::BayServer::Util::Valve # implements
|
|
13
|
+
include Baykit::BayServer::Util::Reusable # implements
|
|
14
|
+
include Baykit::BayServer::Util::Postman # implements
|
|
15
|
+
|
|
16
|
+
include Baykit::BayServer::Util
|
|
17
|
+
|
|
18
|
+
attr :spin_handler
|
|
19
|
+
attr :data_listener
|
|
20
|
+
attr :outfile
|
|
21
|
+
attr :write_queue
|
|
22
|
+
attr :lock
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def initialize()
|
|
26
|
+
@write_queue = []
|
|
27
|
+
@lock = Mutex.new()
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def init(spin_hnd, outfile, lis)
|
|
31
|
+
@spin_handler = spin_hnd
|
|
32
|
+
@data_listener = lis
|
|
33
|
+
@outfile = outfile
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def to_s
|
|
37
|
+
data_listener.to_s()
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
######################################################
|
|
41
|
+
# Implements Reusable
|
|
42
|
+
######################################################
|
|
43
|
+
|
|
44
|
+
def reset()
|
|
45
|
+
@data_listener = nil
|
|
46
|
+
@outfile = nil
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
######################################################
|
|
50
|
+
# Implements SpinListener
|
|
51
|
+
######################################################
|
|
52
|
+
|
|
53
|
+
def lap()
|
|
54
|
+
begin
|
|
55
|
+
|
|
56
|
+
buf = nil
|
|
57
|
+
@lock.synchronize do
|
|
58
|
+
if @write_queue.empty?
|
|
59
|
+
BayLog.warn("%s Write queue empty", self)
|
|
60
|
+
return NextSocketAction::SUSPEND
|
|
61
|
+
end
|
|
62
|
+
buf = @write_queue[0]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
len = @outfile.syswrite(buf)
|
|
66
|
+
|
|
67
|
+
if len == 0
|
|
68
|
+
return NextSocketAction::CONTINUE
|
|
69
|
+
elsif len < buf.length
|
|
70
|
+
buf[0 .. len-1] = ""
|
|
71
|
+
return NextSocketAction::CONTINUE
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
@lock.synchronize do
|
|
75
|
+
@write_queue.delete_at(0)
|
|
76
|
+
if @write_queue.empty?
|
|
77
|
+
return NextSocketAction::SUSPEND
|
|
78
|
+
else
|
|
79
|
+
return NextSocketAction::CONTINUE
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
rescue Exception => e
|
|
84
|
+
BayLog.error_e(e)
|
|
85
|
+
close()
|
|
86
|
+
return NextSocketAction::CLOSE
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def check_timeout(duration_sec)
|
|
91
|
+
return false
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def close()
|
|
95
|
+
if @outfile != nil
|
|
96
|
+
@outfile.close()
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
######################################################
|
|
101
|
+
# Implements Valve
|
|
102
|
+
######################################################
|
|
103
|
+
|
|
104
|
+
def open_valve()
|
|
105
|
+
@spin_handler.ask_to_callback(self)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
######################################################
|
|
109
|
+
# Other methods
|
|
110
|
+
######################################################
|
|
111
|
+
def post(bytes, tag)
|
|
112
|
+
@lock.synchronize do
|
|
113
|
+
empty = @write_queue.empty?
|
|
114
|
+
@write_queue << bytes
|
|
115
|
+
if empty
|
|
116
|
+
open_valve()
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
require 'baykit/bayserver/agent/non_blocking_handler'
|
|
2
|
+
require 'baykit/bayserver/agent/channel_listener'
|
|
3
|
+
require 'baykit/bayserver/protocol/protocol_exception'
|
|
4
|
+
require 'baykit/bayserver/util/reusable'
|
|
5
|
+
require 'baykit/bayserver/util/postman'
|
|
6
|
+
|
|
7
|
+
module Baykit
|
|
8
|
+
module BayServer
|
|
9
|
+
module Agent
|
|
10
|
+
module Transporter
|
|
11
|
+
class Transporter
|
|
12
|
+
include Baykit::BayServer::Agent::ChannelListener # implements
|
|
13
|
+
include Baykit::BayServer::Util::Reusable # implements
|
|
14
|
+
include Baykit::BayServer::Util::Postman # implements
|
|
15
|
+
|
|
16
|
+
include Baykit::BayServer::Protocol
|
|
17
|
+
include Baykit::BayServer::Util
|
|
18
|
+
|
|
19
|
+
class WriteUnit
|
|
20
|
+
attr :buf
|
|
21
|
+
attr :adr
|
|
22
|
+
attr :tag
|
|
23
|
+
attr :listener
|
|
24
|
+
|
|
25
|
+
def initialize(buf, adr, tag, lis)
|
|
26
|
+
@buf = buf
|
|
27
|
+
@adr = adr
|
|
28
|
+
@tag = tag
|
|
29
|
+
@listener = lis
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def done()
|
|
33
|
+
if @listener != nil
|
|
34
|
+
@listener.call()
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
# Abstract methods
|
|
41
|
+
#
|
|
42
|
+
def secure()
|
|
43
|
+
raise NotImplementedError()
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def handshake_nonblock()
|
|
47
|
+
raise NotImplementedError()
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def handshake_finished()
|
|
51
|
+
raise NotImplementedError()
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def read_nonblock()
|
|
55
|
+
raise NotImplementedError()
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def write_nonblock(buf, adr)
|
|
59
|
+
raise NotImplementedError()
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
attr :data_listener
|
|
64
|
+
attr :server_mode
|
|
65
|
+
attr :trace_ssl
|
|
66
|
+
attr :infile
|
|
67
|
+
attr :write_queue
|
|
68
|
+
attr :finale
|
|
69
|
+
attr :initialized
|
|
70
|
+
attr :ch_valid
|
|
71
|
+
attr :read_buf
|
|
72
|
+
attr :socket_io
|
|
73
|
+
attr :handshaked
|
|
74
|
+
attr :lock
|
|
75
|
+
attr :capacity
|
|
76
|
+
attr :non_blocking_handler
|
|
77
|
+
attr :write_only
|
|
78
|
+
|
|
79
|
+
def initialize(server_mode, bufsiz, trace_ssl, write_only = false)
|
|
80
|
+
@server_mode = server_mode
|
|
81
|
+
@write_queue = []
|
|
82
|
+
@lock = Monitor.new()
|
|
83
|
+
@capacity = bufsiz
|
|
84
|
+
@read_buf = StringUtil.alloc(bufsiz)
|
|
85
|
+
@trace_ssl = trace_ssl
|
|
86
|
+
reset()
|
|
87
|
+
@write_only = write_only
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def to_s()
|
|
91
|
+
return "tpt[#{@data_listener.to_s}]"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def init(nb_hnd, ch, lis)
|
|
95
|
+
if ch == nil
|
|
96
|
+
raise ArgumentError.new("Channel is nil")
|
|
97
|
+
end
|
|
98
|
+
if lis == nil
|
|
99
|
+
raise ArgumentError.new("Data listener is nil")
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
if @initialized
|
|
103
|
+
BayLog.error("%s This transporter is already in use by channel: %s", self, @ch)
|
|
104
|
+
raise Sink.new("IllegalState")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
if !@write_queue.empty?
|
|
108
|
+
raise Sink.new()
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
@channel_handler = nb_hnd
|
|
112
|
+
@data_listener = lis
|
|
113
|
+
@ch = ch
|
|
114
|
+
@initialized = true
|
|
115
|
+
set_valid(true)
|
|
116
|
+
@handshaked = false
|
|
117
|
+
@channel_handler.add_channel_listener(ch, self)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
######################################################
|
|
121
|
+
# Implements Reusable
|
|
122
|
+
######################################################
|
|
123
|
+
def reset()
|
|
124
|
+
|
|
125
|
+
# Check write queue
|
|
126
|
+
if !@write_queue.empty?
|
|
127
|
+
raise Sink.new("Write queue is not empty")
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
@finale = false
|
|
131
|
+
@initialized = false
|
|
132
|
+
@ch = nil
|
|
133
|
+
set_valid(false)
|
|
134
|
+
@handshaked = false
|
|
135
|
+
@socket_io = nil
|
|
136
|
+
@read_buf.clear()
|
|
137
|
+
@write_only = false
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
######################################################
|
|
141
|
+
# Implements Postman
|
|
142
|
+
######################################################
|
|
143
|
+
|
|
144
|
+
def post(buf, adr, tag, &lisnr)
|
|
145
|
+
check_initialized()
|
|
146
|
+
|
|
147
|
+
BayLog.debug("%s post: %s len=%d", self, tag, buf.length)
|
|
148
|
+
|
|
149
|
+
@lock.synchronize do
|
|
150
|
+
|
|
151
|
+
if !@ch_valid
|
|
152
|
+
raise IOError.new("#{self} channel is invalid, Ignore")
|
|
153
|
+
else
|
|
154
|
+
unt = WriteUnit.new(buf, adr, tag, lisnr)
|
|
155
|
+
@write_queue << unt
|
|
156
|
+
|
|
157
|
+
BayLog.trace("%s sendBytes->askToWrite", self)
|
|
158
|
+
@channel_handler.ask_to_write(@ch)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
######################################################
|
|
165
|
+
# Implements Valve
|
|
166
|
+
######################################################
|
|
167
|
+
|
|
168
|
+
def open_valve()
|
|
169
|
+
BayLog.debug("%s resume", self)
|
|
170
|
+
@channel_handler.ask_to_read(@ch)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def abort()
|
|
174
|
+
BayLog.debug("%s abort", self)
|
|
175
|
+
@channel_handler.ask_to_close(@ch)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def zombie?()
|
|
179
|
+
return @ch != nil && !@ch_valid
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
######################################################
|
|
184
|
+
# Implements ChannelListener
|
|
185
|
+
######################################################
|
|
186
|
+
|
|
187
|
+
def on_readable(chk_ch)
|
|
188
|
+
check_channel(chk_ch)
|
|
189
|
+
BayLog.trace("%s on_readable", self)
|
|
190
|
+
|
|
191
|
+
if !@handshaked
|
|
192
|
+
begin
|
|
193
|
+
handshake_nonblock()
|
|
194
|
+
@handshaked = true
|
|
195
|
+
rescue IO::WaitReadable => e
|
|
196
|
+
BayLog.debug("%s Handshake status: read more", @data_listener)
|
|
197
|
+
return NextSocketAction::CONTINUE
|
|
198
|
+
rescue IO::WaitWritable => e
|
|
199
|
+
BayLog.debug("%s Handshake status: write more", @data_listener)
|
|
200
|
+
@channel_handler.ask_to_write(@ch)
|
|
201
|
+
return NextSocketAction::CONTINUE
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# read data
|
|
206
|
+
# If closed, EOFError is raised
|
|
207
|
+
if @read_buf.length == 0
|
|
208
|
+
eof = false
|
|
209
|
+
begin
|
|
210
|
+
adr = read_nonblock()
|
|
211
|
+
rescue IO::WaitReadable => e
|
|
212
|
+
BayLog.debug("%s Read status: read more", self)
|
|
213
|
+
return NextSocketAction::CONTINUE
|
|
214
|
+
rescue IO::WaitWritable => e
|
|
215
|
+
BayLog.debug("%s Read status: write more", self)
|
|
216
|
+
@channel_handler.ask_to_write(@ch)
|
|
217
|
+
return NextSocketAction::CONTINUE
|
|
218
|
+
rescue EOFError => e
|
|
219
|
+
BayLog.debug("%s EOF", self)
|
|
220
|
+
eof = true
|
|
221
|
+
rescue SystemCallError => e
|
|
222
|
+
BayLog.debug_e(e, "SystemCall Error")
|
|
223
|
+
eof = true
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
if eof
|
|
227
|
+
return @data_listener.notify_eof()
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
BayLog.debug("%s read %d bytes", self, @read_buf.length)
|
|
232
|
+
|
|
233
|
+
begin
|
|
234
|
+
begin
|
|
235
|
+
next_action = @data_listener.notify_read(@read_buf, adr)
|
|
236
|
+
BayLog.trace("%s returned from notify_read(). next action=%d", @ship, next_action)
|
|
237
|
+
return next_action
|
|
238
|
+
rescue UpgradeException => e
|
|
239
|
+
BayLog.debug("%s Protocol upgrade", @ship)
|
|
240
|
+
return @data_listener.notify_read(@read_buf, adr)
|
|
241
|
+
ensure
|
|
242
|
+
@read_buf.clear()
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
rescue ProtocolException => e
|
|
247
|
+
close = @data_listener.notify_protocol_error(e)
|
|
248
|
+
if !close && @server_mode
|
|
249
|
+
return NextSocketAction::CONTINUE
|
|
250
|
+
else
|
|
251
|
+
return NextSocketAction::CLOSE
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def on_writable(chk_ch)
|
|
257
|
+
check_channel(chk_ch)
|
|
258
|
+
|
|
259
|
+
BayLog.trace("%s Writable", self)
|
|
260
|
+
|
|
261
|
+
if !@handshaked
|
|
262
|
+
begin
|
|
263
|
+
handshake_nonblock
|
|
264
|
+
BayLog.debug("#{@ship} Handshake done")
|
|
265
|
+
@handshaked = true
|
|
266
|
+
rescue IO::WaitReadable => e
|
|
267
|
+
BayLog.debug("#{@ship} Handshake status: read more")
|
|
268
|
+
return NextSocketAction::READ
|
|
269
|
+
rescue IO::WaitWritable => e
|
|
270
|
+
BayLog.debug("#{@ship} Handshake status: write more")
|
|
271
|
+
return NextSocketAction::CONTINUE
|
|
272
|
+
rescue StandardError => e
|
|
273
|
+
BayLog.error_e(e, " Error on handshaking: %s", self, e);
|
|
274
|
+
set_valid(false)
|
|
275
|
+
return NextSocketAction::CLOSE
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
if !@ch_valid
|
|
280
|
+
return NextSocketAction::CLOSE
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
empty = false
|
|
284
|
+
while true
|
|
285
|
+
#BayLog.debug "#{self} Send queue len=#{@write_queue.length}"
|
|
286
|
+
wunit = nil
|
|
287
|
+
@lock.synchronize do
|
|
288
|
+
if @write_queue.empty?
|
|
289
|
+
empty = true
|
|
290
|
+
break
|
|
291
|
+
end
|
|
292
|
+
wunit = @write_queue[0]
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
if empty
|
|
296
|
+
break
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
BayLog.debug("%s Try to write: pkt=%s buflen=%d chValid=%s", self, wunit.tag, wunit.buf.length, @ch_valid)
|
|
300
|
+
|
|
301
|
+
if @ch_valid && wunit.buf.length > 0
|
|
302
|
+
begin
|
|
303
|
+
len = write_nonblock(wunit.buf, wunit.adr)
|
|
304
|
+
wunit.buf[0, len] = ""
|
|
305
|
+
if wunit.buf.length > 0
|
|
306
|
+
# Data remains
|
|
307
|
+
break
|
|
308
|
+
end
|
|
309
|
+
rescue IO::WaitWritable => e
|
|
310
|
+
BayLog.debug_e(e, "%s Write will be pended", self)
|
|
311
|
+
break
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# packet send complete
|
|
316
|
+
wunit.done()
|
|
317
|
+
|
|
318
|
+
@lock.synchronize do
|
|
319
|
+
@write_queue.delete_at(0)
|
|
320
|
+
empty = @write_queue.empty?
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
if empty
|
|
324
|
+
break
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
if empty
|
|
329
|
+
if @finale
|
|
330
|
+
BayLog.trace("%s finale return Close", self)
|
|
331
|
+
state = NextSocketAction::CLOSE
|
|
332
|
+
elsif @write_only
|
|
333
|
+
state = NextSocketAction::SUSPEND
|
|
334
|
+
else
|
|
335
|
+
state = NextSocketAction::READ # will be handled as "Write Off"
|
|
336
|
+
end
|
|
337
|
+
else
|
|
338
|
+
state = NextSocketAction::CONTINUE
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
return state
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def on_connectable(chk_ch)
|
|
346
|
+
check_channel(chk_ch)
|
|
347
|
+
BayLog.trace("%s onConnectable", self)
|
|
348
|
+
|
|
349
|
+
# check connected
|
|
350
|
+
begin
|
|
351
|
+
buf = ""
|
|
352
|
+
@ch.syswrite(buf)
|
|
353
|
+
rescue => e
|
|
354
|
+
BayLog.error("Connect failed: %s", e)
|
|
355
|
+
return NextSocketAction::CLOSE
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
return @data_listener.notify_connect()
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
def check_timeout(chk_ch, duration)
|
|
362
|
+
check_channel(chk_ch)
|
|
363
|
+
|
|
364
|
+
return @data_listener.check_timeout(duration)
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def on_error(chk_ch, e)
|
|
368
|
+
check_channel(chk_ch)
|
|
369
|
+
BayLog.trace("%s onError: %s", self, e)
|
|
370
|
+
|
|
371
|
+
begin
|
|
372
|
+
raise e
|
|
373
|
+
rescue OpenSSL::SSL::SSLError => e
|
|
374
|
+
if @trace_ssl
|
|
375
|
+
BayLog.error_e(e, "%s SSL Error: %s", self, e)
|
|
376
|
+
else
|
|
377
|
+
BayLog.debug_e(e, "%s SSL Error: %s", self, e)
|
|
378
|
+
end
|
|
379
|
+
rescue => e
|
|
380
|
+
BayLog.error_e(e)
|
|
381
|
+
end
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
def on_closed(chk_ch)
|
|
385
|
+
begin
|
|
386
|
+
check_channel(chk_ch)
|
|
387
|
+
rescue => e
|
|
388
|
+
BayLog.error_e(e)
|
|
389
|
+
return
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
set_valid(false)
|
|
393
|
+
|
|
394
|
+
@lock.synchronize do
|
|
395
|
+
# Clear queue
|
|
396
|
+
@write_queue.each do |write_unit|
|
|
397
|
+
write_unit.done()
|
|
398
|
+
end
|
|
399
|
+
@write_queue.clear()
|
|
400
|
+
|
|
401
|
+
@data_listener.notify_close()
|
|
402
|
+
end
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
def flush()
|
|
406
|
+
check_initialized()
|
|
407
|
+
|
|
408
|
+
BayLog.debug("%s flush", self)
|
|
409
|
+
|
|
410
|
+
if @ch_valid
|
|
411
|
+
empty = false
|
|
412
|
+
@lock.synchronize do
|
|
413
|
+
empty = @write_queue.empty?
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
if !empty
|
|
417
|
+
BayLog.debug("%s flush->askToWrite", self)
|
|
418
|
+
@channel_handler.ask_to_write(@ch)
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
def post_end()
|
|
424
|
+
check_initialized()
|
|
425
|
+
|
|
426
|
+
BayLog.debug("%s postEnd vld=%s", self, self.ch_valid)
|
|
427
|
+
|
|
428
|
+
# setting order is QUITE important finalState->finale
|
|
429
|
+
@finale = true
|
|
430
|
+
|
|
431
|
+
if @ch_valid
|
|
432
|
+
empty = nil
|
|
433
|
+
@lock.synchronize do
|
|
434
|
+
empty = @write_queue.empty?
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
if !empty
|
|
438
|
+
BayLog.debug("%s Tpt: sendEnd->askToWrite", self)
|
|
439
|
+
@channel_handler.ask_to_write(@ch)
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
protected
|
|
445
|
+
def check_channel(chk_ch)
|
|
446
|
+
if chk_ch != @ch
|
|
447
|
+
raise Sink.new("Invalid transporter instance (ship was returned?): #{chk_ch}")
|
|
448
|
+
end
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
def check_initialized
|
|
452
|
+
if !@initialized
|
|
453
|
+
raise Sink.new("Illegal State")
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
def set_valid(valid)
|
|
458
|
+
@ch_valid = valid
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
end
|
|
464
|
+
end
|
|
465
|
+
end
|
|
466
|
+
|