parameters: (fp, pdict)
return_statement: return partdict
docstring: Parse multipart input.
  
      Arguments:
      fp   : input file
      pdict: dictionary containing other parameters of content-type header
  
      Returns a dictionary just like parse_qs(): keys are the field names, each
      value is a list of values for that field.  This is easy to use but not
      much good if you are expecting megabytes to be uploaded -- in that case,
      use the FieldStorage class instead which is much more flexible.  Note
      that content-type is the raw, unparsed contents of the content-type
      header.
  
      XXX This does not parse nested multipart parts -- use FieldStorage for
      that.
  
      XXX This should really be subsumed by FieldStorage altogether -- no
      point in having two implementations of the same parsing algorithm.
      Also, FieldStorage protects itself better against certain DoS attacks
      by limiting the size of the data read in one chunk.  The API here
      does not support that kind of protection.  This also affects parse()
      since it can call parse_multipart().
docstring_summary: Parse multipart input.
docstring_tokens: Parse multipart input .
function: def parse_multipart(fp, pdict):
      """Parse multipart input.
  
      Arguments:
      fp   : input file
      pdict: dictionary containing other parameters of content-type header
  
      Returns a dictionary just like parse_qs(): keys are the field names, each
      value is a list of values for that field.  This is easy to use but not
      much good if you are expecting megabytes to be uploaded -- in that case,
      use the FieldStorage class instead which is much more flexible.  Note
      that content-type is the raw, unparsed contents of the content-type
      header.
  
      XXX This does not parse nested multipart parts -- use FieldStorage for
      that.
  
      XXX This should really be subsumed by FieldStorage altogether -- no
      point in having two implementations of the same parsing algorithm.
      Also, FieldStorage protects itself better against certain DoS attacks
      by limiting the size of the data read in one chunk.  The API here
      does not support that kind of protection.  This also affects parse()
      since it can call parse_multipart().
  
      """
      boundary = ""
      if 'boundary' in pdict:
          boundary = pdict['boundary']
      if not valid_boundary(boundary):
          raise ValueError,  ('Invalid boundary in multipart form: %r'
                              % (boundary,))
  
      nextpart = "--" + boundary
      lastpart = "--" + boundary + "--"
      partdict = {}
      terminator = ""
  
      while terminator != lastpart:
          bytes = -1
          data = None
          if terminator:
              # At start of next part.  Read headers first.
              headers = mimetools.Message(fp)
              clength = headers.getheader('content-length')
              if clength:
                  try:
                      bytes = int(clength)
                  except ValueError:
                      pass
              if bytes > 0:
                  if maxlen and bytes > maxlen:
                      raise ValueError, 'Maximum content length exceeded'
                  data = fp.read(bytes)
              else:
                  data = ""
          # Read lines until end of part.
          lines = []
          while 1:
              line = fp.readline()
              if not line:
                  terminator = lastpart # End outer loop
                  break
              if line[:2] == "--":
                  terminator = line.strip()
                  if terminator in (nextpart, lastpart):
                      break
              lines.append(line)
          # Done with part.
          if data is None:
              continue
          if bytes < 0:
              if lines:
                  # Strip final line terminator
                  line = lines[-1]
                  if line[-2:] == "\r\n":
                      line = line[:-2]
                  elif line[-1:] == "\n":
                      line = line[:-1]
                  lines[-1] = line
                  data = "".join(lines)
          line = headers['content-disposition']
          if not line:
              continue
          key, params = parse_header(line)
          if key != 'form-data':
              continue
          if 'name' in params:
              name = params['name']
          else:
              continue
          if name in partdict:
              partdict[name].append(data)
          else:
              partdict[name] = [data]
  
      return partdict
function_tokens: def parse_multipart ( fp , pdict ) : boundary = "" if 'boundary' in pdict : boundary = pdict [ 'boundary' ] if not valid_boundary ( boundary ) : raise ValueError , ( 'Invalid boundary in multipart form: %r' % ( boundary , ) ) nextpart = "--" + boundary lastpart = "--" + boundary + "--" partdict = { } terminator = "" while terminator != lastpart : bytes = - 1 data = None if terminator : # At start of next part.  Read headers first. headers = mimetools . Message ( fp ) clength = headers . getheader ( 'content-length' ) if clength : try : bytes = int ( clength ) except ValueError : pass if bytes > 0 : if maxlen and bytes > maxlen : raise ValueError , 'Maximum content length exceeded' data = fp . read ( bytes ) else : data = "" # Read lines until end of part. lines = [ ] while 1 : line = fp . readline ( ) if not line : terminator = lastpart # End outer loop break if line [ : 2 ] == "--" : terminator = line . strip ( ) if terminator in ( nextpart , lastpart ) : break lines . append ( line ) # Done with part. if data is None : continue if bytes < 0 : if lines : # Strip final line terminator line = lines [ - 1 ] if line [ - 2 : ] == "\r\n" : line = line [ : - 2 ] elif line [ - 1 : ] == "\n" : line = line [ : - 1 ] lines [ - 1 ] = line data = "" . join ( lines ) line = headers [ 'content-disposition' ] if not line : continue key , params = parse_header ( line ) if key != 'form-data' : continue if 'name' in params : name = params [ 'name' ] else : continue if name in partdict : partdict [ name ] . append ( data ) else : partdict [ name ] = [ data ] return partdict