bayserver-core 3.0.3 → 3.3.2

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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/lib/baykit/bayserver/agent/command_receiver.rb +2 -0
  3. data/lib/baykit/bayserver/agent/grand_agent.rb +101 -93
  4. data/lib/baykit/bayserver/agent/letters/accepted_letter.rb +2 -2
  5. data/lib/baykit/bayserver/agent/letters/closed_letter.rb +2 -2
  6. data/lib/baykit/bayserver/agent/letters/connected_letter.rb +2 -2
  7. data/lib/baykit/bayserver/agent/letters/error_letter.rb +2 -2
  8. data/lib/baykit/bayserver/agent/letters/letter.rb +7 -3
  9. data/lib/baykit/bayserver/agent/letters/read_letter.rb +2 -2
  10. data/lib/baykit/bayserver/agent/letters/wrote_letter.rb +2 -2
  11. data/lib/baykit/bayserver/agent/monitor/grand_agent_monitor.rb +20 -22
  12. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer.rb +44 -31
  13. data/lib/baykit/bayserver/agent/multiplexer/job_multiplexer_base.rb +5 -0
  14. data/lib/baykit/bayserver/agent/multiplexer/multiplexer_base.rb +4 -4
  15. data/lib/baykit/bayserver/agent/multiplexer/plain_transporter.rb +2 -3
  16. data/lib/baykit/bayserver/agent/multiplexer/spider_multiplexer.rb +128 -75
  17. data/lib/baykit/bayserver/agent/multiplexer/spin_multiplexer.rb +22 -17
  18. data/lib/baykit/bayserver/agent/multiplexer/taxi_multiplexer.rb +17 -13
  19. data/lib/baykit/bayserver/bay_log.rb +20 -16
  20. data/lib/baykit/bayserver/bayserver.rb +8 -15
  21. data/lib/baykit/bayserver/common/cities.rb +1 -1
  22. data/lib/baykit/bayserver/common/inbound_ship.rb +1 -15
  23. data/lib/baykit/bayserver/common/inbound_ship_store.rb +0 -1
  24. data/lib/baykit/bayserver/{agent/multiplexer → common}/rudder_state.rb +43 -7
  25. data/lib/baykit/bayserver/common/rudder_state_store.rb +63 -0
  26. data/lib/baykit/bayserver/{agent/multiplexer → common}/transporter.rb +1 -3
  27. data/lib/baykit/bayserver/common/warp_ship.rb +4 -3
  28. data/lib/baykit/bayserver/{agent/multiplexer → common}/write_unit.rb +1 -3
  29. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +0 -1
  30. data/lib/baykit/bayserver/docker/base/port_base.rb +5 -5
  31. data/lib/baykit/bayserver/docker/base/warp_base.rb +7 -4
  32. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +25 -2
  33. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +42 -26
  34. data/lib/baykit/bayserver/docker/harbor.rb +14 -0
  35. data/lib/baykit/bayserver/docker/send_file/file_content.rb +66 -0
  36. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +113 -29
  37. data/lib/baykit/bayserver/docker/send_file/file_store.rb +117 -0
  38. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +13 -5
  39. data/lib/baykit/bayserver/docker/send_file/send_file_ship.rb +11 -2
  40. data/lib/baykit/bayserver/docker/send_file/wait_file_ship.rb +92 -0
  41. data/lib/baykit/bayserver/mem_usage.rb +2 -0
  42. data/lib/baykit/bayserver/protocol/packet.rb +2 -1
  43. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +9 -8
  44. data/lib/baykit/bayserver/protocol/protocol_exception.rb +7 -1
  45. data/lib/baykit/bayserver/rudders/io_rudder.rb +2 -2
  46. data/lib/baykit/bayserver/rudders/rudder.rb +4 -0
  47. data/lib/baykit/bayserver/rudders/rudder_base.rb +21 -0
  48. data/lib/baykit/bayserver/tours/req_content_handler.rb +13 -13
  49. data/lib/baykit/bayserver/tours/tour.rb +1 -6
  50. data/lib/baykit/bayserver/tours/tour_handler.rb +1 -1
  51. data/lib/baykit/bayserver/tours/tour_req.rb +4 -8
  52. data/lib/baykit/bayserver/tours/tour_res.rb +1 -8
  53. data/lib/baykit/bayserver/util/cgi_util.rb +7 -2
  54. data/lib/baykit/bayserver/util/headers.rb +2 -2
  55. data/lib/baykit/bayserver/util/http_status.rb +7 -0
  56. data/lib/baykit/bayserver/util/http_util.rb +16 -0
  57. data/lib/baykit/bayserver/util/io_util.rb +1 -3
  58. data/lib/baykit/bayserver/util/nio_selector.rb +103 -0
  59. data/lib/baykit/bayserver/util/object_factory.rb +5 -2
  60. data/lib/baykit/bayserver/util/object_store.rb +5 -5
  61. data/lib/baykit/bayserver/util/rb_selector.rb +55 -0
  62. data/lib/baykit/bayserver/util/reusable.rb +3 -2
  63. data/lib/baykit/bayserver/util/selector.rb +43 -80
  64. data/lib/baykit/bayserver/util/simple_buffer.rb +2 -4
  65. data/lib/baykit/bayserver/version.rb +1 -1
  66. metadata +16 -20
  67. data/lib/baykit/bayserver/agent/accept_handler.rb +0 -71
  68. data/lib/baykit/bayserver/agent/channel_listener.rb +0 -35
  69. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +0 -38
  70. data/lib/baykit/bayserver/agent/transporter/package.rb +0 -0
  71. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +0 -111
  72. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +0 -125
  73. data/lib/baykit/bayserver/agent/transporter/transporter.rb +0 -332
  74. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +0 -71
  75. data/lib/baykit/bayserver/tours/send_file_yacht.rb +0 -97
  76. data/lib/baykit/bayserver/watercraft/boat.rb +0 -43
  77. data/lib/baykit/bayserver/watercraft/yacht.rb +0 -42
