macaw_framework 1.0.3 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 25f8f9d1a39c45e8cab35097244e958621fd566992335198ad0fae2fd482bdbd
4
- data.tar.gz: 1c0d3558ccd3aaa5b81ee4df1c80227aa558df0a62cc5b82695f0aa58b5b875f
3
+ metadata.gz: 8f108da6fb2654c701154a544cea00e47d9546c5092ef3dcbc1e299c34420ddd
4
+ data.tar.gz: 23c72078365336da0585d7ee88cce41db2972efcfcc72c930ccceb73edb302ed
5
5
  SHA512:
6
- metadata.gz: 25013e659bf86515d3d730a2d8b98c7efdb3f69fc691122e7515b6de38c772d0973d3c23d8dac9824001eb4a34b9ffe99f0c08826f71b14263fdb273b74c0cdb
7
- data.tar.gz: 872c0b12123044cf2ae34c01e2b6ff05cf1bfaa0698de8d4571fdf8492647b24c88ba415407753423db8dfcd6c6854b5cc4c16b2c856884b4ae260f25c8b6454
6
+ metadata.gz: 9e0feab01f25bab3ce8b65799c516f04a837c5e250b8f53934049c2c3f1db303d92cfa9629151c0c8b46836e9a77690aea1a27cfc7b8bb1b99c7f9340a3cb8f1
7
+ data.tar.gz: cb769896b94e443248ecc419ffb69f0c587e9cda52430516204b8bcfed0a56eed5cf4aac3f6ca05f53dabe5d954777579e088c351dd82f2a61fdf47871bc143a
data/CHANGELOG.md CHANGED
@@ -59,3 +59,11 @@
59
59
  - Fixing issue of error responses being cached
60
60
  - Implementing support for min and max SSL version
61
61
  - Creating log sanitization to prevent log forging
62
+
63
+ ## [1.0.4] - 2023-05-11
64
+
65
+ - Fixing issue with response body returning always a blank line at the beginning
66
+
67
+ ## [1.0.5] - 2023-05-12
68
+
69
+ - Fixing critical bug where threads were being killed and not respawning after abrupt client connection shutdown
@@ -55,14 +55,15 @@ class Server
55
55
  def run
56
56
  @server = TCPServer.new(@bind, @port)
57
57
  @server = OpenSSL::SSL::SSLServer.new(@server, @context) if @context
58
+ @workers_mutex = Mutex.new
58
59
  @num_threads.times do
59
- @workers << Thread.new do
60
- loop do
61
- client = @work_queue.pop
62
- break if client == :shutdown
60
+ spawn_worker
61
+ end
63
62
 
64
- handle_client(client)
65
- end
63
+ Thread.new do
64
+ loop do
65
+ sleep 10
66
+ maintain_worker_pool
66
67
  end
67
68
  end
68
69
 
@@ -100,6 +101,8 @@ class Server
100
101
  message ||= nil
101
102
  response_headers ||= nil
102
103
  client.puts ResponseDataFilter.mount_response(status, response_headers, message)
104
+ rescue IOError, Errno::EPIPE => e
105
+ @macaw_log.error("Error writing to client: #{e.message}")
103
106
  rescue TooManyRequestsError
104
107
  client.print "HTTP/1.1 429 Too Many Requests\r\n\r\n"
105
108
  rescue EndpointNotMappedError
@@ -108,7 +111,11 @@ class Server
108
111
  client.print "HTTP/1.1 500 Internal Server Error\r\n\r\n"
109
112
  @macaw_log.info("Error: #{e}")
110
113
  ensure
111
- client.close
114
+ begin
115
+ client.close
116
+ rescue IOError => e
117
+ @macaw_log.error("Error closing client: #{e.message}")
118
+ end
112
119
  end
113
120
 
114
121
  def declare_client_session(client)
@@ -181,4 +188,28 @@ class Server
181
188
  def get_client_data(body, headers, parameters)
182
189
  { body: body, headers: headers, params: parameters }
183
190
  end
191
+
192
+ def spawn_worker
193
+ @workers_mutex.synchronize do
194
+ @workers << Thread.new do
195
+ loop do
196
+ client = @work_queue.pop
197
+ break if client == :shutdown
198
+
199
+ handle_client(client)
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ def maintain_worker_pool
206
+ @workers_mutex.synchronize do
207
+ @workers.each_with_index do |worker, index|
208
+ unless worker.alive?
209
+ @macaw_log.error("Worker thread #{index} died, respawning...")
210
+ @workers[index] = spawn_worker
211
+ end
212
+ end
213
+ end
214
+ end
184
215
  end
@@ -19,13 +19,13 @@ module ResponseDataFilter
19
19
  end
20
20
 
21
21
  def self.mount_response_headers(headers)
22
- return nil if headers.nil?
22
+ return "" if headers.nil?
23
23
 
24
24
  response = ""
25
25
  headers.each do |key, value|
26
26
  response += "#{key}: #{value}\r\n"
27
27
  end
28
- response += "\r\n\r\n"
28
+ response += "\r\n"
29
29
  response
30
30
  end
31
31
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MacawFramework
4
- VERSION = "1.0.3"
4
+ VERSION = "1.0.5"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: macaw_framework
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aria Diniz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-10 00:00:00.000000000 Z
11
+ date: 2023-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prometheus-client