rack-override-path 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e4be864619f6102210a1967b52807cca4ff559bd3132165a26fddc3a09db33b6
4
+ data.tar.gz: b4cf3483d8f003a623b992aacfb8990f739809d9167687289133bb9f8a125b6b
5
+ SHA512:
6
+ metadata.gz: 51dff59c329ac921d628f718538fa1d3c27361bfbdc853be78a11197113a319be43a8c51651e9dc9aa52056ba40bdd9dbea35c1fd1cce6d7751e23881e6890d3
7
+ data.tar.gz: b9138ade96bd0a9c20e789d5e022ce700b936f32b48b7abfe5d56dc0d6d7e65db7464627764b6d9fbd17bd951c1f97dae3b50d3b1832e190333464f37f280792
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'rack/override_path'
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'override_path'
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'rack'
5
+
6
+ module Rack
7
+ class OverridePath
8
+ DEFAULT_BODY = ''
9
+ DEFAULT_DELAY = 0
10
+ DEFAULT_HEADERS = {}.freeze
11
+ DEFAULT_STATUS = 200
12
+ OVERRIDE_KEYS = %w[body delay headers status].freeze
13
+
14
+ def initialize(app)
15
+ @app = app
16
+ @overridden_paths = []
17
+ end
18
+
19
+ def call(env)
20
+ req = request(env)
21
+ if override_path?(req)
22
+ override_path(req)
23
+ elsif path_overridden?(req.path)
24
+ handle_override(req.path, env)
25
+ else
26
+ @app.call(env)
27
+ end
28
+ end
29
+
30
+ def override(path)
31
+ @overridden_paths.find { |override| path.match(Regexp.new(override['path'])) }
32
+ end
33
+
34
+ def override_path?(req)
35
+ req.post? && req.path == '/override/path'
36
+ end
37
+
38
+ def override_path(req)
39
+ payload = request_body_json(req)
40
+ if valid?(payload)
41
+ @overridden_paths.prepend(payload)
42
+ override_path_successful_response(payload)
43
+ else
44
+ override_path_failed_response_no_body
45
+ end
46
+ end
47
+
48
+ def valid?(payload)
49
+ payload&.key?('path') && at_least_one_override_key?(payload)
50
+ end
51
+
52
+ def at_least_one_override_key?(payload)
53
+ !(payload.keys & OVERRIDE_KEYS).empty?
54
+ end
55
+
56
+ def override_path_successful_response(payload)
57
+ [200, { 'Content-Type' => 'application/json' }, [payload.to_json]]
58
+ end
59
+
60
+ def override_path_failed_response_no_body
61
+ [400, { 'Content-Type' => 'application/json' }, [{ 'message' => 'No body provided' }.to_json]]
62
+ end
63
+
64
+ def path_overridden?(path)
65
+ override(path).nil? ? false : true
66
+ end
67
+
68
+ def handle_override(path, env)
69
+ o = override(path)
70
+ handle_override_delay(o['delay']) if o['delay']
71
+ status, headers, body = @app.call(env) unless o['body']
72
+ handle_override_response(o, status, headers, body)
73
+ end
74
+
75
+ def handle_override_delay(delay)
76
+ sleep delay
77
+ end
78
+
79
+ def handle_override_response(override, status, headers, body)
80
+ response_status = override['status'] || status || DEFAULT_STATUS
81
+ response_headers = override['headers'] || headers || DEFAULT_HEADERS
82
+ response_body = override['body'] || body || DEFAULT_BODY
83
+ response_body = Array(response_body)
84
+ [response_status, response_headers, response_body]
85
+ end
86
+
87
+ def request(env)
88
+ Rack::Request.new(env)
89
+ end
90
+
91
+ def request_body_json(req)
92
+ JSON.parse(request_body(req))
93
+ rescue StandardError => _e
94
+ nil
95
+ end
96
+
97
+ def request_body(req)
98
+ req.body.rewind
99
+ req.body.read
100
+ rescue StandardError => _e
101
+ ''
102
+ end
103
+ end
104
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-override-path
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Adam Bonsu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-04-02 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A Rack middleware gem that overrides responses for web applications
14
+ email: adam@bonsu.io
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/override_path.rb
20
+ - lib/rack/override-path.rb
21
+ - lib/rack/override_path.rb
22
+ homepage: https://github.com/adambonsu/rack-override-path
23
+ licenses:
24
+ - MIT
25
+ metadata: {}
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 2.7.0
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubygems_version: 3.1.4
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Rack middleware that overrides responses for web applications
45
+ test_files: []