@@ -3,6 +3,7 @@ require 'baykit/bayserver/tours/package'
3
3
  require 'baykit/bayserver/docker/base/club_base'
4
4
  require 'baykit/bayserver/docker/send_file/file_content_handler'
5
5
  require 'baykit/bayserver/docker/send_file/directory_train'
6
+ require 'baykit/bayserver/docker/send_file/file_store'
6
7
 
7
8
  require 'baykit/bayserver/util/string_util'
8
9
 
@@ -17,6 +18,7 @@ module Baykit
17
18
  include Baykit::BayServer::Tours
18
19
 
19
20
  attr :list_files
21
+ attr :file_store
20
22
 
21
23
  ######################################################
22
24
  # Implements DockerBase
@@ -57,14 +59,20 @@ module Baykit
57
59
 
58
60
  real = "#{tur.town.location}/#{rel_path}"
59
61
 
60
- if File.directory?(real) && @list_files
61
- train = DirectoryTrain.new(tur, real)
62
- train.start_tour()
62
+ if File.directory?(real)
63
+ if @list_files
64
+ train = DirectoryTrain.new(tur, real)
65
+ train.start_tour()
66
+ else
67
+ raise HttpException.new(HttpStatus::FORBIDDEN, "Directory scan is prohibited")
68
+ end
63
69
  else
64
- handler = FileContentHandler.new(real)
70
+ if BayServer.harbor.enable_cache() && @file_store == nil
71
+ @file_store = FileStore.new(BayServer.harbor.cache_lifespan_sec, BayServer.harbor.cache_size_mb * 1024 * 1024)
72
+ end
73
+ handler = FileContentHandler.new(tur, @file_store, real, tur.res.charset)
65
74
  tur.req.set_content_handler(handler)
66
75
  end
67
-
68
76
  end
69
77
 
70
78
  end
@@ -8,6 +8,8 @@ module Baykit
8
8
  include Baykit::BayServer::Tours::ReqContentHandler # implements
9
9
 
10
10
  attr :file_wrote_len
11
+
12
+ attr :file_content
11
13
  attr :tour
12
14
  attr :tour_id
13
15
 
@@ -19,11 +21,12 @@ module Baykit
19
21
  attr :path
