code: def _readvalue(sock, buf, size):
      
      chunks = []
      rlen = size + 2
      while rlen - len(buf) > 0:
          if buf:
              rlen -= len(buf)
              chunks.append(buf)
          buf = _recv(sock, RECV_SIZE)
          if not buf:
              raise MemcacheUnexpectedCloseError()
  
      # Now we need to remove the \r\n from the end. There are two cases we care
      # about: the \r\n is all in the last buffer, or only the \n is in the last
      # buffer, and we need to remove the \r from the penultimate buffer.
  
      if rlen == 1:
          # replace the last chunk with the same string minus the last character,
          # which is always '\r' in this case.
          chunks[-1] = chunks[-1][:-1]
      else:
          # Just remove the "\r\n" from the latest chunk
          chunks.append(buf[:rlen - 2])
  
      return buf[rlen:], b''.join(chunks)
docs: Read specified amount of bytes from the socket.
  
      Read size bytes, followed by the "\r\n" characters, from the socket,
      and return those bytes and any trailing bytes read after the "\r\n".
  
      Args:
          sock: Socket object, should be connected.
          buf: String, zero or more characters, returned from an earlier
              call to _readline or _readvalue (pass an empty string on the
              first call).
          size: Integer, number of bytes to read from the socket.
  
      Returns:
        A tuple of (buf, value) where value is the bytes read from the
        socket (there will be exactly size bytes) and buf is trailing
        characters read after the "\r\n" following the bytes (but not
        including the \r\n).