diamant 0.0.7 → 0.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 124c00db017955325f9d1c854693310303e9871fd1ce2e64b5fa26280db74f4e
4
- data.tar.gz: e50d53f1b57a562c39dbfc1a98599c4d52f09c84aeab8ba207fec32693d0d75a
3
+ metadata.gz: 5f4a7116de355c0b04280914d27758f287116298d2cde5a36e311382352342b1
4
+ data.tar.gz: 04a5cd38b4596383a220bd553b6e6d1a9360310810156d009f8cad569db9bd01
5
5
  SHA512:
6
- metadata.gz: a5933c8f275cc1835af909c6e271e71468b26898e58b851fa67f500e51ef9a0b9841b0db8f3ae318e5b59927adc1bb966aa39ae946440779e25b8a044489e2ac
7
- data.tar.gz: 276b5ff6c7ecc14b1b6d7fc74b187eccca41b46fd7dbffee98f61c8aee5e8a5854f9dbc9d88c54239860870edc24f56a6f3e838ba0dd478ca1fbd01cf77510f8
6
+ metadata.gz: e948fce49088c1b5483a18dd4c4dfccfbaefb7b160d4a9ce0fc880a0bf4487c6ded0eda9a3b58de9ad74fe5a05f3922c790716d26789db0a18621381fe6acefe
7
+ data.tar.gz: 1113f9c27f505edcc445b116a3d9dbb900c681a5305b48655d72faee52714a1ca7c4b3b71a7123b80e8f93468ecfcfa88afd5f455e2fc4222adef6e73070fa61
@@ -23,15 +23,15 @@ module Diamant
23
23
  end
24
24
 
25
25
  def write
26
- IO.write('key.rsa', @key.to_pem)
26
+ File.write('key.rsa', @key.to_pem)
27
27
  File.chmod(0o400, 'key.rsa')
28
- IO.write('cert.pem', @cert.to_pem)
28
+ File.write('cert.pem', @cert.to_pem)
29
29
  File.chmod(0o644, 'cert.pem')
30
30
  end
31
31
 
32
32
  private
33
33
 
34
- def init_cert
34
+ def init_cert # rubocop:disable Metrics/AbcSize
35
35
  @cert = OpenSSL::X509::Certificate.new
36
36
  @cert.version = 3
37
37
  @cert.serial = 0x0
@@ -40,7 +40,7 @@ module Diamant
40
40
  @cert.public_key = @key.public_key
41
41
  @cert.not_before = Time.now
42
42
  # 1 years validity
43
- @cert.not_after = @cert.not_before + 1 * 365 * 24 * 60 * 60
43
+ @cert.not_after = @cert.not_before + (1 * 365 * 24 * 60 * 60)
44
44
  @cert
45
45
  end
46
46
 
@@ -34,6 +34,7 @@ module Diamant
34
34
  def extract_info
35
35
  @extension = File.extname @path
36
36
  raise MimeError, "#{@path} format is not supported!" unless supported?
37
+
37
38
  # Any other supported extension
38
39
  @content_type = MIMETYPES[@extension]
39
40
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'net/gemini/request'
4
+ require 'uri/gemini'
5
+
3
6
  module Diamant
4
7
  # Methods to generate requests responses
5
8
  module Response
@@ -10,6 +13,7 @@ module Diamant
10
13
  return false if current_load < 11
11
14
  # Seppuku
12
15
  raise 'Server is under heavy load' if current_load > 1965
16
+
13
17
  if current_load > 42
14
18
  @logger.warn '41 - Too much threads...'
15
19
  sock.puts "41 See you soon...\r\n"
@@ -22,9 +26,10 @@ module Diamant
22
26
  end
23
27
 
24
28
  def read_file(client)
25
- r = Net::GeminiRequest.read_new(client)
29
+ r = Net::Gemini::Request.read_new(client)
26
30
  [r.uri, route(r.path)]
27
- rescue Net::GeminiBadRequest, URI::InvalidURIError
31
+ rescue Net::Gemini::BadRequest, URI::InvalidURIError => e
32
+ @logger.error "59 - #{e}"
28
33
  [nil, ["59\r\n"]]
29
34
  end
30
35
 
@@ -38,12 +43,13 @@ module Diamant
38
43
  end
39
44
  route << '/index.gmi' if File.directory?(route)
40
45
  return ['51 Not found!'] unless File.exist?(route)
46
+
41
47
  build_response route
42
48
  end
43
49
 
44
50
  def build_response(route)
45
51
  info = Diamant::MimeType.new(route)
