[PATCH] url.py: removed 'file' inheritance in the httpsendfile class
Renato Cunha
renatoc at gmail.com
Tue Aug 3 14:57:36 CDT 2010
With the lack of a good reason for not accepting this patch, I'm assuming it
was forgotten and, thus, am resending it to:
1- (Hopefully) get it in or
2- Discover what's wrong with it.
I've also added a comment mentioning that the global open function is shadowed
by the local one.
Regards.
# HG changeset patch
# User Renato Cunha <renatoc at gmail.com>
# Date 1280865244 10800
# Node ID 80cdc91cadc3924e2d1fb7f5d9a7d846d679c72d
# Parent 7b8aa1c823ee4bea1a2f475d0520a11f084b7012
url.py: removed 'file' inheritance in the httpsendfile class
Since py3k doesn't have a "file" builtin and, consequently, doesn't support
inheriting from it, this patch refactors the httpsendfile class to wrap the
objects returned by the builtin "open" function while adding the necessary
methods (__len__ for constructing the Content-Length header and read, write,
close and seek for the file-like interface).
diff --git a/mercurial/url.py b/mercurial/url.py
--- a/mercurial/url.py
+++ b/mercurial/url.py
@@ -8,6 +8,7 @@
# GNU General Public License version 2 or any later version.
import urllib, urllib2, urlparse, httplib, os, re, socket, cStringIO
+import __builtin__
from i18n import _
import keepalive, util
@@ -250,9 +251,25 @@
return urllib2.ProxyHandler.proxy_open(self, req, proxy, type_)
-class httpsendfile(file):
+class httpsendfile(object):
+ """This is a wrapper around the objects returned by python's "open".
+
+ Its purpose is to send file-like objects via HTTP and, to do so, it
+ defines a __len__ attribute to feed the Content-Length header.
+ """
+
+ def __init__(self, *args, **kwargs):
+ # We can't just "self._data = open(*args, **kwargs)" here because there
+ # is an "open" function in this module that shadows the global one
+ self._data = __builtin__.open(*args, **kwargs)
+ self.read = self._data.read
+ self.seek = self._data.seek
+ self.close = self._data.close
+ self.write = self._data.write
+
def __len__(self):
- return os.fstat(self.fileno()).st_size
+ return os.fstat(self._data.fileno()).st_size
def _gen_sendfile(connection):
def _sendfile(self, data):
More information about the Mercurial-devel
mailing list