-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathmultipart.rb
77 lines (59 loc) · 1.86 KB
/
multipart.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# frozen_string_literal: true
require_relative 'constants'
require_relative 'utils'
require_relative 'multipart/parser'
require_relative 'multipart/generator'
require_relative 'bad_request'
module Rack
# A multipart form data parser, adapted from IOWA.
#
# Usually, Rack::Request#POST takes care of calling this.
module Multipart
MULTIPART_BOUNDARY = "AaB03x"
class MissingInputError < StandardError
include BadRequest
end
# Accumulator for multipart form data, conforming to the QueryParser API.
# In future, the Parser could return the pair list directly, but that would
# change its API.
class ParamList # :nodoc:
def self.make_params
new
end
def self.normalize_params(params, key, value)
params << [key, value]
end
def initialize
@pairs = []
end
def <<(pair)
@pairs << pair
end
def to_params_hash
@pairs
end
end
class << self
def parse_multipart(env, params = Rack::Utils.default_query_parser)
unless io = env[RACK_INPUT]
raise MissingInputError, "Missing input stream!"
end
if content_length = env['CONTENT_LENGTH']
content_length = content_length.to_i
end
content_type = env['CONTENT_TYPE']
tempfile = env[RACK_MULTIPART_TEMPFILE_FACTORY] || Parser::TEMPFILE_FACTORY
bufsize = env[RACK_MULTIPART_BUFFER_SIZE] || Parser::BUFSIZE
info = Parser.parse(io, content_length, content_type, tempfile, bufsize, params)
env[RACK_TEMPFILES] = info.tmp_files
return info.params
end
def extract_multipart(request, params = Rack::Utils.default_query_parser)
parse_multipart(request.env)
end
def build_multipart(params, first = true)
Generator.new(params, first).dump
end
end
end
end