equal
deleted
inserted
replaced
72 |
72 |
73 def _callstream(self, cmd, **args): |
73 def _callstream(self, cmd, **args): |
74 if cmd == 'pushkey': |
74 if cmd == 'pushkey': |
75 args['data'] = '' |
75 args['data'] = '' |
76 data = args.pop('data', None) |
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 headers = args.pop('headers', {}) |
82 headers = args.pop('headers', {}) |
78 |
83 |
79 if data and self.ui.configbool('ui', 'usehttp2', False): |
84 if size and self.ui.configbool('ui', 'usehttp2', False): |
80 headers['Expect'] = '100-Continue' |
85 headers['Expect'] = '100-Continue' |
81 headers['X-HgHttp2'] = '1' |
86 headers['X-HgHttp2'] = '1' |
82 |
87 |
83 self.ui.debug("sending %s command\n" % cmd) |
88 self.ui.debug("sending %s command\n" % cmd) |
84 q = [('cmd', cmd)] |
89 q = [('cmd', cmd)] |
103 q += sorted(args.items()) |
108 q += sorted(args.items()) |
104 qs = '?%s' % urllib.urlencode(q) |
109 qs = '?%s' % urllib.urlencode(q) |
105 cu = "%s%s" % (self._url, qs) |
110 cu = "%s%s" % (self._url, qs) |
106 req = urllib2.Request(cu, data, headers) |
111 req = urllib2.Request(cu, data, headers) |
107 if data is not None: |
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 self.ui.debug("sending %s bytes\n" % size) |
113 self.ui.debug("sending %s bytes\n" % size) |
112 req.add_unredirected_header('Content-Length', '%d' % size) |
114 req.add_unredirected_header('Content-Length', '%d' % size) |
113 try: |
115 try: |
114 resp = self.urlopener.open(req) |
116 resp = self.urlopener.open(req) |
115 except urllib2.HTTPError, inst: |
117 except urllib2.HTTPError, inst: |