OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """This is a simple HTTP/FTP/TCP/UDP/BASIC_AUTH_PROXY/WEBSOCKET server used for | 6 """This is a simple HTTP/FTP/TCP/UDP/BASIC_AUTH_PROXY/WEBSOCKET server used for |
7 testing Chrome. | 7 testing Chrome. |
8 | 8 |
9 It supports several test URLs, as specified by the handlers in TestPageHandler. | 9 It supports several test URLs, as specified by the handlers in TestPageHandler. |
10 By default, it listens on an ephemeral port and sends the port number back to | 10 By default, it listens on an ephemeral port and sends the port number back to |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
329 self.AuthDigestHandler, | 329 self.AuthDigestHandler, |
330 self.SlowServerHandler, | 330 self.SlowServerHandler, |
331 self.ChunkedServerHandler, | 331 self.ChunkedServerHandler, |
332 self.NoContentHandler, | 332 self.NoContentHandler, |
333 self.ServerRedirectHandler, | 333 self.ServerRedirectHandler, |
334 self.CrossSiteRedirectHandler, | 334 self.CrossSiteRedirectHandler, |
335 self.ClientRedirectHandler, | 335 self.ClientRedirectHandler, |
336 self.GetSSLSessionCacheHandler, | 336 self.GetSSLSessionCacheHandler, |
337 self.SSLManySmallRecords, | 337 self.SSLManySmallRecords, |
338 self.GetChannelID, | 338 self.GetChannelID, |
339 self.GetClientCert, | |
339 self.ClientCipherListHandler, | 340 self.ClientCipherListHandler, |
340 self.CloseSocketHandler, | 341 self.CloseSocketHandler, |
341 self.RangeResetHandler, | 342 self.RangeResetHandler, |
342 self.DefaultResponseHandler] | 343 self.DefaultResponseHandler] |
343 post_handlers = [ | 344 post_handlers = [ |
344 self.EchoTitleHandler, | 345 self.EchoTitleHandler, |
345 self.EchoHandler, | 346 self.EchoHandler, |
346 self.PostOnlyFileHandler, | 347 self.PostOnlyFileHandler, |
347 self.EchoMultipartPostHandler] + get_handlers | 348 self.EchoMultipartPostHandler] + get_handlers |
348 put_handlers = [ | 349 put_handlers = [ |
(...skipping 1156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1505 if not self._ShouldHandleRequest('/channel-id'): | 1506 if not self._ShouldHandleRequest('/channel-id'): |
1506 return False | 1507 return False |
1507 | 1508 |
1508 self.send_response(200) | 1509 self.send_response(200) |
1509 self.send_header('Content-Type', 'text/plain') | 1510 self.send_header('Content-Type', 'text/plain') |
1510 self.end_headers() | 1511 self.end_headers() |
1511 channel_id = bytes(self.server.tlsConnection.channel_id) | 1512 channel_id = bytes(self.server.tlsConnection.channel_id) |
1512 self.wfile.write(hashlib.sha256(channel_id).digest().encode('base64')) | 1513 self.wfile.write(hashlib.sha256(channel_id).digest().encode('base64')) |
1513 return True | 1514 return True |
1514 | 1515 |
1516 def GetClientCert(self): | |
1517 """Send a reply whether a client certificate was provided.""" | |
1518 | |
1519 if not self._ShouldHandleRequest('/client-cert'): | |
1520 return False | |
1521 | |
1522 self.send_response(200) | |
1523 self.send_header('Content-Type', 'text/plain') | |
1524 self.end_headers() | |
1525 | |
1526 cert_present = self.server.tlsConnection.session.clientCertChain != None | |
1527 if cert_present: | |
1528 self.wfile.write('got a client cert') | |
1529 else: | |
1530 self.wfile.write('got no client cert') | |
Ryan Sleevi
2015/08/06 23:48:52
nit: Would it make more sense to write the SHA-256
pneubeck (no reviews)
2015/08/07 11:47:42
Done.
| |
1531 return True | |
1532 | |
1515 def ClientCipherListHandler(self): | 1533 def ClientCipherListHandler(self): |
1516 """Send a reply containing the cipher suite list that the client | 1534 """Send a reply containing the cipher suite list that the client |
1517 provided. Each cipher suite value is serialized in decimal, followed by a | 1535 provided. Each cipher suite value is serialized in decimal, followed by a |
1518 newline.""" | 1536 newline.""" |
1519 | 1537 |
1520 if not self._ShouldHandleRequest('/client-cipher-list'): | 1538 if not self._ShouldHandleRequest('/client-cipher-list'): |
1521 return False | 1539 return False |
1522 | 1540 |
1523 self.send_response(200) | 1541 self.send_response(200) |
1524 self.send_header('Content-Type', 'text/plain') | 1542 self.send_header('Content-Type', 'text/plain') |
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2281 'alert immediately after the handshake.') | 2299 'alert immediately after the handshake.') |
2282 self.option_parser.add_option('--no-anonymous-ftp-user', | 2300 self.option_parser.add_option('--no-anonymous-ftp-user', |
2283 dest='no_anonymous_ftp_user', | 2301 dest='no_anonymous_ftp_user', |
2284 default=False, action='store_true', | 2302 default=False, action='store_true', |
2285 help='If set, the FTP server will not create ' | 2303 help='If set, the FTP server will not create ' |
2286 'an anonymous user.') | 2304 'an anonymous user.') |
2287 | 2305 |
2288 | 2306 |
2289 if __name__ == '__main__': | 2307 if __name__ == '__main__': |
2290 sys.exit(ServerRunner().main()) | 2308 sys.exit(ServerRunner().main()) |
OLD | NEW |