<div dir="ltr">In <a href="http://bugs.python.org/issue17552">http://bugs.python.org/issue17552</a> me and a bunch of other devs are currently discussing what kind of API socket.sendfile() should have and because it seems there are different opinions about it I though I should have brought this up here for further discussion.<div>

With issue 17552 I'm proposing to provide a wrapper on top of os.sendfile(), socket.send() and possibly TransmitFile on Windows. AFAIK the modules which could immediately benefit from this addition are ftplib (<a href="http://bugs.python.org/issue13564">http://bugs.python.org/issue13564</a>) and httplib (<a href="http://bugs.python.org/issue13559">http://bugs.python.org/issue13559</a>).</div>

<div><br></div><div>This is the current function signature as of socket-sendfile5.patch:</div><div><br></div><div><div>    def sendfile(self, file, blocksize=262144, offset=0, use_fallback=True):</div><div>        """sendfile(file[, blocksize[, offset[, use_fallback]]]) -> sent</div>

<div>    </div><div>        Send a file until EOF is reached attempting to use high-performance</div><div>        os.sendfile() in which case *file* must be a regular file object</div><div>        opened in binary mode; if not and *use_fallback* is True send()</div>

<div>        will be used instead.</div><div>        File position is updated on return or also in case of error in</div><div>        which case file.tell() can be used to figure out the number of</div><div>        bytes which were transmitted.</div>

<div>        *blocksize* is the maximum number of bytes to transmit at one time,</div><div>        *offset* tells from where to start reading the file.</div><div>        The socket must be of SOCK_STREAM type.</div><div>
        Non-blocking sockets are not supported.</div>
<div>        Return the total number of bytes which were transmitted.</div><div>        """</div></div><div><div><br></div><div>Debatable questions which were raised during the discussion on the bug tracker are:</div>

<div><br></div><div>1 - whether to provide a "use_fallback" argument which when False raises an exception in case os.sendfile() could not be used</div><div><br></div><div>2 - whether to provide a custom exception in order to signal the number of bytes transmitted as opposed to use file.tell() afterwards; for the record, I'm -1 on this.</div>

<div><br></div><div>3 - whether to commit the patch as-is without including Windows support via TransmitFile() and </div><div>post-pone that for a later time in a separate issue</div><div><br></div><div>4 - (extra) whether to provide a "callback" argument which gets called against each block of data before it is being sent.  This would be useful to apply data transformation or to implement a progress bar or something.  Note if this gets added it would sort of conflict with the "use_fallback=False" parameter because in order to apply data transformation socket.send() must be used instead of os.sendfile().</div>

<div><br></div><div>So far #1 appears to be the most debatable question.<br></div><div><br></div><div><br></div><div>-- <br></div><div dir="ltr"><div>Giampaolo - <a href="http://grodola.blogspot.com" target="_blank">http://grodola.blogspot.com</a></div>

<div><br></div></div>
</div></div>