diamant 0.0.2 → 0.0.6
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/lib/diamant/response.rb +52 -0
- data/lib/diamant/version.rb +1 -1
- data/lib/diamant.rb +21 -48
- metadata +21 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92deda334209782c1d9e5c840900c91d446b2528bef1ecfe94d4aaa5f7a75e56
|
4
|
+
data.tar.gz: fbead15265bbc9268652616833877584bec9f8bddb241a4837250ea4457a529c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76406b4875304f04b95457704ab93d51e5e0f183d45defb74362169d7ca98105179202cbcb8ef5f36d779fa890aa8e3fc7da82e0ffabaa267ce1e7f4400edd06
|
7
|
+
data.tar.gz: 9ea81c1019586c2351751d1b69aa0feaae4292dc4cfb597c94fcd5a6f3dd90136e941f8377413633ce612ca046054f46e902739c3cc8fe1bc10ff676bb57ae2c
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Diamant
|
4
|
+
# Methods to generate requests responses
|
5
|
+
module Response
|
6
|
+
private
|
7
|
+
|
8
|
+
def reject_request?(sock, current_load)
|
9
|
+
# Accept only 10 thread with no restriction
|
10
|
+
return false if current_load < 11
|
11
|
+
# Seppuku
|
12
|
+
raise 'Server is under heavy load' if current_load > 1965
|
13
|
+
if current_load > 42
|
14
|
+
@logger.warn '41 - Too much threads...'
|
15
|
+
sock.puts "41 See you soon...\r\n"
|
16
|
+
return true
|
17
|
+
end
|
18
|
+
# Please wait a little
|
19
|
+
@logger.warn '44 5 - Too much threads...'
|
20
|
+
sock.puts "44 5\r\n"
|
21
|
+
true
|
22
|
+
end
|
23
|
+
|
24
|
+
def read_file(client)
|
25
|
+
r = Net::GeminiRequest.read_new(client)
|
26
|
+
[r.uri, route(r.path)]
|
27
|
+
rescue Net::GeminiBadRequest
|
28
|
+
[nil, ["59\r\n"]]
|
29
|
+
end
|
30
|
+
|
31
|
+
def route(path)
|
32
|
+
# In any case, remove the / prefix
|
33
|
+
route = File.expand_path path.delete_prefix('/'), Dir.pwd
|
34
|
+
# We better should use some sort of chroot...
|
35
|
+
unless route.start_with?(Dir.pwd)
|
36
|
+
@logger.warn "Bad attempt to get something out of public_dir: #{route}"
|
37
|
+
return ['51 Not found!']
|
38
|
+
end
|
39
|
+
route << '/index.gmi' if File.directory?(route)
|
40
|
+
return ['51 Not found!'] unless File.exist?(route)
|
41
|
+
build_response route
|
42
|
+
end
|
43
|
+
|
44
|
+
def build_response(route)
|
45
|
+
info = Diamant::MimeType.new(route)
|
46
|
+
answer = IO.readlines route, chomp: true
|
47
|
+
answer.prepend "20 #{info.content_type}"
|
48
|
+
rescue Diamant::MimeError
|
49
|
+
['50 Not a supported file!']
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/diamant/version.rb
CHANGED
data/lib/diamant.rb
CHANGED
@@ -11,6 +11,7 @@ require 'uri/gemini'
|
|
11
11
|
|
12
12
|
require 'diamant/version'
|
13
13
|
require 'diamant/mimetype'
|
14
|
+
require 'diamant/response'
|
14
15
|
|
15
16
|
module Diamant
|
16
17
|
# Runs the server request/answer loop.
|
@@ -25,34 +26,34 @@ module Diamant
|
|
25
26
|
def start
|
26
27
|
tcp_serv = TCPServer.new @bind, @port
|
27
28
|
ssl_serv = OpenSSL::SSL::SSLServer.new tcp_serv, ssl_context
|
29
|
+
main_loop(ssl_serv)
|
30
|
+
ensure
|
31
|
+
ssl_serv&.shutdown
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
include Diamant::Response
|
37
|
+
|
38
|
+
def main_loop(ssl_serv)
|
28
39
|
loop do
|
29
40
|
Thread.new(ssl_serv.accept) do |client|
|
30
41
|
handle_client(client)
|
31
42
|
client.close
|
32
43
|
end
|
44
|
+
rescue OpenSSL::SSL::SSLError => e
|
45
|
+
# Do not even try to answer anything as the socket cannot be
|
46
|
+
# built. This will abruptly interrupt the connection from a client
|
47
|
+
# point of view, which must deal with it. Only keep a trace for us.
|
48
|
+
@logger.error(
|
49
|
+
format('SSLError: %<cause>s',
|
50
|
+
cause: e.message.sub(/.*state=error: (.+)\Z/, '\1'))
|
51
|
+
)
|
52
|
+
rescue Errno::ECONNRESET
|
53
|
+
@logger.error('Connection reset by peer')
|
33
54
|
rescue Interrupt
|
34
55
|
break
|
35
56
|
end
|
36
|
-
ensure
|
37
|
-
ssl_serv&.shutdown
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def reject_request?(sock, current_load)
|
43
|
-
# Accept only 10 thread with no restriction
|
44
|
-
return false if current_load < 11
|
45
|
-
# Seppuku
|
46
|
-
raise 'Server is under heavy load' if current_load > 1965
|
47
|
-
if current_load > 42
|
48
|
-
@logger.warn '41 - Too much threads...'
|
49
|
-
sock.puts "41 See you soon...\r\n"
|
50
|
-
return true
|
51
|
-
end
|
52
|
-
# Please wait a little
|
53
|
-
@logger.warn '44 5 - Too much threads...'
|
54
|
-
sock.puts "44 5\r\n"
|
55
|
-
true
|
56
57
|
end
|
57
58
|
|
58
59
|
def handle_client(client)
|
@@ -67,34 +68,6 @@ module Diamant
|
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
70
|
-
def read_file(client)
|
71
|
-
r = Net::GeminiRequest.read_new(client)
|
72
|
-
[r.uri, route(r.path)]
|
73
|
-
rescue Net::GeminiBadRequest
|
74
|
-
[nil, ["59\r\n"]]
|
75
|
-
end
|
76
|
-
|
77
|
-
def build_response(route)
|
78
|
-
info = Diamant::MimeType.new(route)
|
79
|
-
answer = IO.readlines route, chomp: true
|
80
|
-
answer.prepend "20 #{info.content_type}"
|
81
|
-
rescue Diamant::MimeError
|
82
|
-
['50 Not a supported file!']
|
83
|
-
end
|
84
|
-
|
85
|
-
def route(path)
|
86
|
-
# In any case, remove the / prefix
|
87
|
-
route = File.expand_path path.delete_prefix('/'), Dir.pwd
|
88
|
-
# We better should use some sort of chroot...
|
89
|
-
unless route.start_with?(Dir.pwd)
|
90
|
-
@logger.warn "Bad attempt to get something out of public_dir: #{route}"
|
91
|
-
return ['51 Not found!']
|
92
|
-
end
|
93
|
-
route << '/index.gmi' if File.directory?(route)
|
94
|
-
return ['51 Not found!'] unless File.exist?(route)
|
95
|
-
build_response route
|
96
|
-
end
|
97
|
-
|
98
71
|
def ssl_context
|
99
72
|
ssl_context = OpenSSL::SSL::SSLContext.new
|
100
73
|
ssl_context.min_version = OpenSSL::SSL::TLS1_2_VERSION
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: diamant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Étienne Deparis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-net-text
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.0.
|
19
|
+
version: 0.0.5
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.0.
|
26
|
+
version: 0.0.5
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: byebug
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
47
|
+
version: '0.14'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
54
|
+
version: '0.14'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry-doc
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,70 +72,70 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '3.
|
75
|
+
version: '3.10'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '3.
|
82
|
+
version: '3.10'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '1.
|
89
|
+
version: '1.18'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '1.
|
96
|
+
version: '1.18'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubocop-performance
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '1.
|
103
|
+
version: '1.11'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '1.
|
110
|
+
version: '1.11'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rubocop-rspec
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '2.
|
117
|
+
version: '2.4'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '2.
|
124
|
+
version: '2.4'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: simplecov
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0.
|
131
|
+
version: '0.21'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: '0.
|
138
|
+
version: '0.21'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: yard
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,9 +151,9 @@ dependencies:
|
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0.9'
|
153
153
|
description: |
|
154
|
-
Diamant is a server for the Gemini network protocol.
|
155
|
-
|
156
|
-
|
154
|
+
Diamant is a server for the Gemini network protocol. It can only serve
|
155
|
+
static files. Internally, it uses the OpenSSL library to handle the TLS
|
156
|
+
sessions, and threads to handle concurrent requests.
|
157
157
|
email: etienne@depar.is
|
158
158
|
executables:
|
159
159
|
- diamant
|
@@ -165,6 +165,7 @@ files:
|
|
165
165
|
- lib/diamant.rb
|
166
166
|
- lib/diamant/cert_generator.rb
|
167
167
|
- lib/diamant/mimetype.rb
|
168
|
+
- lib/diamant/response.rb
|
168
169
|
- lib/diamant/version.rb
|
169
170
|
homepage: https://git.umaneti.net/diamant/about/
|
170
171
|
licenses:
|
@@ -185,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
185
186
|
- !ruby/object:Gem::Version
|
186
187
|
version: '0'
|
187
188
|
requirements: []
|
188
|
-
rubygems_version: 3.
|
189
|
+
rubygems_version: 3.2.32
|
189
190
|
signing_key:
|
190
191
|
specification_version: 4
|
191
192
|
summary: A simple Gemini server for static files.
|