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,64 @@
1
+ require 'baykit/bayserver/util/class_util'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Protocol
6
+ class ProtocolHandler
7
+ include Baykit::BayServer::Util::Reusable # implements
8
+
9
+ include Baykit::BayServer::Util
10
+
11
+ attr :packet_unpacker
12
+ attr :packet_packer
13
+ attr :command_unpacker
14
+ attr :command_packer
15
+ attr :packet_store
16
+ attr :server_mode
17
+ attr_accessor :ship
18
+
19
+ def to_s()
20
+ return ClassUtil.get_local_name(self.class) + " ship=" + ship.to_s
21
+ end
22
+
23
+ ##################################################
24
+ # Implements Reusable
25
+ ##################################################
26
+ def reset()
27
+ @command_unpacker.reset()
28
+ @command_packer.reset()
29
+ @packet_unpacker.reset()
30
+ @packet_packer.reset()
31
+ end
32
+
33
+ ##################################################
34
+ # Abstract methods
35
+ ##################################################
36
+
37
+ def protocol()
38
+ raise NotImplementedError()
39
+ end
40
+
41
+ #
42
+ # Get max of request data size (maybe not packet size)
43
+ #
44
+ def max_req_packet_data_size()
45
+ raise NotImplementedError()
46
+ end
47
+
48
+ #
49
+ # Get max of response data size (maybe not packet size)
50
+ #
51
+ def max_res_packet_data_size()
52
+ raise NotImplementedError()
53
+ end
54
+
55
+ ##################################################
56
+ # Other methods
57
+ ##################################################
58
+ def bytes_received(buf)
59
+ return @packet_unpacker.bytes_received(buf)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,14 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Protocol
5
+ module ProtocolHandlerFactory
6
+ #
7
+ # interface methods
8
+ #
9
+ # create_protocol_handler(pkt_store)
10
+ #
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,109 @@
1
+ require 'baykit/bayserver/agent/grand_agent'
2
+ require 'baykit/bayserver/util/object_store'
3
+ require 'baykit/bayserver/util/string_util'
4
+
5
+ module Baykit
6
+ module BayServer
7
+ module Protocol
8
+ class ProtocolHandlerStore < Baykit::BayServer::Util::ObjectStore
9
+ include Baykit::BayServer::Agent
10
+ include Baykit::BayServer::Util
11
+
12
+ class AgentListener
13
+ include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener # implements
14
+
15
+ def add(agt)
16
+ ProtocolHandlerStore.proto_map.values().each {|ifo| ifo.add_agent(agt) }
17
+ end
18
+
19
+ def remove(agt)
20
+ ProtocolHandlerStore.proto_map.values().each { |ifo| ifo.remove_agent(agt) }
21
+ end
22
+ end
23
+
24
+
25
+ class ProtocolInfo
26
+ attr :protocol
27
+ attr :server_mode
28
+ attr :protocol_handler_factory
29
+ attr :stores
30
+
31
+ def initialize(proto, svr_mode, proto_hnd_factory)
32
+ @protocol = proto
33
+ @server_mode = svr_mode
34
+ @protocol_handler_factory = proto_hnd_factory
35
+
36
+ # Agent ID => ProtocolHandlerStore
37
+ @stores = {}
38
+ end
39
+
40
+ def add_agent(agt)
41
+ store = PacketStore.get_store(@protocol, agt.agent_id);
42
+ @stores[agt.agent_id] = ProtocolHandlerStore.new(@protocol, @server_mode, @protocol_handler_factory, store);
43
+ end
44
+
45
+ def remove_agent(agt)
46
+ @stores.delete(agt.agent_id);
47
+ end
48
+
49
+ end
50
+
51
+ class << self
52
+ attr :proto_map
53
+ end
54
+ @proto_map = {}
55
+
56
+
57
+ attr :protocol
58
+ attr :server_mode
59
+
60
+ def initialize(proto, svr_mode, proto_hnd_factory, pkt_store)
61
+ super()
62
+ @protocol = proto
63
+ @server_mode = svr_mode
64
+ @factory = -> do
65
+ return proto_hnd_factory.create_protocol_handler(pkt_store)
66
+ end
67
+ end
68
+
69
+ def print_usage(indent)
70
+ BayLog.info("%sProtocolHandlerStore(%s%s) Usage:", StringUtil.indent(indent), @protocol, @server_mode ? "s" : "c")
71
+ super(indent+1)
72
+ end
73
+
74
+ ######################################################
75
+ # class methods
76
+ ######################################################
77
+ def self.init()
78
+ GrandAgent.add_lifecycle_listener(AgentListener.new())
79
+ end
80
+
81
+ def self.get_store(protocol, svr_mode, agent_id)
82
+ return @proto_map[construct_protocol(protocol, svr_mode)].stores[agent_id]
83
+ end
84
+
85
+ def self.get_stores(agent_id)
86
+ store_list = []
87
+ @proto_map.values.each do |ifo|
88
+ store_list.append(ifo.stores[agent_id])
89
+ end
90
+ return store_list
91
+ end
92
+
93
+ def self.register_protocol(protocol, svr_mode, proto_hnd_factory)
94
+ if !@proto_map.include?(construct_protocol(protocol, svr_mode))
95
+ @proto_map[construct_protocol(protocol, svr_mode)] = ProtocolInfo.new(protocol, svr_mode, proto_hnd_factory)
96
+ end
97
+ end
98
+
99
+ def self.construct_protocol(protocol, svr_mode)
100
+ if(svr_mode)
101
+ return protocol + "-s"
102
+ else
103
+ return protocol + "-c"
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,22 @@
1
+ #
2
+ # Ship sinks!!
3
+ # Exception thrown by some bugs
4
+ #
5
+
6
+ module Baykit
7
+ module BayServer
8
+ class Sink < StandardError
9
+
10
+ def initialize(fmt = nil, *args)
11
+ super(if fmt == nil
12
+ ""
13
+ elsif args == nil
14
+ sprintf("%s", fmt)
15
+ else
16
+ sprintf(fmt, *args)
17
+ end + "(>_<)")
18
+ end
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,38 @@
1
+ require 'baykit/bayserver/util/counter'
2
+ module Baykit
3
+ module BayServer
4
+ module Taxi
5
+ class Taxi
6
+ include Baykit::BayServer::Util
7
+ #
8
+ # abstract method
9
+ #
10
+ # depart()
11
+ #
12
+
13
+ class << self
14
+ attr :taxi_id_counter
15
+ end
16
+ @taxi_id_counter = Counter.new()
17
+
18
+ attr :taxi_id;
19
+
20
+ def initialize
21
+ @taxi_id = Taxi.taxi_id_counter.next()
22
+ end
23
+
24
+ def to_s()
25
+ return "Taxi##{@taxi_id}"
26
+ end
27
+
28
+ def run()
29
+ BayLog.trace("%s Start taxi on: %s", self, Thread.current.name);
30
+ self.depart();
31
+ BayLog.trace("%s End taxi on: %s", self, Thread.current.name);
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,31 @@
1
+ require 'baykit/bayserver/util/executor_service'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Taxi
6
+ class TaxiRunner
7
+ include Baykit::BayServer::Util
8
+
9
+ # define class instance accessor
10
+ class << self
11
+ attr :exe
12
+ end
13
+
14
+ def TaxiRunner.init(num_agents)
15
+ @exe = ExecutorService.new("TaxiRunner", num_agents)
16
+ end
17
+
18
+ def TaxiRunner.post(taxi)
19
+ begin
20
+ @exe.submit(taxi)
21
+ return true
22
+ rescue => e
23
+ BayLog.error_e(e)
24
+ return false
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,20 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Tours
5
+
6
+ module ContentConsumeListener
7
+ # interface
8
+ #
9
+ # void contentConsumed(int len, boolean resume);
10
+ #
11
+
12
+ DEV_NULL = Proc.new do
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,4 @@
1
+ require 'baykit/bayserver/tours/tour'
2
+ require 'baykit/bayserver/tours/tour_req'
3
+ require 'baykit/bayserver/tours/tour_res'
4
+ require 'baykit/bayserver/tours/tour_store'
@@ -0,0 +1,102 @@
1
+ require 'baykit/bayserver/taxi/taxi'
2
+ require 'baykit/bayserver/taxi/taxi_runner'
3
+ require 'baykit/bayserver/agent/next_socket_action'
4
+
5
+ require 'baykit/bayserver/util/valve'
6
+ require 'baykit/bayserver/util/string_util'
7
+
8
+
9
+ module Baykit
10
+ module BayServer
11
+ module Tours
12
+ class ReadFileTaxi < Baykit::BayServer::Taxi::Taxi
13
+ include Baykit::BayServer::Util::Valve #implements
14
+
15
+ include Baykit::BayServer::Agent
16
+ include Baykit::BayServer::Taxi
17
+ include Baykit::BayServer::Util
18
+
19
+ attr :infile
20
+ attr :ch_valid
21
+ attr :data_listener
22
+ attr :buf
23
+ attr :buf_size
24
+ attr :running
25
+ attr :lock
26
+
27
+ def initialize(buf_size)
28
+ super()
29
+ @buf_size = buf_size
30
+ @buf = StringUtil.alloc(buf_size)
31
+ @lock = Monitor.new()
32
+ end
33
+
34
+ def to_s()
35
+ return super.to_s() + " " + @data_listener.to_s()
36
+ end
37
+
38
+ def init(infile, data_listener)
39
+ @data_listener = data_listener
40
+ @infile = infile
41
+ @ch_valid = true
42
+ end
43
+
44
+ ######################################################
45
+ # implements Valve
46
+ ######################################################
47
+
48
+ def open_valve()
49
+ @lock.synchronize do
50
+ next_run()
51
+ end
52
+ end
53
+
54
+ ######################################################
55
+ # implements Taxi
56
+ ######################################################
57
+
58
+ def depart()
59
+ @lock.synchronize do
60
+ begin
61
+ @buf.clear()
62
+ @infile.read(@buf_size, @buf)
63
+
64
+ if @buf.length == 0
65
+ @data_listener.notify_eof()
66
+ close()
67
+ return
68
+ end
69
+
70
+ act = @data_listener.notify_read(@buf, nil)
71
+
72
+ @running = false
73
+ if act == NextSocketAction::CONTINUE
74
+ next_run()
75
+ end
76
+
77
+ rescue Exception => e
78
+ BayLog.error_e(e)
79
+ close()
80
+ end
81
+ end
82
+ end
83
+
84
+
85
+ def next_run()
86
+ if @running
87
+ # If running, not posted because next run exists
88
+ return
89
+ end
90
+ @running = true
91
+ TaxiRunner.post(self)
92
+ end
93
+
94
+ def close()
95
+ @ch_valid = false
96
+ @infile.close()
97
+ @data_listener.notify_close()
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,37 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Tours
4
+
5
+ module ReqContentHandler
6
+ #
7
+ # interface
8
+ #
9
+ # void onReadContent(Tour tur, byte[] buf, int start, int len) throws IOException;
10
+ # void onEndContent(Tour tur) throws IOException, HttpException;
11
+ # void onAbort(Tour tur);
12
+ #
13
+
14
+ #DEV_NULL = nil
15
+ end
16
+
17
+ class DevNullReqContentHandler
18
+ include ReqContentHandler # implements
19
+ def on_read_content(tur, buf, start, len)
20
+ end
21
+
22
+ def on_end_content(tur)
23
+ end
24
+
25
+ def on_abort(tur)
26
+ return false
27
+ end
28
+ end
29
+
30
+ module ReqContentHandler
31
+ DEV_NULL = DevNullReqContentHandler.new()
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+
@@ -0,0 +1,65 @@
1
+ require 'baykit/bayserver/train/train'
2
+
3
+ require 'baykit/bayserver/tours/tour'
4
+ require 'baykit/bayserver/util/string_util'
5
+ require 'baykit/bayserver/util/http_status'
6
+
7
+
8
+ module Baykit
9
+ module BayServer
10
+ module Tours
11
+ class SendFileTrain < Baykit::BayServer::Train::Train
12
+
13
+ include Baykit::BayServer::Util
14
+
15
+ attr :file
16
+
17
+ def initialize(tur, file)
18
+ super(tur)
19
+ @file = file
20
+ end
21
+
22
+ ######################################################
23
+ # implements Train
24
+ ######################################################
25
+
26
+ def run()
27
+
28
+ @tour.res.set_consume_listener do |len, resume| end
29
+
30
+ size = @tour.ship.protocol_handler.max_packet_data_size
31
+ buf = StringUtil.alloc(size)
32
+ File.open(file, "r") do |fd|
33
+ begin
34
+ while true
35
+
36
+ while !@tour.res.available
37
+ sleep(0.1)
38
+ end
39
+
40
+ begin
41
+ fd.sysread(size, buf);
42
+ rescue EOFError => e
43
+ break
44
+ rescue Exception => e
45
+ @tour.res.send_error(@tour_id, HttpStatus::INTERNAL_SERVER_ERROR, e)
46
+ break
47
+ end
48
+
49
+ @tour.res.send_content(@tour_id, buf, 0, buf.length);
50
+
51
+ while !@tour.res.available
52
+ sleep(0.1)
53
+ end
54
+ end
55
+
56
+ @tour.res.end_content(@tour_id)
57
+ rescue Exception => e
58
+ BayLog.error_e(e);
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,93 @@
1
+ require 'baykit/bayserver/agent/next_socket_action'
2
+ require 'baykit/bayserver/watercraft/yacht'
3
+ require 'baykit/bayserver/util/string_util'
4
+ require 'baykit/bayserver/util/reusable'
5
+
6
+ module Baykit
7
+ module BayServer
8
+ module Tours
9
+ class SendFileYacht < Baykit::BayServer::WaterCraft::Yacht
10
+
11
+ include Baykit::BayServer::Agent
12
+ include Baykit::BayServer::Util
13
+
14
+ attr :tour
15
+ attr :tour_id
16
+
17
+ attr :file_name
18
+ attr :file_len
19
+ attr :file_wrote_len
20
+
21
+ def initialize
22
+ super
23
+ reset()
24
+ end
25
+
26
+ def to_s()
27
+ return "filyt##{@yacht_id}/#{@object_id} tour=#{@tour} id=#{@tour_id}";
28
+ end
29
+
30
+ ######################################################
31
+ # implements Reusable
32
+ ######################################################
33
+
34
+ def reset()
35
+ @file_wrote_len = 0
36
+ @file_len = 0
37
+ @tour = nil
38
+ @tour_id = 0
39
+ end
40
+
41
+ ######################################################
42
+ # implements Yacht
43
+ ######################################################
44
+
45
+ def notify_read(buf, adr)
46
+ @file_wrote_len += buf.length
47
+ BayLog.trace("%s read file %d bytes: total=%d/%d", self, buf.length, @file_wrote_len, @file_len)
48
+ available = @tour.res.send_content(@tour_id, buf, 0, buf.length)
49
+
50
+ if available
51
+ return NextSocketAction::CONTINUE;
52
+ else
53
+ return NextSocketAction::SUSPEND;
54
+ end
55
+
56
+ end
57
+
58
+ def notify_eof()
59
+ BayLog.trace("%s EOF(^o^) %s", self, @file_name)
60
+ @tour.res.end_content(@tour_id)
61
+ return NextSocketAction::CLOSE
62
+ end
63
+
64
+ def notify_close()
65
+ BayLog.trace("File closed: %s", @file_name)
66
+ end
67
+
68
+ def check_timeout(duration)
69
+ BayLog.trace("Check timeout: %s", @file_name)
70
+ end
71
+
72
+ ######################################################
73
+ # Custom methods
74
+ ######################################################
75
+
76
+ def init(tur, file_name, tp)
77
+ init_yacht()
78
+ @tour = tur
79
+ @tour_id = tur.id()
80
+ @file_name = file_name
81
+ @file_len = File.size(file_name)
82
+ #file = File.open(file_name, "rb")
83
+ tur.res.set_consume_listener do |len, resume|
84
+ if resume
85
+ tp.open_valve();
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+