diff -r 40193f977a8b -r 16499427f6de mercurial/hgweb/request.py --- a/mercurial/hgweb/request.py Sat Mar 10 16:27:01 2018 -0800 +++ b/mercurial/hgweb/request.py Sat Mar 10 16:17:51 2018 -0800 @@ -290,6 +290,37 @@ headers=headers, bodyfh=bodyfh) +class offsettrackingwriter(object): + """A file object like object that is append only and tracks write count. + + Instances are bound to a callable. This callable is called with data + whenever a ``write()`` is attempted. + + Instances track the amount of written data so they can answer ``tell()`` + requests. + + The intent of this class is to wrap the ``write()`` function returned by + a WSGI ``start_response()`` function. Since ``write()`` is a callable and + not a file object, it doesn't implement other file object methods. + """ + def __init__(self, writefn): + self._write = writefn + self._offset = 0 + + def write(self, s): + res = self._write(s) + # Some Python objects don't report the number of bytes written. + if res is None: + self._offset += len(s) + else: + self._offset += res + + def flush(self): + pass + + def tell(self): + return self._offset + class wsgiresponse(object): """Represents a response to a WSGI request.