comparison mercurial/httppeer.py @ 30564:07bcd1bf6151

httppeer: assign Vary request header last In preparation for adding another value to it in a subsequent patch. While I was here, I added some empty lines because walls of text are hard to read.
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 28 Nov 2016 21:07:51 -0800
parents d1b97fc87f55
children 3f5f0c98cd18
comparison
equal deleted inserted replaced
30563:e118233172fe 30564:07bcd1bf6151
109 headers = args.pop('headers', {}) 109 headers = args.pop('headers', {})
110 110
111 self.ui.debug("sending %s command\n" % cmd) 111 self.ui.debug("sending %s command\n" % cmd)
112 q = [('cmd', cmd)] 112 q = [('cmd', cmd)]
113 headersize = 0 113 headersize = 0
114 varyheaders = []
114 # Important: don't use self.capable() here or else you end up 115 # Important: don't use self.capable() here or else you end up
115 # with infinite recursion when trying to look up capabilities 116 # with infinite recursion when trying to look up capabilities
116 # for the first time. 117 # for the first time.
117 postargsok = self.caps is not None and 'httppostargs' in self.caps 118 postargsok = self.caps is not None and 'httppostargs' in self.caps
118 # TODO: support for httppostargs when data is a file-like 119 # TODO: support for httppostargs when data is a file-like
135 # The headers can typically carry more data than the URL. 136 # The headers can typically carry more data than the URL.
136 encargs = urlreq.urlencode(sorted(args.items())) 137 encargs = urlreq.urlencode(sorted(args.items()))
137 headerfmt = 'X-HgArg-%s' 138 headerfmt = 'X-HgArg-%s'
138 contentlen = headersize - len(headerfmt % '000' + ': \r\n') 139 contentlen = headersize - len(headerfmt % '000' + ': \r\n')
139 headernum = 0 140 headernum = 0
140 varyheaders = []
141 for i in xrange(0, len(encargs), contentlen): 141 for i in xrange(0, len(encargs), contentlen):
142 headernum += 1 142 headernum += 1
143 header = headerfmt % str(headernum) 143 header = headerfmt % str(headernum)
144 headers[header] = encargs[i:i + contentlen] 144 headers[header] = encargs[i:i + contentlen]
145 varyheaders.append(header) 145 varyheaders.append(header)
146 headers['Vary'] = ','.join(varyheaders)
147 else: 146 else:
148 q += sorted(args.items()) 147 q += sorted(args.items())
149 qs = '?%s' % urlreq.urlencode(q) 148 qs = '?%s' % urlreq.urlencode(q)
150 cu = "%s%s" % (self._url, qs) 149 cu = "%s%s" % (self._url, qs)
151 size = 0 150 size = 0
156 if size and self.ui.configbool('ui', 'usehttp2', False): 155 if size and self.ui.configbool('ui', 'usehttp2', False):
157 headers['Expect'] = '100-Continue' 156 headers['Expect'] = '100-Continue'
158 headers['X-HgHttp2'] = '1' 157 headers['X-HgHttp2'] = '1'
159 if data is not None and 'Content-Type' not in headers: 158 if data is not None and 'Content-Type' not in headers:
160 headers['Content-Type'] = 'application/mercurial-0.1' 159 headers['Content-Type'] = 'application/mercurial-0.1'
160
161 headers['Vary'] = ','.join(varyheaders)
161 req = self.requestbuilder(cu, data, headers) 162 req = self.requestbuilder(cu, data, headers)
163
162 if data is not None: 164 if data is not None:
163 self.ui.debug("sending %s bytes\n" % size) 165 self.ui.debug("sending %s bytes\n" % size)
164 req.add_unredirected_header('Content-Length', '%d' % size) 166 req.add_unredirected_header('Content-Length', '%d' % size)
165 try: 167 try:
166 resp = self.urlopener.open(req) 168 resp = self.urlopener.open(req)