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,194 @@
1
+ require 'baykit/bayserver/util/http_status'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Util
6
+ class Headers
7
+ include Baykit::BayServer::Util
8
+
9
+ #
10
+ # known header names
11
+ #
12
+ HEADER_SEPARATOR = ": "
13
+
14
+ CONTENT_TYPE = "content-type"
15
+ CONTENT_LENGTH = "content-length"
16
+ CONTENT_ENCODING = "content-encoding"
17
+ HDR_TRANSFER_ENCODING = "Transfer-Encoding"
18
+ CONNECTION = "Connection"
19
+ AUTHORIZATION = "Authorization"
20
+ WWW_AUTHENTICATE = "WWW-Authenticate"
21
+ STATUS = "Status"
22
+ LOCATION = "Location"
23
+ HOST = "Host"
24
+ COOKIE = "Cookie"
25
+ USER_AGENT = "User-Agent"
26
+ ACCEPT = "Accept"
27
+ ACCEPT_LANGUAGE = "Accept-Language"
28
+ ACCEPT_ENCODING = "Accept-Encoding"
29
+ UPGRADE_INSECURE_REQUESTS = "Upgrade-Insecure-Requests"
30
+ SERVER = "Server"
31
+ X_FORWARDED_HOST = "X-Forwarded-Host"
32
+ X_FORWARDED_FOR = "X-Forwarded-For"
33
+ X_FORWARDED_PROTO = "X-Forwarded-Proto"
34
+ X_FORWARDED_PORT = "X-Forwarded-Port"
35
+
36
+ CONNECTION_CLOSE = 1
37
+ CONNECTION_KEEP_ALIVE = 2
38
+ CONNECTION_UPGRADE = 3
39
+ CONNECTION_UNKOWN = 4
40
+
41
+ attr :status
42
+ attr :headers
43
+
44
+
45
+ def initialize
46
+ @headers = {}
47
+ clear()
48
+ end
49
+
50
+ def to_s()
51
+ return "Header(s=#{@status.to_s} h=#{@headers}"
52
+ end
53
+
54
+
55
+ def clear()
56
+ @headers.clear()
57
+ @status = HttpStatus::OK
58
+ end
59
+
60
+ def copy_to(dst)
61
+ dst.status = @status
62
+ @headers.keys.each do |name|
63
+ values = @headers[name].dup
64
+ dst.headers[name] = values
65
+ end
66
+ end
67
+
68
+ def status= (new_val)
69
+ @status = new_val.to_i
70
+ end
71
+
72
+ def get(name)
73
+ values = headers[name.downcase()]
74
+ if(values == nil)
75
+ return nil
76
+ else
77
+ return values[0]
78
+ end
79
+ end
80
+
81
+ def get_int(name)
82
+ val = get(name)
83
+ if(val == nil)
84
+ return -1
85
+ else
86
+ return val.to_i
87
+ end
88
+ end
89
+
90
+ def set(name, value)
91
+ name = name.downcase
92
+ values = @headers[name]
93
+ if(values == nil)
94
+ values = []
95
+ @headers[name] = values
96
+ end
97
+ values.clear()
98
+ values.append(value)
99
+ end
100
+
101
+
102
+ def set_int(name, value)
103
+ set(name, value.to_s)
104
+ end
105
+
106
+ def add(name, value)
107
+ name = name.downcase()
108
+ values = @headers[name]
109
+ if(values == nil)
110
+ values = []
111
+ @headers[name] = values
112
+ end
113
+ values.append(value)
114
+ end
115
+
116
+ def add_int(name, value)
117
+ add(name, value.to_s)
118
+ end
119
+
120
+ def names()
121
+ return @headers.keys()
122
+ end
123
+
124
+ def values(name)
125
+ values = @headers[name.downcase()]
126
+ if(values == nil)
127
+ return []
128
+ else
129
+ return values
130
+ end
131
+ end
132
+
133
+ def count()
134
+ c = 0
135
+ @headers.keys.each do |name|
136
+ @headers[name].each do |value|
137
+ c += 1
138
+ end
139
+ end
140
+ return c
141
+ end
142
+
143
+ def contains(name)
144
+ return @headers.keys.include?(name.downcase())
145
+ end
146
+
147
+ def remove(name)
148
+ @headers.delete(name.downcase())
149
+ end
150
+
151
+ #
152
+ # Utility methods
153
+ #
154
+ def content_type()
155
+ return get(CONTENT_TYPE)
156
+ end
157
+
158
+ def set_content_type(type)
159
+ set(CONTENT_TYPE, type)
160
+ end
161
+
162
+ def content_length()
163
+ length = get(CONTENT_LENGTH)
164
+ if(StringUtil.empty?(length))
165
+ return -1
166
+ else
167
+ return Integer(length)
168
+ end
169
+ end
170
+
171
+ def set_content_length(len)
172
+ set_int(CONTENT_LENGTH, len)
173
+ end
174
+
175
+ def get_connection
176
+ con = get(CONNECTION)
177
+ if(con != nil)
178
+ con = con.downcase()
179
+ end
180
+ case con
181
+ when "close" then
182
+ return CONNECTION_CLOSE
183
+ when "keep-alive" then
184
+ return CONNECTION_KEEP_ALIVE
185
+ when "upgrade" then
186
+ return CONNECTION_UPGRADE
187
+ else
188
+ return CONNECTION_UNKOWN
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,48 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class HostMatcher
5
+ MATCH_TYPE_ALL = 1
6
+ MATCH_TYPE_EXACT = 2
7
+ MATCH_TYPE_DOMAIN = 3
8
+
9
+ attr :match_type
10
+ attr :host
11
+ attr :domain
12
+
13
+ def initialize(host)
14
+ if host == "*"
15
+ @match_type = MATCH_TYPE_ALL
16
+ elsif host.start_with?("*.")
17
+ @match_type = MATCH_TYPE_DOMAIN
18
+ @domain = host[2, -1]
19
+ else
20
+ @match_type = MATCH_TYPE_EXACT
21
+ @host = host
22
+ end
23
+ end
24
+
25
+
26
+ def match(remote_host)
27
+ if @match_type == MATCH_TYPE_ALL
28
+ # all match
29
+ return true
30
+ end
31
+
32
+ if remote_host == nil
33
+ return false
34
+ end
35
+
36
+ if @match_type == MATCH_TYPE_EXACT
37
+ # exact match
38
+ remote_host == @host
39
+ else
40
+ # domain match
41
+ remote_host.end_with?(@domain)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,60 @@
1
+ require 'baykit/bayserver/bcf/package'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Util
6
+ class HttpStatus
7
+ include Baykit::BayServer::Bcf
8
+
9
+ #
10
+ # Known status
11
+ #
12
+ OK = 200
13
+ MOVED_PERMANENTLY = 301
14
+ MOVED_TEMPORARILY = 302
15
+ NOT_MODIFIED = 304
16
+ BAD_REQUEST = 400
17
+ UNAUTHORIZED = 401
18
+ FORBIDDEN = 403
19
+ NOT_FOUND = 404
20
+ UPGRADE_REQUIRED = 426
21
+ INTERNAL_SERVER_ERROR = 500
22
+ SERVICE_UNAVAILABLE = 503
23
+ GATEWAY_TIMEOUT = 504
24
+ HTTP_VERSION_NOT_SUPPORTED = 505
25
+
26
+ class << self
27
+ attr :status
28
+ attr :initialized
29
+ end
30
+ @status = {}
31
+ @initialized = false
32
+
33
+ def self.init(bcf_file)
34
+ if(@initialized)
35
+ return
36
+ end
37
+
38
+ p = BcfParser.new()
39
+ doc = p.parse(bcf_file)
40
+ doc.content_list.each do |kv|
41
+ if(kv.instance_of?(BcfKeyVal))
42
+ @status[kv.key.to_i] = kv.value
43
+ end
44
+ end
45
+ @initialized = true
46
+ end
47
+
48
+ def self.description(status_code)
49
+ desc = @status[status_code]
50
+ if(desc == nil)
51
+ BayLog.error("Status #{status_code} is invalid.")
52
+ return status_code.to_s()
53
+ else
54
+ return desc
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,157 @@
1
+ require 'base64'
2
+ require 'resolv'
3
+
4
+ require 'baykit/bayserver/util/string_util'
5
+ require 'baykit/bayserver/util/char_util'
6
+ require 'baykit/bayserver/util/headers'
7
+ require 'baykit/bayserver/util/http_util'
8
+
9
+ module Baykit
10
+ module BayServer
11
+ module Util
12
+ class HttpUtil
13
+ include Baykit::BayServer::Util
14
+
15
+ MAX_LINE_LEN = 5000
16
+
17
+ def HttpUtil.read_line(file)
18
+ # Current reading line
19
+ buf = StringUtil.alloc(MAX_LINE_LEN)
20
+
21
+ n = 0
22
+ eof = false
23
+ while true
24
+ begin
25
+ c = file.readchar
26
+ rescue EOFError => e
27
+ eof = true
28
+ break
29
+ end
30
+
31
+ # If line is too long, return error
32
+ if n >= MAX_LINE_LEN
33
+ raise RuntimeError.new("Request line too long")
34
+ end
35
+ # If character is newline, end to read line
36
+ if c == CharUtil::LF
37
+ break
38
+ end
39
+
40
+ # Put the character to buffer
41
+ buf.concat(c)
42
+ n += 1
43
+ end
44
+
45
+ if n == 0 && eof
46
+ return nil
47
+ else
48
+ return buf.chomp
49
+ end
50
+ end
51
+
52
+ #
53
+ # Parse message headers
54
+ # message-header = field-name &quot;:&quot; [field-value]
55
+ #
56
+ def HttpUtil.parse_message_headers(file, header)
57
+ while true
58
+ line = read_line(file)
59
+
60
+ # if line is empty ("\r\n")
61
+ # finish reading.
62
+ if StringUtil.empty?(line)
63
+ break
64
+ end
65
+
66
+ pos = line.index ":"
67
+ if pos != nil
68
+ key = line[0 .. pos - 1].strip
69
+ val = line[pos + 1 .. -1].strip
70
+ header.add(key, val)
71
+ end
72
+ end
73
+ end
74
+
75
+ #
76
+ # Send MIME headers This method is called from send_headers
77
+ #
78
+ def HttpUtil.send_mime_headers(headers, buf)
79
+
80
+ headers.names.each do |name|
81
+ headers.values(name).each do |value|
82
+ buf.put(name)
83
+ buf.put(Headers::HEADER_SEPARATOR)
84
+ buf.put(value)
85
+ send_new_line(buf)
86
+ end
87
+ end
88
+ end
89
+
90
+ def HttpUtil.send_new_line(buf)
91
+ buf.put(CharUtil::CRLF)
92
+ end
93
+
94
+ def HttpUtil.parse_authorization(tur)
95
+ auth = tur.req.headers.get(Headers::AUTHORIZATION)
96
+ if StringUtil.set?(auth)
97
+ ptn = /Basic (.*)/
98
+ mch = auth.match(ptn)
99
+ if !mch
100
+ BayLog.warn("Not matched with basic authentication format")
101
+ else
102
+ auth = mch[1]
103
+
104
+ auth = Base64.decode64(auth)
105
+ ptn = /(.*):(.*)/
106
+ mch = auth.match(ptn)
107
+ if mch
108
+ tur.req.remote_user = mch[1]
109
+ tur.req.remote_pass = mch[2]
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+
116
+ def HttpUtil.parse_host_port(tur, default_port)
117
+ tur.req.req_host = ""
118
+
119
+ host_port = tur.req.headers.get(Headers::X_FORWARDED_HOST)
120
+ if StringUtil.set?(host_port)
121
+ tur.req.headers.remove(Headers::X_FORWARDED_HOST)
122
+ tur.req.headers.set(Headers::HOST, host_port)
123
+ end
124
+
125
+ host_port = tur.req.headers.get(Headers::HOST)
126
+
127
+ if StringUtil.set?(host_port)
128
+ pos = host_port.rindex(':')
129
+ if pos == nil
130
+ tur.req.req_host = host_port
131
+ tur.req.req_port = default_port
132
+ else
133
+ tur.req.req_host = host_port[0, pos]
134
+ begin
135
+ tur.req.req_port = host_port[pos + 1 .. -1].to_i
136
+ rescue => e
137
+ BayLog.error(e)
138
+ end
139
+ end
140
+ end
141
+ end
142
+
143
+ def HttpUtil.resolve_remote_host(adr)
144
+ if adr == nil
145
+ return nil
146
+ end
147
+ begin
148
+ return Resolv.getname(adr)
149
+ rescue => e
150
+ BayLog.warn_e(e, "Cannot get remote host name: %s", e)
151
+ return nil
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,32 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class IOUtil
5
+ def IOUtil.read_int32(io)
6
+ data = " "
7
+ begin
8
+ dt = io.read_nonblock(4, data)
9
+ if dt == nil
10
+ return nil
11
+ end
12
+ rescue EOFError => e
13
+ return nil
14
+ end
15
+ data = data.codepoints
16
+ #print("IO.read->" + data[0].to_s + "," + data[1].to_s + "," + data[2].to_s + "," + data[3].to_s)
17
+ return data[0] << 24 | (data[1]<< 16 & 0xFF0000) | (data[2] << 8 & 0xFF00) | (data[3] & 0xFF)
18
+ end
19
+
20
+ def IOUtil.write_int32(io, i)
21
+ data = [i >> 24, i >> 16 & 0xFF, i >> 8 & 0xFF, i & 0xFF]
22
+ #print("IOwrite->" + data.to_s)
23
+ io.write(data.pack("C*"))
24
+ end
25
+
26
+ def IOUtil.get_sock_recv_buf_size(skt)
27
+ return skt.getsockopt(Socket::SOL_SOCKET, Socket::SO_RCVBUF).int
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,67 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class IpMatcher
5
+ attr :match_all
6
+ attr :net_addr
7
+ attr :mask_addr
8
+
9
+ def initialize(ip_desc)
10
+ @match_all = (ip_desc == "*")
11
+
12
+ if !@match_all
13
+ parse_ip(ip_desc)
14
+ end
15
+ end
16
+
17
+ def match(ip)
18
+ BayLog.debug("match_ip %s net=%s mask=%s", ip, @net_addr, @mask_addr)
19
+ if @match_all
20
+ return true
21
+ else
22
+ if ip.ipv4? != @mask_addr.ipv4?
23
+ # IPv4 and IPv6 don't match each other
24
+ return false
25
+ end
26
+
27
+ if ip & @mask_addr != @net_addr
28
+ return false
29
+ end
30
+
31
+ return true
32
+ end
33
+ end
34
+
35
+ def get_ip_addr(ip)
36
+ return IPAddr.new(ip)
37
+ end
38
+
39
+ private
40
+ def parse_ip(ip_desc)
41
+ items = ip_desc.split("/")
42
+ if items.length == 0
43
+ raise RuntimeError.new(BayMessage.get(:CFG_INVALID_IP_DESC, ip_desc))
44
+ end
45
+
46
+ ip = items[0]
47
+ if items.length == 1
48
+ mask = "255.255.255.255"
49
+ else
50
+ mask = items[1]
51
+ end
52
+
53
+ ip_addr = get_ip_addr(ip)
54
+ @mask_addr = get_ip_addr(mask)
55
+
56
+ if ip_addr.ipv4? != @mask_addr.ipv4?
57
+ raise RuntimeError.new(BayMessage.get(:CFG_IPV4_AND_IPV6_ARE_MIXED, ip_desc))
58
+ end
59
+
60
+ @net_addr = ip_addr & @mask_addr
61
+ end
62
+
63
+
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,15 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class KeyVal
5
+ attr :name
6
+ attr :value
7
+
8
+ def initialize(name, val)
9
+ @name = name
10
+ @value = val
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,53 @@
1
+ require 'baykit/bayserver/util/key_val'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Util
6
+ class KeyValListParser
7
+
8
+ attr :item_sep
9
+ attr :kv_sep
10
+
11
+ def initialize(item_sep = "&", key_val_sep = "=")
12
+ @item_sep = item_sep
13
+ @kv_sep = key_val_sep
14
+ end
15
+
16
+ def parse(str)
17
+ list = []
18
+ buf = ""
19
+ str.each do |c|
20
+ if(c == @item_sep)
21
+ list.append(divide_param(buf))
22
+ buf.clear()
23
+ else
24
+ buf.concat(c)
25
+ end
26
+ end
27
+ if(buf.length > 0)
28
+ list.append(divide_param(buf))
29
+ end
30
+
31
+ return list
32
+ end
33
+
34
+ private
35
+ def divide_param(str)
36
+ pos = str.index @kv_sep
37
+ if(pos == nil)
38
+ name = str
39
+ value = ""
40
+ else
41
+ name = str[0 .. pos]
42
+ value = str[pos + 1 .. -1]
43
+ end
44
+
45
+ name.strip!
46
+ KeyVal.new(name, value)
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,30 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class Locale
5
+ attr :language
6
+ attr :country
7
+
8
+ def initialize(language, country)
9
+ @language = language
10
+ @country = country
11
+ end
12
+
13
+
14
+ def self.default()
15
+ lang = ENV['LANG']
16
+ if StringUtil.set?(lang)
17
+ begin
18
+ language = lang[0, 2]
19
+ country = lang[4, 2]
20
+ return Locale.new(language, country)
21
+ rescue => e
22
+ BayLog.error_e(e)
23
+ end
24
+ end
25
+ return Locale.new("en", "US")
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,24 @@
1
+ require 'digest/md5'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Util
6
+ class MD5Password
7
+ def MD5Password.encode(password)
8
+ digest = Digest::MD5.new
9
+ digest.update(password)
10
+ return digest.digest.unpack("H*")[0]
11
+ end
12
+
13
+ def bytesToString(bytes)
14
+ ret = ""
15
+ bytes.each do |b|
16
+ b.to_s(16)
17
+ ret.concat(b)
18
+ end
19
+ return ret
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end