Class: Rack::Multipart::Parser
  
  
  
  
  
    - Inherits:
 
    - 
      Object
      
        
          - Object
 
          
            - Rack::Multipart::Parser
 
          
        
        show all
      
     
  
  
  
  
  
  
  
  
  
  
    - Defined in:
 
    - lib/rack/multipart/parser.rb
 
  
  
 
Defined Under Namespace
  
    
  
    
      Classes: BoundedIO, Collector, MultipartInfo
    
  
  
    
      Constant Summary
      collapse
    
    
      
        - BUFSIZE =
          
        
 
        1_048_576
 
      
        - TEXT_PLAIN =
          
        
 
        "text/plain"
 
      
        - TEMPFILE_FACTORY =
          
        
 
        lambda { |filename, content_type|
  Tempfile.new(["RackMultipart", ::File.extname(filename.gsub("\0", '%00'))])
} 
      
        - BOUNDARY_REGEX =
          
        
 
        /\A([^\n]*(?:\n|\Z))/
 
      
        - EMPTY =
          
        
 
        MultipartInfo.new(nil, [])
 
      
    
  
  Instance Attribute Summary collapse
  
  
    
      Class Method Summary
      collapse
    
    
  
    
      Instance Method Summary
      collapse
    
    
  
  Constructor Details
  
    
  
  
    #initialize(boundary, tempfile, bufsize, query_parser)  ⇒ Parser 
  
  
  
  
    
Returns a new instance of Parser.
   
 
  
  
    
      
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183 
     | 
    
      # File 'lib/rack/multipart/parser.rb', line 167
def initialize(boundary, tempfile, bufsize, query_parser)
  @query_parser   = query_parser
  @params         = query_parser.make_params
  @boundary       = "--#{boundary}"
  @bufsize        = bufsize
  @full_boundary = @boundary
  @end_boundary = @boundary + '--'
  @state = :FAST_FORWARD
  @mime_index = 0
  @collector = Collector.new tempfile
  @sbuf = StringScanner.new("".dup)
  @body_regex = /(?:#{EOL})?#{Regexp.quote(@boundary)}(?:#{EOL}|--)/m
  @rx_max_size = EOL.size + @boundary.bytesize + [EOL.size, '--'.size].max
  @head_regex = /(.*?#{EOL})#{EOL}/m
end
     | 
  
 
  
 
  
    Instance Attribute Details
    
      
      
      
  
  
    #state  ⇒ Object  
  
  
  
  
    
Returns the value of attribute state.
   
 
  
  
    
      
165
166
167 
     | 
    
      # File 'lib/rack/multipart/parser.rb', line 165
def state
  @state
end 
     | 
  
 
    
   
  
    Class Method Details
    
      
  
  
    .parse(io, content_length, content_type, tmpfile, bufsize, qp)  ⇒ Object 
  
  
  
  
    
      
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 
     | 
    
      # File 'lib/rack/multipart/parser.rb', line 63
def self.parse(io, content_length, content_type, tmpfile, bufsize, qp)
  return EMPTY if 0 == content_length
  boundary = parse_boundary content_type
  return EMPTY unless boundary
  io = BoundedIO.new(io, content_length) if content_length
  outbuf = String.new
  parser = new(boundary, tmpfile, bufsize, qp)
  parser.on_read io.read(bufsize, outbuf)
  loop do
    break if parser.state == :DONE
    parser.on_read io.read(bufsize, outbuf)
  end
  io.rewind
  parser.result
end
     | 
  
 
    
      
  
  
    .parse_boundary(content_type)  ⇒ Object 
  
  
  
  
    
      
56
57
58
59
60
61 
     | 
    
      # File 'lib/rack/multipart/parser.rb', line 56
def self.parse_boundary(content_type)
  return unless content_type
  data = content_type.match(MULTIPART)
  return unless data
  data[1]
end 
     | 
  
 
    
   
  
    Instance Method Details
    
      
  
  
    #on_read(content)  ⇒ Object 
  
  
  
  
    
      
185
186
187
188
189 
     | 
    
      # File 'lib/rack/multipart/parser.rb', line 185
def on_read(content)
  handle_empty_content!(content)
  @sbuf.concat content
  run_parser
end 
     | 
  
 
    
      
  
  
    #result  ⇒ Object 
  
  
  
  
    
      
191
192
193
194
195
196
197
198
199 
     | 
    
      # File 'lib/rack/multipart/parser.rb', line 191
def result
  @collector.each do |part|
    part.get_data do |data|
      tag_multipart_encoding(part.filename, part.content_type, part.name, data)
      @query_parser.normalize_params(@params, part.name, data, @query_parser.param_depth_limit)
    end
  end
  MultipartInfo.new @params.to_params_hash, @collector.find_all(&:file?).map(&:body)
end
     |