f.read() doesn't yield

on big files this causes uploads to block on large files, instead
pass the file handle directly to requests as the body