bayserver-core 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
+