'Zero-copy read directly into buffer.'

def readinto(self, buf):

    cnt = len(buf)
    if (cnt > self._remain):
        cnt = self._remain
    vbuf = memoryview(buf)
    res = got = 0
    while (got < cnt):
        res = self._fd.readinto(vbuf[got:cnt])
        if (not res):
            break
        self._md_context.update(vbuf[got:(got + res)])
        self._remain -= res
        got += res
    return got
