stubby 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +13 -0
- data/lib/stubby/extensions/http.rb +34 -38
- data/lib/stubby/master.rb +28 -0
- metadata +1 -1
data/README.md
CHANGED
@@ -129,6 +129,19 @@ interfaces and will shut down the stubby server.
|
|
129
129
|
To contribute a stub, just add your stub to the list above and issue a pull
|
130
130
|
request.
|
131
131
|
|
132
|
+
## Environment Verification
|
133
|
+
|
134
|
+
It may be useful to deny requests that aren't routed by a system using stubby,
|
135
|
+
or for a site accessed with stubby to display some information about the
|
136
|
+
environment requested.
|
137
|
+
|
138
|
+
The HTTP and HTTPS extensions both append request headers to proxied
|
139
|
+
requests. A STUBBY_ENV header contains the name of the stubby environment.
|
140
|
+
|
141
|
+
Additionally, stubby requests send a STUBBY_KEY header which contains a hash
|
142
|
+
that should be unique over the stubby user and the instruction that the trigger
|
143
|
+
executed. If you configure your application to track STUBBY_KEY values, you can
|
144
|
+
whitelist requests to a stubby system.
|
132
145
|
|
133
146
|
## Stubbing
|
134
147
|
|
@@ -69,65 +69,61 @@ module Extensions
|
|
69
69
|
|
70
70
|
adapter "http-proxy" do
|
71
71
|
url.scheme = "http"
|
72
|
-
|
73
|
-
if url.path.empty?
|
74
|
-
# Proxy all requests, preserve incoming path
|
75
|
-
out = url.dup
|
76
|
-
out.path = request.path
|
77
|
-
request = HTTPI::Request.new
|
78
|
-
request.url = out.to_s
|
79
|
-
else
|
80
|
-
# Proxy to the given path
|
81
|
-
request = HTTPI::Request.new
|
82
|
-
request.url = url.to_s
|
83
|
-
end
|
84
|
-
|
85
|
-
response = HTTPI.get(request)
|
86
|
-
response.headers.delete "transfer-encoding"
|
87
|
-
response.headers.delete "connection"
|
88
|
-
|
89
|
-
status(response.code)
|
90
|
-
headers(response.headers)
|
91
|
-
body(response.body)
|
72
|
+
run_proxy
|
92
73
|
|
93
74
|
end
|
94
75
|
|
95
76
|
adapter "https-proxy" do
|
96
77
|
url.scheme = "https"
|
78
|
+
run_proxy
|
79
|
+
end
|
80
|
+
|
81
|
+
%w(get post put patch delete options link unlink).each do |method|
|
82
|
+
send(method, //) do
|
83
|
+
run_handler
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
def run_handler
|
89
|
+
if instruction.nil?
|
90
|
+
not_found
|
91
|
+
elsif adapter=self.class.adapters[url.scheme]
|
92
|
+
instance_eval &adapter
|
93
|
+
else
|
94
|
+
instance_eval &self.class.adapters["default"]
|
95
|
+
end
|
96
|
+
end
|
97
97
|
|
98
|
+
def run_proxy
|
98
99
|
if url.path.empty?
|
99
100
|
# Proxy all requests, preserve incoming path
|
100
101
|
out = url.dup
|
101
102
|
out.path = request.path
|
102
|
-
|
103
|
-
|
103
|
+
r = HTTPI::Request.new
|
104
|
+
r.url = out.to_s
|
104
105
|
else
|
105
106
|
# Proxy to the given path
|
106
|
-
|
107
|
-
|
107
|
+
r = HTTPI::Request.new
|
108
|
+
r.url = url.to_s
|
108
109
|
end
|
109
110
|
|
110
|
-
|
111
|
+
r.headers["STUBBY_ENV"] = settings.stubby_session.environment
|
112
|
+
r.headers["STUBBY_KEY"] = settings.stubby_session.key(instruction)
|
113
|
+
r.headers["STUBBY_USER"] = settings.stubby_session.user_key
|
114
|
+
|
115
|
+
request.body.rewind
|
116
|
+
r.body = request.body.read
|
117
|
+
|
118
|
+
response = HTTPI.request(request.request_method.downcase.to_sym, r)
|
111
119
|
response.headers.delete "transfer-encoding"
|
112
120
|
response.headers.delete "connection"
|
113
|
-
|
121
|
+
|
114
122
|
status(response.code)
|
115
123
|
headers(response.headers)
|
116
124
|
body(response.body)
|
117
|
-
|
118
125
|
end
|
119
126
|
|
120
|
-
get(//) do
|
121
|
-
if instruction.nil?
|
122
|
-
not_found
|
123
|
-
elsif adapter=self.class.adapters[url.scheme]
|
124
|
-
instance_eval &adapter
|
125
|
-
else
|
126
|
-
instance_eval &self.class.adapters["default"]
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
private
|
131
127
|
def forbidden
|
132
128
|
[403, "Forbidden"]
|
133
129
|
end
|
data/lib/stubby/master.rb
CHANGED
@@ -151,6 +151,18 @@ module Stubby
|
|
151
151
|
@config.environment = environment
|
152
152
|
end
|
153
153
|
|
154
|
+
def key(identifier)
|
155
|
+
Digest::MD5.hexdigest(user_key + identifier)
|
156
|
+
end
|
157
|
+
|
158
|
+
def user_key
|
159
|
+
@user_key ||= read_key
|
160
|
+
end
|
161
|
+
|
162
|
+
def environment
|
163
|
+
@config.environment
|
164
|
+
end
|
165
|
+
|
154
166
|
def run!(options={})
|
155
167
|
run_network do
|
156
168
|
run_master do
|
@@ -160,6 +172,22 @@ module Stubby
|
|
160
172
|
end
|
161
173
|
|
162
174
|
private
|
175
|
+
def read_key
|
176
|
+
File.read(keyfile)
|
177
|
+
rescue
|
178
|
+
generate_key
|
179
|
+
end
|
180
|
+
|
181
|
+
def generate_key
|
182
|
+
SecureRandom.hex(50).tap do |key|
|
183
|
+
File.write(keyfile, key)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def keyfile
|
188
|
+
File.expand_path("~/.stubby/key")
|
189
|
+
end
|
190
|
+
|
163
191
|
def run_network
|
164
192
|
assume_network_interface
|
165
193
|
yield
|