adelnor 0.0.6 → 0.0.7
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.
- checksums.yaml +4 -4
- data/README.md +19 -6
- data/adelnor.gemspec +1 -1
- data/lib/adelnor/request.rb +2 -0
- data/lib/adelnor/response.rb +1 -1
- data/lib/adelnor/server.rb +42 -5
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bbe7f5e96936b78536738d717ea5babeb525aec4ecc202774e6564095d21663
|
4
|
+
data.tar.gz: 8da6cf7523a6d8f5d520fe6eb1c8e02320b53e79f631b0e36d0401a29f093f47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b46502cfb371089998df7cf3d98221224df23ebb77cfd6f368d9d3b21df8ef8244a8cde14207c8b511146011fcd6766498483288ade45f263fdb00b4c7ed3927
|
7
|
+
data.tar.gz: d7fdfbe381e3c56c4c6bfdc7109afdd10ee9bd05c7d95d5da012fe671f3b547763a3bb916e519c2228038a1a6be7c473236c5bb623662e0ff7b8f7672209349b
|
data/README.md
CHANGED
@@ -7,12 +7,13 @@
|
|
7
7
|

|
8
8
|
[](https://github.com/rubocop/rubocop)
|
9
9
|
[](https://rubystyle.guide)
|
10
|
-
```
|
11
|
-
|
12
|
-
\
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
```
|
11
|
+
___ _______ _______ __ .__ __. ______ .______
|
12
|
+
/ \ | \ | ____|| | | \ | | / __ \ | _ \
|
13
|
+
/ ^ \ | .--. || |__ | | | \| | | | | | | |_) |
|
14
|
+
/ /_\ \ | | | || __| | | | . ` | | | | | | /
|
15
|
+
/ _____ \ | '--' || |____ | `----.| |\ | | `--' | | |\ \----.
|
16
|
+
/__/ \__\ |_______/ |_______||_______||__| \__| \______/ | _| `._____|
|
16
17
|
```
|
17
18
|
|
18
19
|
[adelnor](https://rubygems.org/gems/adelnor) is a dead simple, yet Rack-compatible, HTTP server written in Ruby.
|
@@ -56,4 +57,16 @@ $ make bundle.install
|
|
56
57
|
$ make sample.server
|
57
58
|
```
|
58
59
|
|
60
|
+
## Using Thread Pool
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
require './lib/adelnor/server'
|
64
|
+
|
65
|
+
app = -> (env) do
|
66
|
+
[200, { 'Content-Type' => 'text/html' }, 'Hello world!']
|
67
|
+
end
|
68
|
+
|
69
|
+
Adelnor::Server.run app, 3000, thread_pool: 5
|
70
|
+
```
|
71
|
+
|
59
72
|
Open `http://localhost:3000`
|
data/adelnor.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'adelnor'
|
5
|
-
spec.version = '0.0.
|
5
|
+
spec.version = '0.0.7'
|
6
6
|
spec.summary = 'Adelnor HTTP server'
|
7
7
|
spec.description = 'A dead simple, yet Rack-compatible, HTTP server written in Ruby'
|
8
8
|
spec.authors = ['Leandro Proença']
|
data/lib/adelnor/request.rb
CHANGED
data/lib/adelnor/response.rb
CHANGED
@@ -19,6 +19,6 @@ module Adelnor
|
|
19
19
|
private
|
20
20
|
|
21
21
|
def headers_as_string = @headers.reduce('', &method(:acc_header_string))
|
22
|
-
def acc_header_string(acc, (key, value)) = acc
|
22
|
+
def acc_header_string(acc, (key, value)) = acc + "#{key}: #{value}\r\n"
|
23
23
|
end
|
24
24
|
end
|
data/lib/adelnor/server.rb
CHANGED
@@ -9,15 +9,17 @@ require_relative './response'
|
|
9
9
|
|
10
10
|
module Adelnor
|
11
11
|
class Server
|
12
|
-
def initialize(rack_app, port)
|
12
|
+
def initialize(rack_app, port, options = {})
|
13
13
|
@rack_app = rack_app
|
14
14
|
@port = port
|
15
|
+
@options = options
|
15
16
|
@socket = Socket.new(:INET, :STREAM)
|
16
17
|
addr = Socket.sockaddr_in(@port, '0.0.0.0')
|
17
18
|
|
18
19
|
@socket.bind(addr)
|
19
20
|
@socket.listen(2)
|
20
21
|
|
22
|
+
@thread_queue = Queue.new if @options[:thread_pool]
|
21
23
|
puts welcome_message
|
22
24
|
end
|
23
25
|
|
@@ -39,15 +41,44 @@ module Adelnor
|
|
39
41
|
end
|
40
42
|
|
41
43
|
def run
|
44
|
+
if (pool_size = @options[:thread_pool])
|
45
|
+
return run_with_thread_pool(pool_size)
|
46
|
+
end
|
47
|
+
|
42
48
|
loop do
|
43
49
|
client, = @socket.accept
|
44
50
|
|
45
51
|
handle(client)
|
46
|
-
|
47
52
|
client.close
|
48
53
|
end
|
49
54
|
end
|
50
55
|
|
56
|
+
def run_with_thread_pool(pool_size)
|
57
|
+
pool_size.times do
|
58
|
+
handle_request_in_thread
|
59
|
+
end
|
60
|
+
|
61
|
+
loop do
|
62
|
+
client, = @socket.accept
|
63
|
+
|
64
|
+
@thread_queue.push(client)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def handle_request_in_thread
|
69
|
+
Thread.new do
|
70
|
+
tid = Thread.current.object_id
|
71
|
+
|
72
|
+
puts "[#{tid}] Thread started"
|
73
|
+
loop do
|
74
|
+
client = @thread_queue.pop
|
75
|
+
|
76
|
+
handle(client)
|
77
|
+
client.close
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
51
82
|
def handle(client)
|
52
83
|
read_request_message(client)
|
53
84
|
.then { |message| Request.build(message) }
|
@@ -61,9 +92,11 @@ module Adelnor
|
|
61
92
|
def read_request_message(client)
|
62
93
|
message = ''
|
63
94
|
|
64
|
-
|
65
|
-
|
66
|
-
|
95
|
+
if (line = client.gets)
|
96
|
+
message += line
|
97
|
+
end
|
98
|
+
|
99
|
+
puts "\n[#{Time.now}] #{message}"
|
67
100
|
|
68
101
|
while (line = client.gets)
|
69
102
|
break if line == "\r\n"
|
@@ -75,6 +108,8 @@ module Adelnor
|
|
75
108
|
end
|
76
109
|
|
77
110
|
def welcome_message
|
111
|
+
thread_pool_message = "Running with thread pool of #{@options[:thread_pool]} threads" if @options[:thread_pool]
|
112
|
+
|
78
113
|
<<~WELCOME
|
79
114
|
|\---/|
|
80
115
|
| o_o |
|
@@ -86,6 +121,8 @@ module Adelnor
|
|
86
121
|
|
87
122
|
Adelnor is running at http://0.0.0.0:#{@port}
|
88
123
|
Listening to HTTP connections
|
124
|
+
|
125
|
+
#{thread_pool_message}
|
89
126
|
WELCOME
|
90
127
|
end
|
91
128
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adelnor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leandro Proença
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -43,7 +43,7 @@ homepage: https://github.com/leandronsp/adelnor
|
|
43
43
|
licenses:
|
44
44
|
- MIT
|
45
45
|
metadata: {}
|
46
|
-
post_install_message:
|
46
|
+
post_install_message:
|
47
47
|
rdoc_options: []
|
48
48
|
require_paths:
|
49
49
|
- lib
|
@@ -58,8 +58,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
version: '0'
|
60
60
|
requirements: []
|
61
|
-
rubygems_version: 3.
|
62
|
-
signing_key:
|
61
|
+
rubygems_version: 3.4.10
|
62
|
+
signing_key:
|
63
63
|
specification_version: 4
|
64
64
|
summary: Adelnor HTTP server
|
65
65
|
test_files: []
|