mlserver 1.0.0 → 1.0.1

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: 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