nonnative 1.89.0 → 1.90.0

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: 9d27a1ee9bc751f5da70f20f485d56ad06eed943a41824a20bee328feb643853
4
- data.tar.gz: 40f2576800f2b7571a4c613a957970a18ef00c99c6c936dddd2bd1ee3d2cf331
3
+ metadata.gz: 231f496f293109d5d19911d7b34663105c97e2c5221706998b40a6eebccd2257
4
+ data.tar.gz: 96f6c3137a4b206dde98e9d27e76a6b9ee62d92b57864261304f5e73e2797f33
5
5
  SHA512:
6
- metadata.gz: 0d5e87666be587a5a91782932f3f484093c3c1fdc178d16d53e6631c8388abb942d346c1762a5458be2316e636790ce550d99c1090eed5a7947b06f8f7dec873
7
- data.tar.gz: 03f379392cff88ddcc234ab6871c7b6bab01cb21916978434d63999cddfb936cdcf2bdd39b96a409f419662d416a75bb46a3406246018c2709bd1e5d361d629a
6
+ metadata.gz: a3dd070da1a8c7c85086b5044142e14375281b340a463e59cc5f671fd1b69e6ee57aa04bf06be30bea1029f58097010c48c1d0272c0fbd1f7b5968050808b194
7
+ data.tar.gz: d9d15761a5fdbb23e178dc8b5cc01f3e9d71ff7c5e2fbe78cc11be1b1b9681a9387695d116e4de8b817c58ae674c34ef79ad952305c0f4482724ea408e164bac
data/CHANGELOG.md CHANGED
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## [v1.90.0](https://github.com/alexfalkowski/nonnative/releases/tag/v1.90.0) - 2025-01-28
10
+
11
+ - [`3842ebe`](https://github.com/alexfalkowski/nonnative/commit/3842ebe97f00fc7f522a53e7421def15d952e775) feat(proxy): add http proxy server (#497)
12
+
9
13
  ## [v1.89.0](https://github.com/alexfalkowski/nonnative/releases/tag/v1.89.0) - 2025-01-27
10
14
 
11
15
  - [`e31d54e`](https://github.com/alexfalkowski/nonnative/commit/e31d54e2ebeec01a56974897f40679ca86fb2006) feat(http_client): add ability to retry (#496)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nonnative (1.89.0)
4
+ nonnative (1.90.0)
5
5
  concurrent-ruby (>= 1, < 2)
6
6
  config (>= 5, < 6)
7
7
  cucumber (>= 7, < 10)
data/README.md CHANGED
@@ -231,18 +231,20 @@ Define your server:
231
231
  module Nonnative
232
232
  module Features
233
233
  class Application < Sinatra::Application
234
- configure do
235
- set :logging, false
236
- end
237
-
238
234
  get '/hello' do
239
235
  'Hello World!'
240
236
  end
241
237
  end
242
238
 
243
239
  class HTTPServer < Nonnative::HTTPServer
244
- def app
245
- Application
240
+ def initialize(service)
241
+ app = Sinatra.new(Application) do
242
+ configure do
243
+ set :logging, false
244
+ end
245
+ end
246
+
247
+ super(app, service)
246
248
  end
247
249
  end
248
250
  end
@@ -292,6 +294,67 @@ Nonnative.configure do |config|
292
294
  end
293
295
  ```
294
296
 
297
+ ##### Proxy
298
+
299
+ The system allows you to define a http proxy for external systems, e.g api.github.com
300
+
301
+ Define your server:
302
+
303
+ ```ruby
304
+ module Nonnative
305
+ module Features
306
+ class HTTPProxyServer < Nonnative::HTTPProxyServer
307
+ def initialize(service)
308
+ super('www.afalkowski.com', service)
309
+ end
310
+ end
311
+ end
312
+ end
313
+ ```
314
+
315
+ Setup it up programmatically:
316
+
317
+ ```ruby
318
+ require 'nonnative'
319
+
320
+ Nonnative.configure do |config|
321
+ config.version = '1.0'
322
+ config.url = 'http://localhost:4567'
323
+
324
+ config.server do |s|
325
+ s.name = 'http_server_proxy'
326
+ s.klass = Nonnative::Features::HTTPProxyServer
327
+ s.timeout = 1
328
+ s.port = 4567
329
+ s.log = 'http_server_proxy.log'
330
+ end
331
+ end
332
+ ```
333
+
334
+ Setup it up through configuration:
335
+
336
+ ```yaml
337
+ version: "1.0"
338
+ url: http://localhost:4567
339
+ servers:
340
+ -
341
+ name: http_server_proxy
342
+ class: Nonnative::Features::HTTPProxyServer
343
+ timeout: 1
344
+ port: 4567
345
+ log: http_server_proxy.log
346
+ ```
347
+
348
+ Then load the file with:
349
+
350
+ ```ruby
351
+ require 'nonnative'
352
+
353
+ Nonnative.configure do |config|
354
+ config.load_file('configuration.yml')
355
+ end
356
+ ```
357
+
295
358
  #### gRPC
296
359
 
297
360
  Define your server:
@@ -306,8 +369,10 @@ module Nonnative
306
369
  end
307
370
 
308
371
  class GRPCServer < Nonnative::GRPCServer
309
- def svc
310
- Greeter.new
372
+ def initialize(service)
373
+ svc = Greeter.new
374
+
375
+ super(svc, service)
311
376
  end
312
377
  end
313
378
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Nonnative
4
4
  class GRPCServer < Nonnative::Server
5
- def initialize(service)
5
+ def initialize(svc, service)
6
6
  @server = GRPC::RpcServer.new
7
7
  server.handle(svc)
8
8
 
@@ -11,7 +11,7 @@ module Nonnative
11
11
  @logger ||= Logger.new(service.log)
12
12
  end
13
13
 
14
- super
14
+ super(service)
15
15
  end
16
16
 
17
17
  protected
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Adapted from https://gist.github.com/RaVbaker/d9ead3c92b915f997dab25c7f0c0ab65
4
+ module Nonnative
5
+ class HTTPProxyApplication < Sinatra::Application
6
+ def retrieve_headers(request)
7
+ headers = request.env.map do |header, value|
8
+ [header[5..].split('_').map(&:capitalize).join('-'), value] if header.start_with?('HTTP_')
9
+ end
10
+ headers = headers.compact.to_h
11
+
12
+ headers.except('Host', 'Accept-Encoding', 'Version')
13
+ end
14
+
15
+ def build_url(request, settings)
16
+ URI::HTTPS.build(host: settings.host, path: request.path_info, query: request.query_string).to_s
17
+ end
18
+
19
+ def api_response(verb, uri, opts)
20
+ client = RestClient::Resource.new(uri, opts)
21
+
22
+ client.send(verb)
23
+ end
24
+
25
+ %w[get post put patch delete].each do |verb|
26
+ send(verb, /.*/) do
27
+ uri = build_url(request, settings)
28
+ opts = { headers: retrieve_headers(request) }
29
+ res = api_response(verb, uri, opts)
30
+
31
+ status res.code
32
+ res.body
33
+ end
34
+ end
35
+ end
36
+
37
+ class HTTPProxyServer < Nonnative::HTTPServer
38
+ def initialize(host, service)
39
+ app = Sinatra.new(Nonnative::HTTPProxyApplication) do
40
+ configure do
41
+ set :logging, false
42
+ set :host, host
43
+ end
44
+ end
45
+
46
+ super(app, service)
47
+ end
48
+ end
49
+ end
@@ -2,10 +2,11 @@
2
2
 
3
3
  module Nonnative
4
4
  class HTTPServer < Nonnative::Server
5
- def initialize(service)
5
+ def initialize(app, service)
6
6
  @server = ::Rackup::Handler.get('webrick')
7
+ @app = app
7
8
 
8
- super
9
+ super(service)
9
10
  end
10
11
 
11
12
  protected
@@ -27,6 +28,6 @@ module Nonnative
27
28
 
28
29
  private
29
30
 
30
- attr_reader :queue, :server
31
+ attr_reader :queue, :server, :app
31
32
  end
32
33
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nonnative
4
- VERSION = '1.89.0'
4
+ VERSION = '1.90.0'
5
5
  end
data/lib/nonnative.rb CHANGED
@@ -40,6 +40,7 @@ require 'nonnative/service'
40
40
  require 'nonnative/pool'
41
41
  require 'nonnative/http_client'
42
42
  require 'nonnative/http_server'
43
+ require 'nonnative/http_proxy_server'
43
44
  require 'nonnative/grpc_server'
44
45
  require 'nonnative/observability'
45
46
  require 'nonnative/proxy_factory'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nonnative
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.89.0
4
+ version: 1.90.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alejandro Falkowski
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-01-27 00:00:00.000000000 Z
10
+ date: 2025-01-28 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: concurrent-ruby
@@ -305,6 +305,7 @@ files:
305
305
  - lib/nonnative/grpc_server.rb
306
306
  - lib/nonnative/header.rb
307
307
  - lib/nonnative/http_client.rb
308
+ - lib/nonnative/http_proxy_server.rb
308
309
  - lib/nonnative/http_server.rb
309
310
  - lib/nonnative/invalid_data_socket_pair.rb
310
311
  - lib/nonnative/no_proxy.rb