20
22
  attr :abortable
21
23
 
22
- def init(rd, tp, tur)
24
+ def init(rd, tp, tur, file_content)
23
25
  super(tur.ship.agent_id, rd, tp)
24
26
  @file_wrote_len = 0
25
27
  @tour = tur
26
28
  @tour_id = tur.tour_id
29
+ @file_content = file_content
27
30
  end
28
31
 
29
32
  ######################################################
@@ -48,6 +51,12 @@ module Baykit
48
51
  begin
49
52
  available = @tour.res.send_res_content(@tour_id, buf, 0, buf.length)
50
53
 
54
+ if @file_content != nil
55
+ #BayLog.debug("buf=%s target=%s", buf, @file_content.content)
56
+ @file_content.content << buf
57
+ @file_content.bytes_loaded += buf.length
58
+ end
59
+
51
60
  if available
52
61
  return NextSocketAction::CONTINUE
53
62
  else
@@ -73,7 +82,7 @@ module Baykit
73
82
  begin
74
83
  @tour.res.end_res_content(@tour_id)
75
84
  rescue IOError => e
76
- BayLog.debug_e(ex)
85
+ BayLog.debug_e(e)
77
86
  end
78
87
  return NextSocketAction::CLOSE
79
88
  end
@@ -0,0 +1,92 @@
1
+ require 'baykit/bayserver/tours/tour'
2
+ require 'baykit/bayserver/common/read_only_ship'
3
+
4
+ module Baykit
5
+ module BayServer
6
+ module Docker
7
+ module SendFile
8
+ class WaitFileShip < Baykit::BayServer::Common::ReadOnlyShip
9
+
10
+ include Baykit::BayServer::Agent
11
+ include Baykit::BayServer::Tours
12
+
13
+ attr :file_content
14
+ attr :handler
15
+
16
+ attr :tour
17
+ attr :tour_id
18
+ def initialize()
19
+ @file_content = nil
20
+ @handler = nil
21
+ end
22
+
23
+ def init(rd, tp, tur, file_content, handler)
24
+ super(tur.ship.agent_id, rd, tp)
25
+ @tour = tur
26
+ @tour_id = tur.tour_id
27
+ @file_content = file_content
28
+ @handler = handler
29
+ end
30
+
31
+ def to_s
32
+ return "agt#" + @agent_id.to_s + " wait_file#" + @ship_id.to_s + "/" + @object_id.to_s
33
+ end
34
+
35
+ ######################################################
36
+ # Implements Reusable
37
+ ######################################################
38
+
39
+ def reset
40
+ super
41
+ @file_content = nil
42
+ @tour_id = 0
43
+ @tour = nil
44
+ end
45
+
46
+ ######################################################
47
+ # Implements ReadOnlyShip
48
+ ######################################################
49
+
50
+ def notify_read(buf)
51
+
52
+ BayLog.debug("%s file read completed", self)
53
+
54
+ begin
55
+ @handler.send_file_from_cache
56
+ rescue HttpException => e
57
+ begin
58
+ @tour.res.send_error(Tour::TOUR_ID_NOCHECK, e.status, e.message)
59
+ rescue IOError => ex
60
+ notify_error(ex)
61
+ return NextSocketAction::CLOSE
62
+ end
63
+ end
64
+
65
+ return NextSocketAction::CONTINUE
66
+ end
67
+
68
+ def notify_error(e)
69
+ BayLog.debug_e(e, "%s Error notified", self)
70
+ begin
71
+ @tour.res.send_error(@tour_id, HttpStatus.INTERNAL_SERVER_ERROR, null, e)
72
+ rescue IOError => ex
73
+ BayLog.debug_e(ex)
74
+ end
75
+ end
76
+
77
+ def notify_eof()
78
+ raise Sink.new
79
+ end
80
+
81
+ def notify_close
82
+ end
83
+
84
+ def check_timeout(duration_sec)
85
+ return false
86
+ end
87
+
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -5,6 +5,7 @@ require 'baykit/bayserver/protocol/protocol_handler_store'
5
5
  require 'baykit/bayserver/protocol/packet_store'
