svn_swig_py_make_stream() is a function that wraps a PyObject in an svn_stream_t. Its read implementation, read_handler_pyio(), just calls the PyObject's .read() method.
According to <https://docs.python.org/2/library/io.html#io.RawIOBase.read>, the read() method of "raw" file-like objects makes only one read(2) syscall, and so may return fewer bytes than were requested. (The py3 docs are similar.) However, svn_stream_t "full read" functions are obligated to return the number of bytes requested, unless EOF. Therefore, do we need the following patch? [[[ swig-py: Support raw binary file-like objects for readable svn_stream_t* parameters. [D:bindings] * subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (svn_swig_py_make_stream): Declare read_handler_pyio() as a non-full svn_read_fn_t, in case PY_IO is a raw binary file object. ]]] [[[ Index: subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c =================================================================== --- subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (revision 1819751) +++ subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (working copy) @@ -2578,8 +2578,7 @@ svn_swig_py_make_stream(PyObject *py_io, apr_pool_ svn_stream_t *stream; stream = svn_stream_create(py_io, pool); - svn_stream_set_read2(stream, NULL /* only full read support */, - read_handler_pyio); + svn_stream_set_read2(stream, read_handler_pyio, NULL); svn_stream_set_write(stream, write_handler_pyio); svn_stream_set_close(stream, close_handler_pyio); apr_pool_cleanup_register(pool, py_io, svn_swig_py_stream_destroy, ]]] Cheers, Daniel