code: def read_input(buf, has_header = True):
      
  
      # Use stdin if there is no supplied buffer
      if buf is None:
          buf = sys.stdin
  
      # Attempt to read a header if necessary
      header = {}
      if has_header:
          # Until we get a blank line, read "attr:val" lines, 
          # setting the values in 'header'
          last_attr = None
          while True:
              line = buf.readline()
  
              # remove lastcharacter (which is a newline)
              line = line[:-1] 
  
              # When we encounter a newline, we are done with the header
              if len(line) == 0:
                  break
  
              colon = line.find(':')
  
              # If we can't find a colon, then it might be that we are
              # on a new line, and it belongs to the previous attribute
              if colon < 0:
                  if last_attr:
                      header[last_attr] = header[last_attr] + '\n' + urllib.parse.unquote(line)
                  else:
                      continue
  
              # extract it and set value in settings
              last_attr = attr = line[:colon]
              val  = urllib.parse.unquote(line[colon+1:])
              header[attr] = val
  
      return buf, header
docs: Read the input from the given buffer (or stdin if no buffer)
      is supplied. An optional header may be present as well