6
6
  require 'baykit/bayserver/tours/tour_store'
7
7
  require 'baykit/bayserver/common/inbound_ship_store'
8
+ require 'baykit/bayserver/common/rudder_state_store'
8
9
  require 'baykit/bayserver/docker/base/warp_base'
9
10
 
10
11
  require 'baykit/bayserver/util/string_util'
@@ -52,6 +53,7 @@ module Baykit
52
53
  PacketStore.get_stores(@agent_id).each do |store|
53
54
  store.print_usage(indent+1)
54
55
  end
56
+ RudderStateStore.get_store(@agent_id).print_usage(indent+1)
55
57
  TourStore.get_store(@agent_id).print_usage(indent+1);
56
58
  BayServer.cities.cities.each do |city|
57
59
  print_city_usage(nil, city, indent)
@@ -43,7 +43,8 @@ module Baykit
43
43
  end
44
44
 
45
45
  def expand
46
- @buf = StringUtil.realloc(@buf, @buf.length * 2)
46
+ new_len = if @buf.length == 0 then 128 else @buf.length * 2 end
47
+ @buf << "\0" * new_len
47
48
  end
48
49
 
49
50
  def new_header_accessor()
@@ -29,9 +29,9 @@ module Baykit
29
29
  def put_bytes(buf, ofs=0, len=buf.length)
30
30
  if len > 0
31
31
  check_write(len)
32
- #while(@start + @pos + len > @packet.buf.length)
33
- # packet.expand()
34
- #end
32
+ while @start + @pos + len > @packet.buf.length
33
+ packet.expand
34
+ end
35
35
  begin
36
36
  @packet.buf[@start + @pos, len] = buf[ofs, len]
37
37
  rescue IndexError => e
@@ -68,9 +68,10 @@ module Baykit
68
68
  end
69
69
 
70
70
  def get_byte
71
- buf = StringUtil.alloc(1)
72
- get_bytes(buf, 0, 1)
73
- buf[0].codepoints[0]
71
+ check_read(1)
72
+ b = @packet.buf[@start + @pos]
73
+ @pos += 1
74
+ return b.codepoints[0]
74
75
  end
75
76
 
76
77
  def get_bytes(buf, ofs=0, len=buf.length)
@@ -100,13 +101,13 @@ module Baykit
100
101
  def check_read(len)
101
102
  max_len = (@max_len >= 0) ? @max_len : (@packet.buf_len - @start)
102
103
  if @pos + len > max_len
103
- raise Sink.new("Invalid array index")
104
+ raise IOError.new("Invalid array index: @pos=#{@pos} @max=#{@max_len} len=#{len}")
104
105
  end
105
106
  end
106
107
 
107
108
  def check_write(len)
108
109
  if @max_len > 0 && @pos + len > @max_len
109
- raise Sink.new("Buffer overflow")
110
+ raise IOError.new("Buffer overflow: @pos=#{@pos} @max=#{@max_len} len=#{len}")
110
111
  end
111
112
  end
112
113
 
@@ -1,3 +1,9 @@
1
+ #
2
+ # ProtocolException is thrown when protocol-level violations are detected,
3
+ # such as invalid packet framing or incorrect packet ordering.
4
+ # (Invalid HTTP headers or content length values result in an HttpException,
5
+ # which causes a 400 Bad Request response to be returned to the client.)
6
+ #
1
7
  module Baykit
2
8
  module BayServer
3
9
  module Protocol
@@ -5,7 +11,7 @@ module Baykit
5
11
  def initialize(fmt = nil, *args)
