comparison mercurial/url.py @ 51828:b08de326bee4

debugwireproto: redo logging to also work for https
author Joerg Sonnenberger <joerg@bec.de>
date Sun, 30 Jun 2024 02:46:53 +0200
parents ace0da86edd0
children 208698117124
comparison
equal deleted inserted replaced
51827:ace0da86edd0 51828:b08de326bee4
229 def _start_transaction(self, h, req): 229 def _start_transaction(self, h, req):
230 _generic_start_transaction(self, h, req) 230 _generic_start_transaction(self, h, req)
231 return keepalive.HTTPHandler._start_transaction(self, h, req) 231 return keepalive.HTTPHandler._start_transaction(self, h, req)
232 232
233 233
234 class logginghttpconnection(keepalive.HTTPConnection):
235 def __init__(self, createconn, *args, **kwargs):
236 keepalive.HTTPConnection.__init__(self, *args, **kwargs)
237 self._create_connection = createconn
238
239
240 class logginghttphandler(httphandler): 234 class logginghttphandler(httphandler):
241 """HTTP handler that logs socket I/O.""" 235 """HTTP(S) handler that logs socket I/O."""
242 236
243 def __init__(self, logfh, name, observeropts, timeout=None): 237 def __init__(self, logfh, name, observeropts, *args, **kwargs):
244 super(logginghttphandler, self).__init__(timeout=timeout) 238 super().__init__(*args, **kwargs)
245 239
246 self._logfh = logfh 240 self._logfh = logfh
247 self._logname = name 241 self._logname = name
248 self._observeropts = observeropts 242 self._observeropts = observeropts
249 243
250 # do_open() calls the passed class to instantiate an HTTPConnection. We 244 def do_open(self, http_class, *args, **kwargs):
251 # pass in a callable method that creates a custom HTTPConnection instance 245 _logfh = self._logfh
252 # whose callback to create the socket knows how to proxy the socket. 246 _logname = self._logname
253 def http_open(self, req): 247 _observeropts = self._observeropts
254 return self.do_open(self._makeconnection, req) 248
255 249 class logginghttpconnection(http_class):
256 def _makeconnection(self, *args, **kwargs): 250 def connect(self):
257 def createconnection(*args, **kwargs): 251 super().connect()
258 sock = socket.create_connection(*args, **kwargs) 252 self.sock = util.makeloggingsocket(
259 return util.makeloggingsocket( 253 _logfh, self.sock, _logname, **_observeropts
260 self._logfh, sock, self._logname, **self._observeropts 254 )
261 ) 255
262 256 return super().do_open(logginghttpconnection, *args, **kwargs)
263 return logginghttpconnection(createconnection, *args, **kwargs)
264 257
265 258
266 if has_https: 259 if has_https:
267 260
268 def _generic_proxytunnel(self: "httpsconnection"): 261 def _generic_proxytunnel(self: "httpsconnection"):
555 handlers.append( 548 handlers.append(
556 logginghttphandler( 549 logginghttphandler(
557 loggingfh, loggingname, loggingopts or {}, timeout=timeout 550 loggingfh, loggingname, loggingopts or {}, timeout=timeout
558 ) 551 )
559 ) 552 )
560 # We don't yet support HTTPS when logging I/O. If we attempt to open
561 # an HTTPS URL, we'll likely fail due to unknown protocol.
562
563 else: 553 else:
564 handlers.append(httphandler(timeout=timeout)) 554 handlers.append(httphandler(timeout=timeout))
565 if has_https: 555 if has_https:
566 # pytype get confused about the conditional existence for httpshandler here. 556 # pytype get confused about the conditional existence for httpshandler here.
567 handlers.append( 557 handlers.append(
568 httpshandler(ui, timeout=timeout) # pytype: disable=name-error 558 httpshandler(ui, timeout=timeout) # pytype: disable=name-error
569 ) 559 )
570 560
571 handlers.append(proxyhandler(ui)) 561 handlers.append(proxyhandler(ui))
572 562
573 passmgr = passwordmgr(ui, ui.httppasswordmgrdb) 563 passmgr = passwordmgr(ui, ui.httppasswordmgrdb)
574 if authinfo is not None: 564 if authinfo is not None: