mlserver 1.0.0 → 1.0.1

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: 6b326cb18fd091f0272824b58d166980a1e3add7e87d508dd4895388eae223c8
4
- data.tar.gz: 26e225d538c7791fe256aa31f1cd14e40b505ffcdb3217296ec602ad1318fe8d
3
+ metadata.gz: 565870637b0850519fc89c56d3aa2dbf8a400d26577440d81b1db195ce4eae78
4
+ data.tar.gz: 8632c4624dcd90c02a76ba2437a92ca74d3fa4d93c709f3e75b0332f0f5b668b
5
5
  SHA512:
6
- metadata.gz: 2fc0d8d718f919271737cddc7fc361e47b5cdba17091c8b53684612dabbca8b5ed42aaf80c0f6f06fa5e4163ee41f8957a4f4ef3a27dbc3905a8f2c34512c286
7
- data.tar.gz: 58c17b39a1fc34cc1aaf72242683d3fb22d3a177a362b235964d94ca961da435400c2f684239dfe7af67db6f410a245a882d8ef305675a982a7e2c81c6b5b97f
6
+ metadata.gz: beb25988af8aeda7895d8fbc794c1cf9f4c3d6b9efc32ad9886bf09534eff26c525d0d2a5108d34d0d265029524d3c9a4615fc1d36df7ad2420dc0e450ea9d89
7
+ data.tar.gz: a07ce050c8f7efd559218c5ed1ca9f852aa582cb0186ff35f7ac644e3dedc0849fda84d0cabbf4dbff9bf6a4b4d035f257b7a509eee7e7128b4fa35eac4f3e54
data/bin/mlserver CHANGED
@@ -1,3 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "MLserver"
4
+ require "argparse"
5
+
6
+ MLserver.settings = MLserver::Settings.new()
7
+
8
+ o = {}
9
+ s = {}
10
+
11
+ x = ArgsParser::Args.new(options: o, switches: s)
12
+
13
+ conf_file = x.data[0]
14
+ require_relative conf_file
15
+
16
+ MLserver::Server.start()
@@ -54,7 +54,8 @@ module MLserver
54
54
  end
55
55
 
56
56
  def html_page
57
- return File.read(File.dirname(__FILE__) + "/html/error_page.template.html").gsub("[ecode]", @code.to_s).gsub("[emsg]", @message)
57
+ footer = File.read(File.dirname(__FILE__) + "/html/default_response_footer.template.html").gsub("[ver]", MLserver.version).gsub("[date]", Time.now.to_s)
58
+ return File.read(File.dirname(__FILE__) + "/html/error_page.template.html").gsub("[ecode]", @code.to_s).gsub("[emsg]", @message).gsub("[ftr]", footer)
58
59
  end
59
60
  end
60
61
  end
@@ -0,0 +1,5 @@
1
+ <footer>
2
+ <hr>
3
+ <p>MLserver [ver]</p>
4
+ <p>[date]</p>
5
+ </footer>
@@ -6,5 +6,6 @@
6
6
 
7
7
  <body>
8
8
  <h1>[emsg]</h1>
9
+ [ftr]
9
10
  </body>
10
11
  </html>
@@ -7,54 +7,114 @@ module MLserver
7
7
 
8
8
  host = settings.host
9
9
  port = settings.port
10
+ ssl_host = settings.ssl_host
11
+ ssl_port = settings.ssl_port
10
12
  handler = settings.handler
11
13
  logger = settings.logger
12
14
 
13
15
  logger.log "MLserver #{MLserver.version}"
14
16
 
15
- server = TCPServer.new(host, port)
16
-
17
+ http_server = TCPServer.new(host, port)
17
18
  logger.log "Listening on #{logger.format_ip_address host}:#{port}"
18
19
 
19
- loop do
20
- Thread.start(server.accept) do |client|
21
- loop do
22
- r=RequestParser.parse_request(client)
20
+ if settings.ssl
21
+ ssl_context = OpenSSL::SSL::SSLContext.new
22
+ ssl_context.cert = OpenSSL::X509::Certificate.new(File.open(settings.ssl_cert).read)
23
+ ssl_context.key = OpenSSL::PKey::RSA.new(File.open(settings.ssl_key).read)
24
+
25
+ store = OpenSSL::X509::Store.new
26
+ settings.ssl_additional_certs.each do |c|
27
+ store.add_cert(OpenSSL::X509::Certificate.new(File.open(c).read))
28
+ end
23
29
 
24
- logger.log_traffic client.peeraddr[2], :incoming, "#{r.method} #{r.path} #{r.httpver}"
30
+ ssl_context.cert_store = store
25
31
 
26
- if !@@valid_http_versions.include?(r.httpver)
27
- client_ip = client.peeraddr[2]
32
+ tcp_server = TCPServer.new(ssl_host, ssl_port)
28
33
 
29
- resp = MLserver::ErrorResponse.new(505)
30
- r.respond resp.response
31
- client.close
34
+ ssl_server = OpenSSL::SSL::SSLServer.new(tcp_server, ssl_context)
35
+ logger.log "Listening with SSL on #{logger.format_ip_address ssl_host}:#{ssl_port}"
36
+ end
32
37
 
