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 +7 -0
- data/lib/override_path.rb +3 -0
- data/lib/rack/override-path.rb +3 -0
- data/lib/rack/override_path.rb +104 -0
- metadata +45 -0
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,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: []
|