15 """Manage TCP ports for unit tests; started by run_tests.py"""
17 from __future__
import print_function
29 from six.moves.BaseHTTPServer
import BaseHTTPRequestHandler
30 from six.moves.BaseHTTPServer
import HTTPServer
31 from six.moves.socketserver
import ThreadingMixIn
38 if len(sys.argv) == 2
and sys.argv[1] ==
'dump_version':
42 argp = argparse.ArgumentParser(description=
'Server for httpcli_test')
43 argp.add_argument(
'-p',
'--port', default=12345, type=int)
44 argp.add_argument(
'-l',
'--logfile', default=
None, type=str)
45 args = argp.parse_args()
47 if args.logfile
is not None:
51 sys.stderr =
open(args.logfile,
'w')
52 sys.stdout = sys.stderr
54 print(
'port server running on port %d' % args.port)
64 cronet_restricted_ports = [
65 1, 7, 9, 11, 13, 15, 17, 19, 20, 21, 22, 23, 25, 37, 42, 43, 53, 77, 79, 87,
66 95, 101, 102, 103, 104, 109, 110, 111, 113, 115, 117, 119, 123, 135, 139,
67 143, 179, 389, 465, 512, 513, 514, 515, 526, 530, 531, 532, 540, 556, 563,
68 587, 601, 636, 993, 995, 2049, 3659, 4045, 6000, 6665, 6666, 6667, 6668,
76 if platform.system() ==
'Windows':
80 s.connect((
'localhost', port))
82 except socket.error
as e:
89 s = socket.socket(proto, socket.SOCK_STREAM)
90 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
92 s.bind((
'localhost', port))
94 except socket.error
as e:
101 """Scan for ports not marked for being in use"""
103 port
for port
in range(1025, 32766)
104 if port
not in cronet_restricted_ports
111 age = time.time() - in_use[i]
112 if age < max_timeout:
114 req.log_message(
"kill old request %d" % i)
118 req.log_message(
"found available port %d" % i)
131 req.log_message(
"failed to find ports: retrying soon")
138 in_use[port] = time.time()
151 BaseHTTPRequestHandler.setup(self)
159 self.send_response(200)
160 self.send_header(
'Content-Type',
'text/plain')
163 self.log_message(
'allocated port %d' % p)
165 elif self.
path[0:6] ==
'/drop/':
166 self.send_response(200)
167 self.send_header(
'Content-Type',
'text/plain')
178 self.log_message(
'drop %s port %d' % (k, p))
179 elif self.
path ==
'/version_number':
181 self.send_response(200)
182 self.send_header(
'Content-Type',
'text/plain')
185 elif self.
path ==
'/dump':
189 self.send_response(200)
190 self.send_header(
'Content-Type',
'text/plain')
196 'in_use': dict((k, now - v)
for k, v
in list(in_use.items()))
199 self.wfile.
write(out.encode(
'ascii'))
200 elif self.
path ==
'/quitquitquit':
201 self.send_response(200)
203 self.server.shutdown()
207 """Handle requests in a separate thread"""
210 ThreadedHTTPServer((
'', args.port), Handler).serve_forever()