6
12
  super(if fmt == nil
7
13
  nil
8
- elsif args == nil
14
+ elsif args.empty?
9
15
  sprintf("%s", fmt)
10
16
  else
11
17
  sprintf(fmt, *args)
@@ -1,10 +1,10 @@
1
1
  require 'baykit/bayserver/rudders/rudder'
2
+ require 'baykit/bayserver/rudders/rudder_base'
2
3
 
3
4
  module Baykit
4
5
  module BayServer
5
6
  module Rudders
6
- class IORudder
7
- include Rudder
7
+ class IORudder < RudderBase
8
8
 
9
9
  attr :io
10
10
  attr :non_blocking
@@ -23,6 +23,10 @@ module Baykit
23
23
  def close
24
24
  raise NotImplementedError.new
25
25
  end
26
+
27
+ def closed?
28
+ raise NotImplementedError.new
29
+ end
26
30
  end
27
31
  end
28
32
  end
@@ -0,0 +1,21 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Rudders
5
+ class RudderBase
6
+ include Rudder # implements
7
+
8
+ attr :closed
9
+
10
+ def close
11
+ @closed = true
12
+ end
13
+
14
+ def closed?
15
+ return @closed
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -15,26 +15,26 @@ module Baykit
15
15
  raise NotImplementedError.new
16
16
  end
17
17
 
18
- end
18
+ #DEV_NULL = nil
19
19
 
20
- class DevNullReqContentHandler
21
- include ReqContentHandler # implements
22
- def on_read_req_content(tur, buf, start, len)
23
- end
20
+ class DevNullReqContentHandler
21
+ include ReqContentHandler # implements
22
+ def on_read_req_content(tur, buf, start, len)
23
+ end
24
24
 
25
- def on_end_req_content(tur)
26
- end
25
+ def on_end_req_content(tur)
26
+ end
27
27
 
28
- def on_abort_req(tur)
29
- return false
30
- end
31
- end
28
+ def on_abort_req(tur)
29
+ return false
30
+ end
32
31
 
33
- module ReqContentHandler
34
- DEV_NULL = DevNullReqContentHandler.new()
32
+ end
35
33
  end
36
34
  end
37
35
  end
38
36
  end
39
37
 
38
+ Baykit::BayServer::Tours::ReqContentHandler::DEV_NULL = Baykit::BayServer::Tours::ReqContentHandler::DevNullReqContentHandler.new
39
+
40
40
 
@@ -126,12 +126,7 @@ module Baykit
126
126
  if city == nil
127
127
  raise HttpException.new HttpStatus::NOT_FOUND, @req.uri
128
128
  else
129
- begin
130
- city.enter(self)
131
- rescue HttpException => e
132
- change_state(TOUR_ID_NOCHECK, TourState::ABORTED)
133
- raise e
134
- end
129
+ city.enter(self)
135
130
  end
136
131
  end
137
132
 
@@ -21,7 +21,7 @@ module Baykit
21
21
  end
22
22
 
23
23
  # Send end of contents to client.
24
- def send_end_tour(tur, keep_alive, &lis)
24
+ def send_end_tour(tur, &lis)
25
25
  raise NotImplementedError.new
26
26
  end
27
27
 
@@ -205,16 +205,12 @@ module Baykit
205
205
  #@tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
206
206
  return true
207
207
 
208
- elsif @tour.running?
208
+ elsif @tour.reading?
209
209
  aborted = true
210
210
  if @content_handler != nil
211
211
  aborted = @content_handler.on_abort_req(@tour)
212
212
  end
213
213
 
214
- #if aborted
215
- # @tour.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
216
- #end
217
-
218
214
  return aborted
219
215
  else
220
216
  BayLog.debug("%s tour is not preparing or not running", @tour)
@@ -227,9 +223,9 @@ module Baykit
227
223
  if hnd == nil
228
224
  raise Sink.new("nil")
229
225
  end
230
- if @content_handler != nil
231
- raise Sink.new("content handler already set")
232
- end
226
+ #if @content_handler != nil
227
+ # raise Sink.new("content handler already set")
228
+ #end
233
229
 
234
230
  @content_handler = hnd
235
231
  end
@@ -3,7 +3,6 @@ require 'baykit/bayserver/protocol/protocol_exception'
3
3
  require 'baykit/bayserver/agent/multiplexer/plain_transporter'
4
4
  require 'baykit/bayserver/taxi/taxi_runner'
5
5
  require 'baykit/bayserver/docker/harbor'
6
- require 'baykit/bayserver/tours/send_file_yacht'
7
6
  require 'baykit/bayserver/tours/read_file_taxi'
8
7
  require 'baykit/bayserver/tours/content_consume_listener'
9
8
 
@@ -22,7 +21,6 @@ module Baykit
22
21
  include Baykit::BayServer::Docker
23
22
  include Baykit::BayServer::Tours
24
23
  include Baykit::BayServer::Taxi
25
- include Baykit::BayServer::Agent::Transporter
26
24
 
27
25
  attr :tour
28
26
 
@@ -35,7 +33,6 @@ module Baykit
35
33
  attr :res_consume_listener
36
34
 
37
35
  attr_accessor :header_sent
38
- attr :yacht
39
36
 
40
37
  ###########################
41
38
  # Response Content info
@@ -55,7 +52,6 @@ module Baykit
55
52
  end
56
53
 
57
54
  def init()
58
- @yacht = SendFileYacht.new()
59
55
  end
60
56
 
61
57
  def to_s()
@@ -69,9 +65,6 @@ module Baykit
69
65
  def reset()
70
66
  @charset = nil
71
67
  @header_sent = false
72
- if @yacht != nil
73
- @yacht.reset()
74
- end
75
68
 
76
69
  @available = false
77
70
  @res_consume_listener = nil
@@ -184,7 +177,7 @@ module Baykit
184
177
  raise e
185
178
  ensure
186
179
  @header_sent = true
187
- end_content(chk_tour_id)
180
+ end_res_content(chk_tour_id)
188
181
  end
189
182
  end
190
183
 
@@ -1,3 +1,4 @@
1
+ require 'date'
1
2
  require 'baykit/bayserver/util/string_util'
2
3
 
3
4
  module Baykit
@@ -105,8 +106,12 @@ module Baykit
105
106
  end
106
107
  end
107
108
 
108
- add_env(REMOTE_ADDR, tur.req.remote_address, &block)
109
- add_env(REMOTE_PORT, tur.req.remote_port, &block)
109
+ if tur.req.remote_address
110
+ add_env(REMOTE_ADDR, tur.req.remote_address, &block)
111
+ end
112
+ if tur.req.remote_port
113
+ add_env(REMOTE_PORT, tur.req.remote_port, &block)
114
+ end
110
115
  #add_env(REMOTE_USER, "unknown")
111
116
 
112
117
  add_env(REQUEST_SCHEME, tur.is_secure ? "https": "http", &block)
@@ -36,7 +36,7 @@ module Baykit
36
36
  CONNECTION_CLOSE = 1
37
37
  CONNECTION_KEEP_ALIVE = 2
38
38
  CONNECTION_UPGRADE = 3
39
- CONNECTION_UNKOWN = 4
39
+ CONNECTION_UNKNOWN = 4
40
40
 
41
41
  attr :status
42
42
  attr :headers
@@ -185,7 +185,7 @@ module Baykit
185
185
  when "upgrade" then
186
186
  return CONNECTION_UPGRADE
187
187
  else
188
- return CONNECTION_UNKOWN
188
+ return CONNECTION_UNKNOWN
189
189
  end
190
190
  end
191
191
  end
@@ -29,6 +29,7 @@ module Baykit
29
29
  end
30
30
  @status = {}
31
31
  @initialized = false
32
+ @desc_ok = nil
32
33
 
33
34
  def self.init(bcf_file)
34
35
  if(@initialized)
@@ -42,10 +43,16 @@ module Baykit
42
43
  @status[kv.key.to_i] = kv.value
43
44
  end
44
45
  end
46
+
47
+ @desc_ok = @status[OK]
45
48
  @initialized = true
46
49
  end
47
50
 
48
51
  def self.description(status_code)
52
+ if status_code == OK
53
+ return @desc_ok
54
+ end
55
+
49
56
  desc = @status[status_code]
50
57
  if(desc == nil)
51
58
  BayLog.error("Status #{status_code} is invalid.")
@@ -5,12 +5,14 @@ require 'baykit/bayserver/util/string_util'
5
5
  require 'baykit/bayserver/util/char_util'
6
6
  require 'baykit/bayserver/util/headers'
7
7
  require 'baykit/bayserver/util/http_util'
8
+ require 'baykit/bayserver/protocol/protocol_exception'
8
9
 
9
10
  module Baykit
10
11
  module BayServer
11
12
  module Util
12
13
  class HttpUtil
13
14
  include Baykit::BayServer::Util
15
+ include Baykit::BayServer::Protocol
14
16
 
15
17
  MAX_LINE_LEN = 5000
16
18
 
@@ -151,6 +153,20 @@ module Baykit
151
153
  return nil
152
154
  end
153
155
  end
156
+
157
+ def HttpUtil.check_uri(uri)
158
+ if uri == nil
159
+ raise ProtocolException, "path is null"
160
+ end
161
+
162
+ if uri.include?("\x00")
163
+ raise ProtocolException, "path contains null byte"
164
+ end
165
+
166
+ if uri.each_char.any? { |ch| (ch.ord < 0x20) || (ch.ord == 0x7f) }
167
+ raise ProtocolException, "path contains control character"
168
+ end
169
+ end
154
170
  end
155
171
  end
156
172
  end
@@ -18,9 +18,7 @@ module Baykit
18
18
  end
19
19
 
20
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*"))
21
+ io.write([i].pack("N"))
24
22
  end
25
23
 
26
24
  def IOUtil.get_sock_recv_buf_size(skt)
@@ -0,0 +1,103 @@
1
+ require "nio"
2
+ require "thread"
3
+ require 'baykit/bayserver/util/selector'
4
+
5
+ module Baykit
6
+ module BayServer
7
+ module Util
8
+ class NioSelector < Selector
9
+
10
+ attr :selector
11
+ attr :io_monitor_map
12
+
13
+ def initialize
14
+ super
15
+
16
+ @selector = NIO::Selector.new
17
+ @io_monitor_map = {} # io -> monitor(:r)
18
+ end
19
+ def select(timeout_sec=nil)
20
+ timeout_sec = 0 if timeout_sec.nil?
21
+ ready_mon_list = @selector.select(timeout_sec)
22
+
23
+ result = {}
24
+ if ready_mon_list
25
+ ready_mon_list.each do |mon|
26
+ io = mon.io
27
+ if mon.readable?
28
+ register_read(io, result)
29
+ end
30
+ if mon.writable?
31
+ register_write(io, result)
32
+ end
33
+ end
34
+ end
35
+ result
36
+ end
37
+
38
+ def count
39
+ @lock.synchronize { @ops.length }
40
+ end
41
+
42
+ private
43
+ def register_read(io, io_op)
44
+
45
+ if !@io_op_map.key?(io)
46
+ @io_monitor_map[io] = @selector.register(io, :r)
47
+ else
48
+ op = @io_op_map[io]
49
+ if op & OP_WRITE != 0
50
+ @io_monitor_map[io].interests = :rw
51
+ end
52
+ end
53
+
54
+ super # Update @io_monitor_map
55
+ end
56
+
57
+ def register_write(io, io_op)
58
+
59
+ if !@io_op_map.key?(io)
60
+ @io_monitor_map[io] = @selector.register(io, :w)
61
+ else
62
+ op = @io_op_map[io]
63
+ if op & OP_READ != 0
64
+ @io_monitor_map[io].interests = :rw
65
+ end
66
+ end
67
+
68
+ super # Update @io_monitor_map
69
+ end
70
+
71
+ def unregister_read(io, io_op)
72
+
73
+ if @io_op_map.key?(io)
74
+ op = @io_op_map[io]
75
+ if op & OP_WRITE != 0
76
+ @io_monitor_map[io].interests = :w
77
+ else
78
+ @selector.deregister(io)
79
+ end
80
+ end
81
+
82
+ super # Update @io_monitor_map
83
+ end
84
+
85
+
86
+ def unregister_write(io, io_op)
87
+
88
+ if @io_op_map.key?(io)
89
+ op = @io_op_map[io]
90
+ if op & OP_READ != 0
91
+ @io_monitor_map[io].interests = :r
92
+ else
93
+ @selector.deregister(io)
94
+ end
95
+ end
96
+
97
+ super # Update @io_monitor_map
98
+ end
99
+
100
+ end
101
+ end
102
+ end
103
+ end