tap-http 0.3.1 → 0.3.2
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.
- data/History +6 -0
- data/controllers/capture_controller.rb +12 -1
- data/lib/tap/http/utils.rb +98 -3
- metadata +3 -3
data/History
CHANGED
@@ -41,7 +41,7 @@ class CaptureController < Tap::Controller
|
|
41
41
|
# Echos back redirected HTTP requests formatted as YAML.
|
42
42
|
def echo
|
43
43
|
response['Content-Type'] = "text/plain"
|
44
|
-
YAML.dump(
|
44
|
+
YAML.dump(parse_request)
|
45
45
|
end
|
46
46
|
|
47
47
|
protected
|
@@ -49,6 +49,17 @@ class CaptureController < Tap::Controller
|
|
49
49
|
# helper to parse the request into a request hash for
|
50
50
|
# use by a Tap::Http::Submit task
|
51
51
|
def parse_request(keep_content=true) # :nodoc:
|
52
|
+
|
53
|
+
# perform the actions of Rack::Request::POST, but capturing
|
54
|
+
# overloaded parameter names
|
55
|
+
env = request.env
|
56
|
+
env["rack.request.form_input"] = env["rack.input"]
|
57
|
+
unless env["rack.request.form_hash"] = Tap::Http::Utils.parse_multipart(env)
|
58
|
+
env["rack.request.form_vars"] = env["rack.input"].read
|
59
|
+
env["rack.request.form_hash"] = Rack::Utils.parse_query(env["rack.request.form_vars"])
|
60
|
+
env["rack.input"].rewind if env["rack.input"].respond_to?(:rewind)
|
61
|
+
end
|
62
|
+
|
52
63
|
config = {}
|
53
64
|
parse_rack_request(request, keep_content).each_pair do |key, value|
|
54
65
|
config[key.to_s] = value
|
data/lib/tap/http/utils.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
autoload(:WEBrick, 'webrick')
|
2
2
|
autoload(:Zlib, 'zlib')
|
3
3
|
autoload(:StringIO, 'stringio')
|
4
|
+
require 'rack'
|
4
5
|
|
5
6
|
module Tap
|
6
7
|
module Http
|
@@ -137,10 +138,11 @@ module Tap
|
|
137
138
|
request.params.each_pair do |key, value|
|
138
139
|
params[key] = each_member(value) do |obj|
|
139
140
|
if obj.kind_of?(Hash)
|
140
|
-
file = {'Content-Type' =>
|
141
|
-
file['Content'] =
|
141
|
+
file = {'Content-Type' => obj[:type], 'Filename' => obj[:filename]}
|
142
|
+
file['Content'] = obj[:tempfile].read if keep_content
|
142
143
|
file
|
143
|
-
else
|
144
|
+
else
|
145
|
+
obj
|
144
146
|
end
|
145
147
|
end
|
146
148
|
end
|
@@ -207,6 +209,99 @@ module Tap
|
|
207
209
|
def inflate(str)
|
208
210
|
Zlib::GzipReader.new( StringIO.new( str ) ).read
|
209
211
|
end
|
212
|
+
|
213
|
+
EOL = Rack::Utils::Multipart::EOL
|
214
|
+
# Lifted from Rack::Utils::Multipart, and modified to collect
|
215
|
+
# overloaded params and params with names suffixed by '[]' as
|
216
|
+
# arrays.
|
217
|
+
def parse_multipart(env)
|
218
|
+
unless env['CONTENT_TYPE'] =~
|
219
|
+
%r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|n
|
220
|
+
nil
|
221
|
+
else
|
222
|
+
boundary = "--#{$1}"
|
223
|
+
|
224
|
+
params = {}
|
225
|
+
buf = ""
|
226
|
+
content_length = env['CONTENT_LENGTH'].to_i
|
227
|
+
input = env['rack.input']
|
228
|
+
|
229
|
+
boundary_size = boundary.size + EOL.size
|
230
|
+
bufsize = 16384
|
231
|
+
|
232
|
+
content_length -= boundary_size
|
233
|
+
|
234
|
+
status = input.read(boundary_size)
|
235
|
+
raise EOFError, "bad content body" unless status == boundary + EOL
|
236
|
+
|
237
|
+
rx = /(?:#{EOL})?#{Regexp.quote boundary}(#{EOL}|--)/
|
238
|
+
|
239
|
+
loop {
|
240
|
+
head = nil
|
241
|
+
body = ''
|
242
|
+
filename = content_type = name = nil
|
243
|
+
|
244
|
+
until head && buf =~ rx
|
245
|
+
if !head && i = buf.index("\r\n\r\n")
|
246
|
+
head = buf.slice!(0, i+2) # First \r\n
|
247
|
+
buf.slice!(0, 2) # Second \r\n
|
248
|
+
|
249
|
+
filename = head[/Content-Disposition:.* filename="?([^\";]*)"?/ni, 1]
|
250
|
+
content_type = head[/Content-Type: (.*)\r\n/ni, 1]
|
251
|
+
name = head[/Content-Disposition:.* name="?([^\";]*)"?/ni, 1]
|
252
|
+
|
253
|
+
if filename
|
254
|
+
body = Tempfile.new("RackMultipart")
|
255
|
+
body.binmode if body.respond_to?(:binmode)
|
256
|
+
end
|
257
|
+
|
258
|
+
next
|
259
|
+
end
|
260
|
+
|
261
|
+
# Save the read body part.
|
262
|
+
if head && (boundary_size+4 < buf.size)
|
263
|
+
body << buf.slice!(0, buf.size - (boundary_size+4))
|
264
|
+
end
|
265
|
+
|
266
|
+
c = input.read(bufsize < content_length ? bufsize : content_length)
|
267
|
+
raise EOFError, "bad content body" if c.nil? || c.empty?
|
268
|
+
buf << c
|
269
|
+
content_length -= c.size
|
270
|
+
end
|
271
|
+
|
272
|
+
# Save the rest.
|
273
|
+
if i = buf.index(rx)
|
274
|
+
body << buf.slice!(0, i)
|
275
|
+
buf.slice!(0, boundary_size+2)
|
276
|
+
|
277
|
+
content_length = -1 if $1 == "--"
|
278
|
+
end
|
279
|
+
|
280
|
+
if filename
|
281
|
+
body.rewind
|
282
|
+
data = {:filename => filename, :type => content_type,
|
283
|
+
:name => name, :tempfile => body, :head => head}
|
284
|
+
else
|
285
|
+
data = body
|
286
|
+
end
|
287
|
+
|
288
|
+
if name
|
289
|
+
case current = params[name]
|
290
|
+
when nil
|
291
|
+
params[name] = (name =~ /\[\]\z/ ? [data] : data)
|
292
|
+
when Array
|
293
|
+
params[name] << data
|
294
|
+
else
|
295
|
+
params[name] = [current, data]
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
break if buf.empty? || content_length == -1
|
300
|
+
}
|
301
|
+
|
302
|
+
params
|
303
|
+
end
|
304
|
+
end
|
210
305
|
end
|
211
306
|
end
|
212
307
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tap-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Chiang
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-02-
|
12
|
+
date: 2009-02-23 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.12.
|
23
|
+
version: 0.12.2
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rack
|