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.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
  3. data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
  4. data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
  5. data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
  6. data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
  7. data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
  8. data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
  9. data/lib/baykit/bayserver/agent/package.rb +3 -0
  10. data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
  11. data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
  12. data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
  13. data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
  14. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
  15. data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
  16. data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
  17. data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
  18. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
  19. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
  20. data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
  21. data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
  22. data/lib/baykit/bayserver/bay_dockers.rb +60 -0
  23. data/lib/baykit/bayserver/bay_exception.rb +12 -0
  24. data/lib/baykit/bayserver/bay_log.rb +148 -0
  25. data/lib/baykit/bayserver/bay_message.rb +20 -0
  26. data/lib/baykit/bayserver/bayserver.rb +529 -0
  27. data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
  28. data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
  29. data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
  30. data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
  31. data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
  32. data/lib/baykit/bayserver/bcf/package.rb +6 -0
  33. data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
  34. data/lib/baykit/bayserver/config_exception.rb +25 -0
  35. data/lib/baykit/bayserver/constants.rb +8 -0
  36. data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
  37. data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
  38. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
  39. data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
  40. data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
  41. data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
  42. data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
  43. data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
  44. data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
  45. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
  46. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
  47. data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
  48. data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
  49. data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
  50. data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
  51. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
  52. data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
  53. data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
  54. data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
  55. data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
  56. data/lib/baykit/bayserver/docker/city.rb +22 -0
  57. data/lib/baykit/bayserver/docker/club.rb +45 -0
  58. data/lib/baykit/bayserver/docker/docker.rb +8 -0
  59. data/lib/baykit/bayserver/docker/harbor.rb +34 -0
  60. data/lib/baykit/bayserver/docker/log.rb +17 -0
  61. data/lib/baykit/bayserver/docker/package.rb +12 -0
  62. data/lib/baykit/bayserver/docker/permission.rb +18 -0
  63. data/lib/baykit/bayserver/docker/port.rb +39 -0
  64. data/lib/baykit/bayserver/docker/reroute.rb +17 -0
  65. data/lib/baykit/bayserver/docker/secure.rb +22 -0
  66. data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
  67. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
  68. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
  69. data/lib/baykit/bayserver/docker/town.rb +30 -0
  70. data/lib/baykit/bayserver/docker/trouble.rb +17 -0
  71. data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
  72. data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
  73. data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
  74. data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
  75. data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
  76. data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
  77. data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
  78. data/lib/baykit/bayserver/http_exception.rb +33 -0
  79. data/lib/baykit/bayserver/mem_usage.rb +104 -0
  80. data/lib/baykit/bayserver/protocol/command.rb +21 -0
  81. data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
  82. data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
  83. data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
  84. data/lib/baykit/bayserver/protocol/package.rb +15 -0
  85. data/lib/baykit/bayserver/protocol/packet.rb +63 -0
  86. data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
  87. data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
  88. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
  89. data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
  90. data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
  91. data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
  92. data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
  93. data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
  94. data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
  95. data/lib/baykit/bayserver/sink.rb +22 -0
  96. data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
  97. data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
  98. data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
  99. data/lib/baykit/bayserver/tours/package.rb +4 -0
  100. data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
  101. data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
  102. data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
  103. data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
  104. data/lib/baykit/bayserver/tours/tour.rb +195 -0
  105. data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
  106. data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
  107. data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
  108. data/lib/baykit/bayserver/train/train.rb +54 -0
  109. data/lib/baykit/bayserver/train/train_runner.rb +32 -0
  110. data/lib/baykit/bayserver/util/byte_array.rb +54 -0
  111. data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
  112. data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
  113. data/lib/baykit/bayserver/util/char_util.rb +22 -0
  114. data/lib/baykit/bayserver/util/cities.rb +45 -0
  115. data/lib/baykit/bayserver/util/class_util.rb +17 -0
  116. data/lib/baykit/bayserver/util/counter.rb +23 -0
  117. data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
  118. data/lib/baykit/bayserver/util/executor_service.rb +81 -0
  119. data/lib/baykit/bayserver/util/groups.rb +110 -0
  120. data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
  121. data/lib/baykit/bayserver/util/headers.rb +194 -0
  122. data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
  123. data/lib/baykit/bayserver/util/http_status.rb +60 -0
  124. data/lib/baykit/bayserver/util/http_util.rb +157 -0
  125. data/lib/baykit/bayserver/util/io_util.rb +32 -0
  126. data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
  127. data/lib/baykit/bayserver/util/key_val.rb +15 -0
  128. data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
  129. data/lib/baykit/bayserver/util/locale.rb +30 -0
  130. data/lib/baykit/bayserver/util/md5_password.rb +24 -0
  131. data/lib/baykit/bayserver/util/message.rb +56 -0
  132. data/lib/baykit/bayserver/util/mimes.rb +27 -0
  133. data/lib/baykit/bayserver/util/object_factory.rb +13 -0
  134. data/lib/baykit/bayserver/util/object_store.rb +74 -0
  135. data/lib/baykit/bayserver/util/postman.rb +35 -0
  136. data/lib/baykit/bayserver/util/reusable.rb +13 -0
  137. data/lib/baykit/bayserver/util/selector.rb +141 -0
  138. data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
  139. data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
  140. data/lib/baykit/bayserver/util/string_util.rb +73 -0
  141. data/lib/baykit/bayserver/util/sys_util.rb +138 -0
  142. data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
  143. data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
  144. data/lib/baykit/bayserver/util/valve.rb +15 -0
  145. data/lib/baykit/bayserver/version.rb +7 -0
  146. data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
  147. data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
  148. data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
  149. 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
+
@@ -0,0 +1,11 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Agent
5
+ class UpgradeException < StandardError
6
+
7
+ end
8
+ end
9
+ end
10
+ end
11
+