Mercurial > public > mercurial-scm > hg
comparison mercurial/httppeer.py @ 37548:8e7a4435ab6d
httppeer: extract code for performing an HTTP request
This is generic and doesn't need to live as a method of httppeer.
Differential Revision: https://phab.mercurial-scm.org/D3233
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 10 Apr 2018 10:27:49 -0700 |
parents | 835ccc2a5ef1 |
children | 66d1001e1500 |
comparison
equal
deleted
inserted
replaced
37547:835ccc2a5ef1 | 37548:8e7a4435ab6d |
---|---|
136 'could be fixed if you need it') | 136 'could be fixed if you need it') |
137 for f in self._fileobjs: | 137 for f in self._fileobjs: |
138 f.seek(0) | 138 f.seek(0) |
139 self._index = 0 | 139 self._index = 0 |
140 | 140 |
141 def sendrequest(ui, opener, req): | |
142 """Send a prepared HTTP request. | |
143 | |
144 Returns the response object. | |
145 """ | |
146 if (ui.debugflag | |
147 and ui.configbool('devel', 'debug.peer-request')): | |
148 dbg = ui.debug | |
149 line = 'devel-peer-request: %s\n' | |
150 dbg(line % '%s %s' % (req.get_method(), req.get_full_url())) | |
151 hgargssize = None | |
152 | |
153 for header, value in sorted(req.header_items()): | |
154 if header.startswith('X-hgarg-'): | |
155 if hgargssize is None: | |
156 hgargssize = 0 | |
157 hgargssize += len(value) | |
158 else: | |
159 dbg(line % ' %s %s' % (header, value)) | |
160 | |
161 if hgargssize is not None: | |
162 dbg(line % ' %d bytes of commands arguments in headers' | |
163 % hgargssize) | |
164 | |
165 if req.has_data(): | |
166 data = req.get_data() | |
167 length = getattr(data, 'length', None) | |
168 if length is None: | |
169 length = len(data) | |
170 dbg(line % ' %d bytes of data' % length) | |
171 | |
172 start = util.timer() | |
173 | |
174 res = opener.open(req) | |
175 if ui.configbool('devel', 'debug.peer-request'): | |
176 dbg(line % ' finished in %.4f seconds (%s)' | |
177 % (util.timer() - start, res.code)) | |
178 | |
179 return res | |
180 | |
141 class httppeer(wireproto.wirepeer): | 181 class httppeer(wireproto.wirepeer): |
142 def __init__(self, ui, path, url, opener, requestbuilder): | 182 def __init__(self, ui, path, url, opener, requestbuilder): |
143 self.ui = ui | 183 self.ui = ui |
144 self._path = path | 184 self._path = path |
145 self._url = url | 185 self._url = url |
149 | 189 |
150 def __del__(self): | 190 def __del__(self): |
151 for h in self._urlopener.handlers: | 191 for h in self._urlopener.handlers: |
152 h.close() | 192 h.close() |
153 getattr(h, "close_all", lambda: None)() | 193 getattr(h, "close_all", lambda: None)() |
154 | |
155 def _openurl(self, req): | |
156 if (self.ui.debugflag | |
157 and self.ui.configbool('devel', 'debug.peer-request')): | |
158 dbg = self.ui.debug | |
159 line = 'devel-peer-request: %s\n' | |
160 dbg(line % '%s %s' % (req.get_method(), req.get_full_url())) | |
161 hgargssize = None | |
162 | |
163 for header, value in sorted(req.header_items()): | |
164 if header.startswith('X-hgarg-'): | |
165 if hgargssize is None: | |
166 hgargssize = 0 | |
167 hgargssize += len(value) | |
168 else: | |
169 dbg(line % ' %s %s' % (header, value)) | |
170 | |
171 if hgargssize is not None: | |
172 dbg(line % ' %d bytes of commands arguments in headers' | |
173 % hgargssize) | |
174 | |
175 if req.has_data(): | |
176 data = req.get_data() | |
177 length = getattr(data, 'length', None) | |
178 if length is None: | |
179 length = len(data) | |
180 dbg(line % ' %d bytes of data' % length) | |
181 | |
182 start = util.timer() | |
183 | |
184 ret = self._urlopener.open(req) | |
185 if self.ui.configbool('devel', 'debug.peer-request'): | |
186 dbg(line % ' finished in %.4f seconds (%s)' | |
187 % (util.timer() - start, ret.code)) | |
188 return ret | |
189 | 194 |
190 # Begin of ipeerconnection interface. | 195 # Begin of ipeerconnection interface. |
191 | 196 |
192 def url(self): | 197 def url(self): |
193 return self._path | 198 return self._path |
320 | 325 |
321 if data is not None: | 326 if data is not None: |
322 self.ui.debug("sending %d bytes\n" % size) | 327 self.ui.debug("sending %d bytes\n" % size) |
323 req.add_unredirected_header(r'Content-Length', r'%d' % size) | 328 req.add_unredirected_header(r'Content-Length', r'%d' % size) |
324 try: | 329 try: |
325 resp = self._openurl(req) | 330 resp = sendrequest(self.ui, self._urlopener, req) |
326 except urlerr.httperror as inst: | 331 except urlerr.httperror as inst: |
327 if inst.code == 401: | 332 if inst.code == 401: |
328 raise error.Abort(_('authorization failed')) | 333 raise error.Abort(_('authorization failed')) |
329 raise | 334 raise |
330 except httplib.HTTPException as inst: | 335 except httplib.HTTPException as inst: |