Parent

Class/Module Index [+]

Quicksearch

Rack::Multipart::Parser

Public Class Methods

create(env) click to toggle source
# File lib/rack/multipart/parser.rb, line 12
def self.create(env)
  return DUMMY unless env['CONTENT_TYPE'] =~ MULTIPART

  io = env['rack.input']
  io.rewind

  content_length = env['CONTENT_LENGTH']
  content_length = content_length.to_i if content_length

  tempfile = env['rack.multipart.tempfile_factory'] ||
    lambda { |filename, content_type| Tempfile.new(["RackMultipart", ::File.extname(filename)]) }
  bufsize = env['rack.multipart.buffer_size'] || BUFSIZE

  new($1, io, content_length, env, tempfile, bufsize)
end
new(boundary, io, content_length, env, tempfile, bufsize) click to toggle source
# File lib/rack/multipart/parser.rb, line 28
def initialize(boundary, io, content_length, env, tempfile, bufsize)
  @buf            = ""

  if @buf.respond_to? :force_encoding
    @buf.force_encoding Encoding::ASCII_8BIT
  end

  @params         = Utils::KeySpaceConstrainedParams.new
  @boundary       = "--#{boundary}"
  @io             = io
  @content_length = content_length
  @boundary_size  = Utils.bytesize(@boundary) + EOL.size
  @env = env
  @tempfile       = tempfile
  @bufsize        = bufsize

  if @content_length
    @content_length -= @boundary_size
  end

  @rx = /(?:#{EOL})?#{Regexp.quote(@boundary)}(#{EOL}|--)/
  @full_boundary = @boundary + EOL
end

Public Instance Methods

parse() click to toggle source
# File lib/rack/multipart/parser.rb, line 52
def parse
  fast_forward_to_first_boundary

  opened_files = 0
  loop do

    head, filename, content_type, name, body =
      get_current_head_and_filename_and_content_type_and_name_and_body

    if Utils.multipart_part_limit > 0
      opened_files += 1 if filename
      raise MultipartPartLimitError, 'Maximum file multiparts in content reached' if opened_files >= Utils.multipart_part_limit
    end

    # Save the rest.
    if i = @buf.index(rx)
      body << @buf.slice!(0, i)
      @buf.slice!(0, @boundary_size+2)

      @content_length = -1  if $1 == "--"
    end

    get_data(filename, body, content_type, name, head) do |data|
      tag_multipart_encoding(filename, content_type, name, data)

      Utils.normalize_params(@params, name, data)
    end

    # break if we're at the end of a buffer, but not if it is the end of a field
    break if (@buf.empty? && $1 != EOL) || @content_length == -1
  end

  @io.rewind

  @params.to_params_hash
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.