46
- answer = IO.readlines route, chomp: true
52
+ answer = File.readlines route, chomp: true
47
53
  answer.prepend "20 #{info.content_type}"
48
54
  rescue Diamant::MimeError
49
55
  ['50 Not a supported file!']
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Diamant
4
- VERSION = '0.0.7'
4
+ VERSION = '0.0.9'
5
5
  end
data/lib/diamant.rb CHANGED
@@ -6,9 +6,6 @@ require 'English'
6
6
  require 'openssl'
7
7
  require 'fileutils'
8
8
 
9
- require 'net/gemini/request'
10
- require 'uri/gemini'
11
-
12
9
  require 'diamant/version'
13
10
  require 'diamant/mimetype'
14
11
  require 'diamant/response'
@@ -37,13 +34,7 @@ module Diamant
37
34
 
38
35
  def main_loop(ssl_serv)
39
36
  loop do
40
- Thread.new(ssl_serv.accept) do |client|
41
- handle_client(client)
42
- rescue Errno::ECONNRESET, Errno::ENOTCONN => e
43
- @logger.error(e.message)
44
- ensure
45
- client.close
46
- end
37
+ main_loop_tick ssl_serv.accept
47
38
  rescue OpenSSL::SSL::SSLError => e
48
39
  # Do not even try to answer anything as the socket cannot be
49
40
  # built. This will abruptly interrupt the connection from a client
@@ -59,9 +50,21 @@ module Diamant
59
50
  end
60
51
  end
61
52
 
53
+ # Might raises some errors
54
+ def main_loop_tick(connection)
55
+ Thread.new(connection) do |client|
56
+ handle_client(client)
57
+ rescue Errno::ECONNRESET, Errno::ENOTCONN, Errno::ETIMEDOUT => e
58
+ @logger.error(e.message)
59
+ ensure
60
+ client.close
61
+ end
62
+ end
63
+
62
64
  def handle_client(client)
63
65
  current_load = Thread.list.length - 1
64
66
  return if reject_request?(client, current_load)
67
+
65
68
  uri, answer = read_file(client)
66
69
  log_line = [current_load, client.peeraddr[3], answer[0]]
67
70
  log_line << uri if uri
@@ -90,6 +93,7 @@ module Diamant
90
93
  def check_option_path_exist(option, default)
91
94
  path = File.expand_path(option || default)
92
95
  return path if File.exist?(path)
96
+
93
97
  raise ArgumentError, "#{path} does not exist!"
94
98
  end
95
99
 
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.7
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Étienne Deparis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-18 00:00:00.000000000 Z
11
+ date: 2024-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-net-text
@@ -16,140 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.0.5
19
+ version: '0.1'
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.5
27
- - !ruby/object:Gem::Dependency
28
- name: byebug
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '11.1'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '11.1'
41
- - !ruby/object:Gem::Dependency
42
- name: pry
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0.14'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.14'
55
- - !ruby/object:Gem::Dependency
56
- name: pry-doc
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.1'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.1'
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3.10'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.10'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.18'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '1.18'
97
- - !ruby/object:Gem::Dependency
98
- name: rubocop-performance
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '1.11'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '1.11'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop-rspec
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '2.4'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '2.4'
125
- - !ruby/object:Gem::Dependency
126
- name: simplecov
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '0.21'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '0.21'
139
- - !ruby/object:Gem::Dependency
140
- name: yard
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '0.9'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '0.9'
26
+ version: '0.1'
153
27
  description: |
154
28
  Diamant is a server for the Gemini network protocol. It can only serve
155
29
  static files. Internally, it uses the OpenSSL library to handle the TLS
@@ -170,7 +44,11 @@ files:
170
44
  homepage: https://git.umaneti.net/diamant/about/
171
45
  licenses:
172
46
  - WTFPL
173
- metadata: {}
47
+ metadata:
48
+ rubygems_mfa_required: 'true'
49
+ source_code_uri: https://git.umaneti.net/fronde
50
+ homepage_uri: https://etienne.depar.is/fronde/
51
+ funding_uri: https://liberapay.com/milouse
174
52
  post_install_message:
175
53
  rdoc_options: []
176
54
  require_paths:
@@ -186,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
64
  - !ruby/object:Gem::Version
187
65
  version: '0'
188
66
  requirements: []
189
- rubygems_version: 3.4.10
67
+ rubygems_version: 3.5.15
190
68
  signing_key:
191
69
  specification_version: 4
192
70
  summary: A simple Gemini server for static files.