comparison tests/badserverext.py @ 43076:2372284d9457

formatting: blacken the codebase This is using my patch to black (https://github.com/psf/black/pull/826) so we don't un-wrap collection literals. Done with: hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**"' | xargs black -S # skip-blame mass-reformatting only # no-check-commit reformats foo_bar functions Differential Revision: https://phab.mercurial-scm.org/D6971
author Augie Fackler <augie@google.com>
date Sun, 06 Oct 2019 09:45:02 -0400
parents 4d5aae86c9bd
children 89a2afe31e82
comparison
equal deleted inserted replaced
43075:57875cf423c9 43076:2372284d9457
31 31
32 from __future__ import absolute_import 32 from __future__ import absolute_import
33 33
34 import socket 34 import socket
35 35
36 from mercurial import( 36 from mercurial import (
37 pycompat, 37 pycompat,
38 registrar, 38 registrar,
39 ) 39 )
40 40
41 from mercurial.hgweb import ( 41 from mercurial.hgweb import server
42 server,
43 )
44 42
45 configtable = {} 43 configtable = {}
46 configitem = registrar.configitem(configtable) 44 configitem = registrar.configitem(configtable)
47 45
48 configitem(b'badserver', b'closeafteraccept', 46 configitem(
49 default=False, 47 b'badserver', b'closeafteraccept', default=False,
50 ) 48 )
51 configitem(b'badserver', b'closeafterrecvbytes', 49 configitem(
52 default=b'0', 50 b'badserver', b'closeafterrecvbytes', default=b'0',
53 ) 51 )
54 configitem(b'badserver', b'closeaftersendbytes', 52 configitem(
55 default=b'0', 53 b'badserver', b'closeaftersendbytes', default=b'0',
56 ) 54 )
57 configitem(b'badserver', b'closebeforeaccept', 55 configitem(
58 default=False, 56 b'badserver', b'closebeforeaccept', default=False,
59 ) 57 )
60 58
61 # We can't adjust __class__ on a socket instance. So we define a proxy type. 59 # We can't adjust __class__ on a socket instance. So we define a proxy type.
62 class socketproxy(object): 60 class socketproxy(object):
63 __slots__ = ( 61 __slots__ = (
65 '_logfp', 63 '_logfp',
66 '_closeafterrecvbytes', 64 '_closeafterrecvbytes',
67 '_closeaftersendbytes', 65 '_closeaftersendbytes',
68 ) 66 )
69 67
70 def __init__(self, obj, logfp, closeafterrecvbytes=0, 68 def __init__(
71 closeaftersendbytes=0): 69 self, obj, logfp, closeafterrecvbytes=0, closeaftersendbytes=0
70 ):
72 object.__setattr__(self, '_orig', obj) 71 object.__setattr__(self, '_orig', obj)
73 object.__setattr__(self, '_logfp', logfp) 72 object.__setattr__(self, '_logfp', logfp)
74 object.__setattr__(self, '_closeafterrecvbytes', closeafterrecvbytes) 73 object.__setattr__(self, '_closeafterrecvbytes', closeafterrecvbytes)
75 object.__setattr__(self, '_closeaftersendbytes', closeaftersendbytes) 74 object.__setattr__(self, '_closeaftersendbytes', closeaftersendbytes)
76 75
95 94
96 def makefile(self, mode, bufsize): 95 def makefile(self, mode, bufsize):
97 f = object.__getattribute__(self, '_orig').makefile(mode, bufsize) 96 f = object.__getattribute__(self, '_orig').makefile(mode, bufsize)
98 97
99 logfp = object.__getattribute__(self, '_logfp') 98 logfp = object.__getattribute__(self, '_logfp')
100 closeafterrecvbytes = object.__getattribute__(self, 99 closeafterrecvbytes = object.__getattribute__(
101 '_closeafterrecvbytes') 100 self, '_closeafterrecvbytes'
102 closeaftersendbytes = object.__getattribute__(self, 101 )
103 '_closeaftersendbytes') 102 closeaftersendbytes = object.__getattribute__(
104 103 self, '_closeaftersendbytes'
105 return fileobjectproxy(f, logfp, 104 )
106 closeafterrecvbytes=closeafterrecvbytes, 105
107 closeaftersendbytes=closeaftersendbytes) 106 return fileobjectproxy(
107 f,
108 logfp,
109 closeafterrecvbytes=closeafterrecvbytes,
110 closeaftersendbytes=closeaftersendbytes,
111 )
108 112
109 def sendall(self, data, flags=0): 113 def sendall(self, data, flags=0):
110 remaining = object.__getattribute__(self, '_closeaftersendbytes') 114 remaining = object.__getattribute__(self, '_closeaftersendbytes')
111 115
112 # No read limit. Call original function. 116 # No read limit. Call original function.
122 126
123 remaining -= len(newdata) 127 remaining -= len(newdata)
124 128
125 result = object.__getattribute__(self, '_orig').sendall(newdata, flags) 129 result = object.__getattribute__(self, '_orig').sendall(newdata, flags)
126 130
127 self._writelog(b'sendall(%d from %d) -> (%d) %s' % ( 131 self._writelog(
128 len(newdata), len(data), remaining, newdata)) 132 b'sendall(%d from %d) -> (%d) %s'
133 % (len(newdata), len(data), remaining, newdata)
134 )
129 135
130 object.__setattr__(self, '_closeaftersendbytes', remaining) 136 object.__setattr__(self, '_closeaftersendbytes', remaining)
131 137
132 if remaining <= 0: 138 if remaining <= 0:
133 self._writelog(b'write limit reached; closing socket') 139 self._writelog(b'write limit reached; closing socket')
145 '_logfp', 151 '_logfp',
146 '_closeafterrecvbytes', 152 '_closeafterrecvbytes',
147 '_closeaftersendbytes', 153 '_closeaftersendbytes',
148 ) 154 )
149 155
150 def __init__(self, obj, logfp, closeafterrecvbytes=0, 156 def __init__(
151 closeaftersendbytes=0): 157 self, obj, logfp, closeafterrecvbytes=0, closeaftersendbytes=0
158 ):
152 object.__setattr__(self, '_orig', obj) 159 object.__setattr__(self, '_orig', obj)
153 object.__setattr__(self, '_logfp', logfp) 160 object.__setattr__(self, '_logfp', logfp)
154 object.__setattr__(self, '_closeafterrecvbytes', closeafterrecvbytes) 161 object.__setattr__(self, '_closeafterrecvbytes', closeafterrecvbytes)
155 object.__setattr__(self, '_closeaftersendbytes', closeaftersendbytes) 162 object.__setattr__(self, '_closeaftersendbytes', closeaftersendbytes)
156 163
190 remaining = object.__getattribute__(self, '_closeafterrecvbytes') 197 remaining = object.__getattribute__(self, '_closeafterrecvbytes')
191 198
192 # No read limit. Call original function. 199 # No read limit. Call original function.
193 if not remaining: 200 if not remaining:
194 result = object.__getattribute__(self, '_orig').read(size) 201 result = object.__getattribute__(self, '_orig').read(size)
195 self._writelog(b'read(%d) -> (%d) (%s) %s' % (size, 202 self._writelog(
196 len(result), 203 b'read(%d) -> (%d) (%s) %s' % (size, len(result), result)
197 result)) 204 )
198 return result 205 return result
199 206
200 origsize = size 207 origsize = size
201 208
202 if size < 0: 209 if size < 0:
205 size = min(remaining, size) 212 size = min(remaining, size)
206 213
207 result = object.__getattribute__(self, '_orig').read(size) 214 result = object.__getattribute__(self, '_orig').read(size)
208 remaining -= len(result) 215 remaining -= len(result)
209 216
210 self._writelog(b'read(%d from %d) -> (%d) %s' % ( 217 self._writelog(
211 size, origsize, len(result), result)) 218 b'read(%d from %d) -> (%d) %s'
219 % (size, origsize, len(result), result)
220 )
212 221
213 object.__setattr__(self, '_closeafterrecvbytes', remaining) 222 object.__setattr__(self, '_closeafterrecvbytes', remaining)
214 223
215 if remaining <= 0: 224 if remaining <= 0:
216 self._writelog(b'read limit reached, closing socket') 225 self._writelog(b'read limit reached, closing socket')
225 remaining = object.__getattribute__(self, '_closeafterrecvbytes') 234 remaining = object.__getattribute__(self, '_closeafterrecvbytes')
226 235
227 # No read limit. Call original function. 236 # No read limit. Call original function.
228 if not remaining: 237 if not remaining:
229 result = object.__getattribute__(self, '_orig').readline(size) 238 result = object.__getattribute__(self, '_orig').readline(size)
230 self._writelog(b'readline(%d) -> (%d) %s' % ( 239 self._writelog(
231 size, len(result), result)) 240 b'readline(%d) -> (%d) %s' % (size, len(result), result)
241 )
232 return result 242 return result
233 243
234 origsize = size 244 origsize = size
235 245
236 if size < 0: 246 if size < 0:
239 size = min(remaining, size) 249 size = min(remaining, size)
240 250
241 result = object.__getattribute__(self, '_orig').readline(size) 251 result = object.__getattribute__(self, '_orig').readline(size)
242 remaining -= len(result) 252 remaining -= len(result)
243 253
244 self._writelog(b'readline(%d from %d) -> (%d) %s' % ( 254 self._writelog(
245 size, origsize, len(result), result)) 255 b'readline(%d from %d) -> (%d) %s'
256 % (size, origsize, len(result), result)
257 )
246 258
247 object.__setattr__(self, '_closeafterrecvbytes', remaining) 259 object.__setattr__(self, '_closeafterrecvbytes', remaining)
248 260
249 if remaining <= 0: 261 if remaining <= 0:
250 self._writelog(b'read limit reached; closing socket') 262 self._writelog(b'read limit reached; closing socket')
269 else: 281 else:
270 newdata = data 282 newdata = data
271 283
272 remaining -= len(newdata) 284 remaining -= len(newdata)
273 285
274 self._writelog(b'write(%d from %d) -> (%d) %s' % ( 286 self._writelog(
275 len(newdata), len(data), remaining, newdata)) 287 b'write(%d from %d) -> (%d) %s'
288 % (len(newdata), len(data), remaining, newdata)
289 )
276 290
277 result = object.__getattribute__(self, '_orig').write(newdata) 291 result = object.__getattribute__(self, '_orig').write(newdata)
278 292
279 object.__setattr__(self, '_closeaftersendbytes', remaining) 293 object.__setattr__(self, '_closeaftersendbytes', remaining)
280 294
283 self._close() 297 self._close()
284 298
285 raise Exception('connection closed after sending N bytes') 299 raise Exception('connection closed after sending N bytes')
286 300
287 return result 301 return result
302
288 303
289 def extsetup(ui): 304 def extsetup(ui):
290 # Change the base HTTP server class so various events can be performed. 305 # Change the base HTTP server class so various events can be performed.
291 # See SocketServer.BaseServer for how the specially named methods work. 306 # See SocketServer.BaseServer for how the specially named methods work.
292 class badserver(server.MercurialHTTPServer): 307 class badserver(server.MercurialHTTPServer):
308 if name.lower() == 'date': 323 if name.lower() == 'date':
309 value = 'Fri, 14 Apr 2017 00:00:00 GMT' 324 value = 'Fri, 14 Apr 2017 00:00:00 GMT'
310 elif name.lower() == 'server': 325 elif name.lower() == 'server':
311 value = 'badhttpserver' 326 value = 'badhttpserver'
312 327
313 return super(badrequesthandler, self).send_header(name, 328 return super(badrequesthandler, self).send_header(
314 value) 329 name, value
330 )
315 331
316 self.RequestHandlerClass = badrequesthandler 332 self.RequestHandlerClass = badrequesthandler
317 333
318 # Called to accept() a pending socket. 334 # Called to accept() a pending socket.
319 def get_request(self): 335 def get_request(self):
346 closeaftersendbytes = self.closeaftersendbytes.pop(0) 362 closeaftersendbytes = self.closeaftersendbytes.pop(0)
347 else: 363 else:
348 closeaftersendbytes = 0 364 closeaftersendbytes = 0
349 365
350 if closeafterrecvbytes or closeaftersendbytes: 366 if closeafterrecvbytes or closeaftersendbytes:
351 socket = socketproxy(socket, self.errorlog, 367 socket = socketproxy(
352 closeafterrecvbytes=closeafterrecvbytes, 368 socket,
353 closeaftersendbytes=closeaftersendbytes) 369 self.errorlog,
370 closeafterrecvbytes=closeafterrecvbytes,
371 closeaftersendbytes=closeaftersendbytes,
372 )
354 373
355 return super(badserver, self).process_request(socket, address) 374 return super(badserver, self).process_request(socket, address)
356 375
357 server.MercurialHTTPServer = badserver 376 server.MercurialHTTPServer = badserver