Mercurial > hg
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 |