comparison mercurial/httppeer.py @ 35698:0c4b23ccf1a5

httppeer: add support for tracing all http request made by the peer This changeset introduces a new 'devel.debug.peer-request' config. When set to True, debug message about request made by peer will be issued. This help to understand what actually happens during an exchange and tracks source of performance loss. This changeset implement support for http peer only.
author Boris Feld <boris.feld@octobus.net>
date Fri, 12 Jan 2018 10:41:03 +0000
parents 5a7906ed78d4
children 197d10e157ce
comparison
equal deleted inserted replaced
35697:5a7906ed78d4 35698:0c4b23ccf1a5
160 for h in urlopener.handlers: 160 for h in urlopener.handlers:
161 h.close() 161 h.close()
162 getattr(h, "close_all", lambda: None)() 162 getattr(h, "close_all", lambda: None)()
163 163
164 def _openurl(self, req): 164 def _openurl(self, req):
165 return self._urlopener.open(req) 165 if (self._ui.debugflag
166 and self._ui.configbool('devel', 'debug.peer-request')):
167 dbg = self._ui.debug
168 line = 'devel-peer-request: %s\n'
169 dbg(line % '%s %s' % (req.get_method(), req.get_full_url()))
170 hgargssize = None
171
172 for header, value in sorted(req.header_items()):
173 if header.startswith('X-hgarg-'):
174 if hgargssize is None:
175 hgargssize = 0
176 hgargssize += len(value)
177 else:
178 dbg(line % ' %s %s' % (header, value))
179
180 if hgargssize is not None:
181 dbg(line % ' %d bytes of commands arguments in headers'
182 % hgargssize)
183
184 if req.has_data():
185 data = req.get_data()
186 length = getattr(data, 'length', None)
187 if length is None:
188 length = len(data)
189 dbg(line % ' %d bytes of data' % length)
190
191 start = util.timer()
192
193 ret = self._urlopener.open(req)
194 if self._ui.configbool('devel', 'debug.peer-request'):
195 dbg(line % ' finished in %.4f seconds (%s)'
196 % (util.timer() - start, ret.code))
197 return ret
166 198
167 # Begin of _basepeer interface. 199 # Begin of _basepeer interface.
168 200
169 @util.propertycache 201 @util.propertycache
170 def ui(self): 202 def ui(self):