diamant 0.0.2 → 0.0.6

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: 72a20983fb5689076b1da91f753515fb251f96c73917628ba5d2e975d34c526c
4
- data.tar.gz: efed078e4f3f0f2a556da98b2308fdc2d6d2af927b4e7ef61901b08490e4ef55
3
+ metadata.gz: 92deda334209782c1d9e5c840900c91d446b2528bef1ecfe94d4aaa5f7a75e56
4
+ data.tar.gz: fbead15265bbc9268652616833877584bec9f8bddb241a4837250ea4457a529c
5
5
  SHA512:
6
- metadata.gz: c15a92708e8b9bf8ebc746dd850e4f500affbac1fe32e29c0ee2b73efd998b12865ba2e6f68dd130bf42f3f042eed267852ed9a545bcc15797264ccbd39edc3f
7
- data.tar.gz: '084cca645aa707d1140a787a35a8a548a2385bb9dfc4aa25110df0f8b75875238595accf4feb21bcc4f7cc9ec5d5e431ec75ace67943f0d48d3abae14f8674c7'
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Diamant
4
- VERSION = '0.0.2'
4
+ VERSION = '0.0.6'
5
5
  end
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.2
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: 2020-11-20 00:00:00.000000000 Z
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.2
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.2
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.13'
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.13'
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.9'
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.9'
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.3'
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.3'
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.9'
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.9'
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.0'
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.0'
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.19'
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.19'
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. it
155
- can only serve static files. Internally, it uses the OpenSSL library to
156
- handle the TLS sessions, and threads to handle concurrent requests.
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.1.4
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.