Show More
@@ -22,8 +22,9 b' from mercurial.i18n import _' | |||
|
22 | 22 | class httpsendfile(object): |
|
23 | 23 | """This is a wrapper around the objects returned by python's "open". |
|
24 | 24 | |
|
25 |
Its purpose is to send file-like objects via HTTP |
|
|
26 |
define |
|
|
25 | Its purpose is to send file-like objects via HTTP. | |
|
26 | It do however not define a __len__ attribute because the length | |
|
27 | might be more than Py_ssize_t can handle. | |
|
27 | 28 | """ |
|
28 | 29 | |
|
29 | 30 | def __init__(self, ui, *args, **kwargs): |
@@ -35,9 +36,9 b' class httpsendfile(object):' | |||
|
35 | 36 | self.seek = self._data.seek |
|
36 | 37 | self.close = self._data.close |
|
37 | 38 | self.write = self._data.write |
|
38 |
self. |
|
|
39 | self.length = os.fstat(self._data.fileno()).st_size | |
|
39 | 40 | self._pos = 0 |
|
40 |
self._total = self. |
|
|
41 | self._total = self.length / 1024 * 2 | |
|
41 | 42 | |
|
42 | 43 | def read(self, *args, **kwargs): |
|
43 | 44 | try: |
@@ -54,9 +55,6 b' class httpsendfile(object):' | |||
|
54 | 55 | unit=_('kb'), total=self._total) |
|
55 | 56 | return ret |
|
56 | 57 | |
|
57 | def __len__(self): | |
|
58 | return self._len | |
|
59 | ||
|
60 | 58 | # moved here from url.py to avoid a cycle |
|
61 | 59 | def readauthforuri(ui, uri, user): |
|
62 | 60 | # Read configuration |
@@ -74,9 +74,14 b' class httprepository(wireproto.wirerepos' | |||
|
74 | 74 | if cmd == 'pushkey': |
|
75 | 75 | args['data'] = '' |
|
76 | 76 | data = args.pop('data', None) |
|
77 | size = 0 | |
|
78 | if util.safehasattr(data, 'length'): | |
|
79 | size = data.length | |
|
80 | elif data is not None: | |
|
81 | size = len(data) | |
|
77 | 82 | headers = args.pop('headers', {}) |
|
78 | 83 | |
|
79 |
if |
|
|
84 | if size and self.ui.configbool('ui', 'usehttp2', False): | |
|
80 | 85 | headers['Expect'] = '100-Continue' |
|
81 | 86 | headers['X-HgHttp2'] = '1' |
|
82 | 87 | |
@@ -105,9 +110,6 b' class httprepository(wireproto.wirerepos' | |||
|
105 | 110 | cu = "%s%s" % (self._url, qs) |
|
106 | 111 | req = urllib2.Request(cu, data, headers) |
|
107 | 112 | if data is not None: |
|
108 | # len(data) is broken if data doesn't fit into Py_ssize_t | |
|
109 | # add the header ourself to avoid OverflowError | |
|
110 | size = data.__len__() | |
|
111 | 113 | self.ui.debug("sending %s bytes\n" % size) |
|
112 | 114 | req.add_unredirected_header('Content-Length', '%d' % size) |
|
113 | 115 | try: |
@@ -24,6 +24,10 b' import imp, socket, urllib' | |||
|
24 | 24 | def sha1(s): |
|
25 | 25 | return _fastsha1(s) |
|
26 | 26 | |
|
27 | _notset = object() | |
|
28 | def safehasattr(thing, attr): | |
|
29 | return getattr(thing, attr, _notset) is not _notset | |
|
30 | ||
|
27 | 31 | def _fastsha1(s): |
|
28 | 32 | # This function will import sha1 from hashlib or sha (whichever is |
|
29 | 33 | # available) and overwrite itself with it on the first call. |
General Comments 0
You need to be logged in to leave comments.
Login now