33
- Thread.exit
38
+ if settings.ssl
39
+ Thread.new do
40
+ loop do
41
+ begin
42
+ client = ssl_server.accept
43
+ rescue OpenSSL::SSL::SSLError => e
44
+ logger.log "SSL error occured: #{e}", :error
45
+ client.close if client
46
+ next
34
47
  end
35
48
 
36
- if r.httpver == "HTTP/1.1"
37
- if !r.headers[:Host]
38
- r.respond ErrorResponse.new(400).response
39
- client.close
40
- Thread.exit
41
- elsif settings.force_host
42
- if !settings.force_host.include?(r.headers[:Host])
43
- r.respond ErrorResponse.new(400).response
44
- client.close
45
- Thread.exit
46
- end
47
- end
49
+ Thread.start(client) do |client|
50
+ self.handle_client client
48
51
  end
52
+ end
53
+ end
54
+ end
55
+
56
+ loop do
57
+ begin
58
+ client = http_server.accept
59
+ rescue OpenSSL::SSL::SSLError => e
60
+ logger.log "SSL error occured: #{e}", :error
61
+ client.close if client
62
+ next
63
+ end
64
+
65
+ Thread.start(client) do |client|
66
+ self.handle_client client
67
+ end
68
+ end
69
+ end
70
+
71
+ def self.handle_client(client)
72
+ settings = MLserver.settings
73
+
74
+ logger = MLserver.settings.logger
75
+ handler = MLserver.settings.handler
76
+
77
+ loop do
78
+ r=RequestParser.parse_request(client)
49
79
 
50
- handler.run(r, client)
80
+ logger.log_traffic client.peeraddr[2], :incoming, "#{r.method} #{r.path} #{r.httpver}"
51
81
 
52
- if r.httpver == "HTTP/1.0" || r.headers[:Connection] == "close"
82
+ if !@@valid_http_versions.include?(r.httpver)
83
+ client_ip = client.peeraddr[2]
84
+
85
+ resp = MLserver::ErrorResponse.new(505)
86
+ r.respond resp.response
87
+ client.close
88
+
89
+ Thread.exit
90
+ end
91
+
92
+ if r.httpver == "HTTP/1.1"
93
+ if !r.headers[:Host]
94
+ r.respond ErrorResponse.new(400).response
95
+ client.close
96
+ Thread.exit
97
+ elsif settings.force_host
98
+ if !settings.force_host.include?(r.headers[:Host])
99
+ r.respond ErrorResponse.new(400).response
53
100
  client.close
54
101
  Thread.exit
55
102
  end
56
103
  end
57
104
  end
105
+
106
+ begin
107
+ handler.run(r, client)
108
+ rescue => e
109
+ r.respond ErrorResponse.new(500).response
110
+ logger.log "An error occured: #{e.message}", :error
111
+ raise e
112
+ end
113
+
114
+ if r.httpver == "HTTP/1.0" || r.headers[:Connection] == "close"
115
+ client.close
116
+ Thread.exit
117
+ end
58
118
  end
59
119
  end
60
120
  end
@@ -2,15 +2,21 @@ module MLserver
2
2
  @@settings = nil
3
3
 
4
4
  class Settings
5
- def initialize(host: "0.0.0.0", port: "5555", handler:, logger:, force_host: false)
5
+ def initialize(host: "0.0.0.0", port: "5555")
6
6
  @host = host
7
7
  @port = port.to_i
8
- @handler = handler
9
- @logger = logger
10
- @force_host = force_host
8
+ @handler = nil
9
+ @logger = nil
10
+ @force_host = nil
11
+ @ssl = nil
12
+ @ssl_key = nil
13
+ @ssl_cert = nil
14
+ @ssl_additional_certs = []
15
+ @ssl_host = nil
16
+ @ssl_port = nil
11
17
  end
12
18
 
13
- attr_accessor :host, :port, :handler, :logger, :force_host
19
+ attr_accessor :host, :port, :handler, :logger, :force_host, :ssl, :ssl_key, :ssl_cert, :ssl_additional_certs, :ssl_host, :ssl_port
14
20
  end
15
21
 
16
22
  def self.settings
data/lib/MLserver.rb CHANGED
@@ -1,12 +1,13 @@
1
1
  module MLserver
2
2
  def self.version
3
- "1.0.0"
3
+ "1.0.1"
4
4
  end
5
5
  end
6
6
 
7
7
  require "socket"
8
8
  require "rbtext"
9
9
  require "rbtext/string_methods"
10
+ require "openssl"
10
11
  require_relative "MLserver/request.rb"
11
12
  require_relative "MLserver/request_parser.rb"
12
13
  require_relative "MLserver/response.rb"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mlserver
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Lee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-06 00:00:00.000000000 Z
11
+ date: 2023-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: argparse
@@ -49,6 +49,7 @@ files:
49
49
  - lib/MLserver.rb
50
50
  - lib/MLserver/client_handler.rb
51
51
  - lib/MLserver/error_response.rb
52
+ - lib/MLserver/html/default_response_footer.template.html
52
53
  - lib/MLserver/html/error_page.template.html
53
54
  - lib/MLserver/logger.rb
54
55
  - lib/MLserver/redirect_response.rb