code: def _read(self, n, initial=False, _errnos=(errno.EAGAIN, errno.EINTR)):
          
          recv = self._quick_recv
          rbuf = self._read_buffer
          try:
              while len(rbuf) < n:
                  try:
                      s = recv(n - len(rbuf))
                  except socket.error as exc:
                      if not initial and exc.errno in _errnos:
                          continue
                      raise
                  if not s:
                      raise IOError('Socket closed')
                  rbuf += s
          except:
              self._read_buffer = rbuf
              raise
  
          result, self._read_buffer = rbuf[:n], rbuf[n:]
          return result
docs: Read exactly n bytes from the socket