code: def _next_header_line(self):
          
          eol = self.EOL_TOKEN
          eol_length = len(eol)
          start = 0
          end = self._buffer.find(eol)
  
          # if start == end, found empty header - stop iterating
          while start != end:
  
              # end of line was found
              if end != -1:
                  yield self._buffer[start:end]
                  start = end + eol_length
              # end of line was not found - request more buffer data
              else:
                  yield None
  
              # find next end of line
              end = self._buffer.find(eol, start)
  
          # trim buffer
          del self._buffer[:end + eol_length]
docs: Non-destructive buffer processor returning all lines (defined
          by self.EOL_TOKEN) in self._buffer. If end of buffer is reached,
          None is yielded and it is expected that more bytes will be
          appended to the buffer by the caller.
  
          Upon finding an empty header, this method trims the buffer to
          the start of the body