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 headers = args.pop('headers', {}) |
77 headers = args.pop('headers', {}) |
78 self.ui.debug("sending %s command\n" % cmd) |
78 self.ui.debug("sending %s command\n" % cmd) |
79 q = [('cmd', cmd)] + sorted(args.items()) |
79 q = [('cmd', cmd)] |
|
80 headersize = 0 |
|
81 if len(args) > 0: |
|
82 httpheader = self.capable('httpheader') |
|
83 if httpheader: |
|
84 headersize = int(httpheader.split(',')[0]) |
|
85 if headersize > 0: |
|
86 # The headers can typically carry more data than the URL. |
|
87 encargs = urllib.urlencode(sorted(args.items())) |
|
88 headerfmt = 'X-Arg-%s' |
|
89 contentlen = headersize - len(headerfmt % '000' + ': \r\n') |
|
90 headernum = 0 |
|
91 for i in xrange(0, len(encargs), contentlen): |
|
92 headernum += 1 |
|
93 header = headerfmt % str(headernum) |
|
94 headers[header] = encargs[i:i + contentlen] |
|
95 varyheaders = [headerfmt % str(h) for h in range(1, headernum + 1)] |
|
96 headers['Vary'] = ','.join(varyheaders) |
|
97 else: |
|
98 q += sorted(args.items()) |
80 qs = '?%s' % urllib.urlencode(q) |
99 qs = '?%s' % urllib.urlencode(q) |
81 cu = "%s%s" % (self._url, qs) |
100 cu = "%s%s" % (self._url, qs) |
82 req = urllib2.Request(cu, data, headers) |
101 req = urllib2.Request(cu, data, headers) |
83 if data is not None: |
102 if data is not None: |
84 # len(data) is broken if data doesn't fit into Py_ssize_t |
103 # len(data) is broken if data doesn't fit into Py_ssize_t |