author | Gregory Szorc <gregory.szorc@gmail.com> |
Fri, 12 Oct 2018 17:25:02 +0200 | |
changeset 40191 | 4b7eb862692e |
parent 32916 | 88c1d13b637b |
child 41709 | 97e2442a4595 |
permissions | -rwxr-xr-x |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
2 |
|
28646
f452c1cf7a8f
tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27637
diff
changeset
|
3 |
from __future__ import absolute_import, print_function |
27302
faca4adfed0a
tests: use absolute_import in tinyproxy
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
4 |
|
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
5 |
__doc__ = """Tiny HTTP Proxy. |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
6 |
|
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
7 |
This module implements GET, HEAD, POST, PUT and DELETE methods |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
8 |
on BaseHTTPServer, and behaves as an HTTP proxy. The CONNECT |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
9 |
method is also implemented experimentally, but has not been |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
10 |
tested yet. |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
11 |
|
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
12 |
Any help will be greatly appreciated. SUZUKI Hisao |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
13 |
""" |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
14 |
|
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
15 |
__version__ = "0.2.1" |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
16 |
|
29565
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
17 |
import optparse |
27302
faca4adfed0a
tests: use absolute_import in tinyproxy
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
18 |
import os |
faca4adfed0a
tests: use absolute_import in tinyproxy
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
19 |
import select |
faca4adfed0a
tests: use absolute_import in tinyproxy
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
20 |
import socket |
28778
256d90bb12fa
tests: make tinyproxy.py not import sys.argv by name
Yuya Nishihara <yuya@tcha.org>
parents:
28773
diff
changeset
|
21 |
import sys |
29431
80880ad3fccd
py3: conditionalize the urlparse import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28778
diff
changeset
|
22 |
|
80880ad3fccd
py3: conditionalize the urlparse import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28778
diff
changeset
|
23 |
from mercurial import util |
80880ad3fccd
py3: conditionalize the urlparse import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28778
diff
changeset
|
24 |
|
29566
075146e85bb6
py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29565
diff
changeset
|
25 |
httpserver = util.httpserver |
29433
33770d2b6cf9
py3: conditionalize SocketServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29431
diff
changeset
|
26 |
socketserver = util.socketserver |
31571
b2a41a826d71
tests: use urlreq in tinyproxy.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31005
diff
changeset
|
27 |
urlreq = util.urlreq |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
28 |
|
31005
d8d698bcdcd6
tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents:
29566
diff
changeset
|
29 |
if os.environ.get('HGIPV6', '0') == '1': |
d8d698bcdcd6
tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents:
29566
diff
changeset
|
30 |
family = socket.AF_INET6 |
d8d698bcdcd6
tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents:
29566
diff
changeset
|
31 |
else: |
d8d698bcdcd6
tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents:
29566
diff
changeset
|
32 |
family = socket.AF_INET |
d8d698bcdcd6
tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents:
29566
diff
changeset
|
33 |
|
29566
075146e85bb6
py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29565
diff
changeset
|
34 |
class ProxyHandler (httpserver.basehttprequesthandler): |
075146e85bb6
py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29565
diff
changeset
|
35 |
__base = httpserver.basehttprequesthandler |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
36 |
__base_handle = __base.handle |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
37 |
|
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
38 |
server_version = "TinyHTTPProxy/" + __version__ |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
39 |
rbufsize = 0 # self.rfile Be unbuffered |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
40 |
|
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
41 |
def handle(self): |
27637
b502138f5faa
cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents:
27302
diff
changeset
|
42 |
(ip, port) = self.client_address |
14971
0b21ae0a2366
tests: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14494
diff
changeset
|
43 |
allowed = getattr(self, 'allowed_clients', None) |
0b21ae0a2366
tests: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14494
diff
changeset
|
44 |
if allowed is not None and ip not in allowed: |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
45 |
self.raw_requestline = self.rfile.readline() |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
2337
diff
changeset
|
46 |
if self.parse_request(): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
2337
diff
changeset
|
47 |
self.send_error(403) |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
48 |
else: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
49 |
self.__base_handle() |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
50 |
|
14093
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
10282
diff
changeset
|
51 |
def log_request(self, code='-', size='-'): |
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
10282
diff
changeset
|
52 |
xheaders = [h for h in self.headers.items() if h[0].startswith('x-')] |
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
10282
diff
changeset
|
53 |
self.log_message('"%s" %s %s%s', |
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
10282
diff
changeset
|
54 |
self.requestline, str(code), str(size), |
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
10282
diff
changeset
|
55 |
''.join([' %s:%s' % h for h in sorted(xheaders)])) |
32906
23b07333a8b2
tinyproxy: explicitly flush logged messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
31571
diff
changeset
|
56 |
# Flush for Windows, so output isn't lost on TerminateProcess() |
32916
88c1d13b637b
test-http-proxy: redirect proxy stdout to /dev/null
Matt Harbison <matt_harbison@yahoo.com>
parents:
32906
diff
changeset
|
57 |
sys.stdout.flush() |
32906
23b07333a8b2
tinyproxy: explicitly flush logged messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
31571
diff
changeset
|
58 |
sys.stderr.flush() |
14093
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
10282
diff
changeset
|
59 |
|
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
60 |
def _connect_to(self, netloc, soc): |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
61 |
i = netloc.find(':') |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
62 |
if i >= 0: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
2337
diff
changeset
|
63 |
host_port = netloc[:i], int(netloc[i + 1:]) |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
64 |
else: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
65 |
host_port = netloc, 80 |
28646
f452c1cf7a8f
tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27637
diff
changeset
|
66 |
print("\t" "connect to %s:%d" % host_port) |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
67 |
try: soc.connect(host_port) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
18519
diff
changeset
|
68 |
except socket.error as arg: |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
69 |
try: msg = arg[1] |
16703
7292a4618f46
cleanup: replace more naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents:
16300
diff
changeset
|
70 |
except (IndexError, TypeError): msg = arg |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
71 |
self.send_error(404, msg) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
72 |
return 0 |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
73 |
return 1 |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
74 |
|
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
75 |
def do_CONNECT(self): |
31005
d8d698bcdcd6
tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents:
29566
diff
changeset
|
76 |
soc = socket.socket(family, socket.SOCK_STREAM) |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
77 |
try: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
78 |
if self._connect_to(self.path, soc): |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
79 |
self.log_request(200) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
80 |
self.wfile.write(self.protocol_version + |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
81 |
" 200 Connection established\r\n") |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
82 |
self.wfile.write("Proxy-agent: %s\r\n" % self.version_string()) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
83 |
self.wfile.write("\r\n") |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
84 |
self._read_write(soc, 300) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
85 |
finally: |
28646
f452c1cf7a8f
tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27637
diff
changeset
|
86 |
print("\t" "bye") |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
87 |
soc.close() |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
88 |
self.connection.close() |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
89 |
|
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
90 |
def do_GET(self): |
31571
b2a41a826d71
tests: use urlreq in tinyproxy.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31005
diff
changeset
|
91 |
(scm, netloc, path, params, query, fragment) = urlreq.urlparse( |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
92 |
self.path, 'http') |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
93 |
if scm != 'http' or fragment or not netloc: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
94 |
self.send_error(400, "bad url %s" % self.path) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
95 |
return |
31005
d8d698bcdcd6
tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents:
29566
diff
changeset
|
96 |
soc = socket.socket(family, socket.SOCK_STREAM) |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
97 |
try: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
98 |
if self._connect_to(netloc, soc): |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
99 |
self.log_request() |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
100 |
soc.send("%s %s %s\r\n" % ( |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
101 |
self.command, |
31571
b2a41a826d71
tests: use urlreq in tinyproxy.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31005
diff
changeset
|
102 |
urlreq.urlunparse(('', '', path, params, query, '')), |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
103 |
self.request_version)) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
104 |
self.headers['Connection'] = 'close' |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
105 |
del self.headers['Proxy-Connection'] |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
106 |
for key_val in self.headers.items(): |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
107 |
soc.send("%s: %s\r\n" % key_val) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
108 |
soc.send("\r\n") |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
109 |
self._read_write(soc) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
110 |
finally: |
28646
f452c1cf7a8f
tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27637
diff
changeset
|
111 |
print("\t" "bye") |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
112 |
soc.close() |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
113 |
self.connection.close() |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
114 |
|
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
115 |
def _read_write(self, soc, max_idling=20): |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
116 |
iw = [self.connection, soc] |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
117 |
ow = [] |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
118 |
count = 0 |
14494
1ffeeb91c55d
check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents:
14093
diff
changeset
|
119 |
while True: |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
120 |
count += 1 |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
121 |
(ins, _, exs) = select.select(iw, ow, iw, 3) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
2337
diff
changeset
|
122 |
if exs: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
2337
diff
changeset
|
123 |
break |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
124 |
if ins: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
125 |
for i in ins: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
126 |
if i is soc: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
127 |
out = self.connection |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
128 |
else: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
129 |
out = soc |
18519
ca430fb6a668
tests: fix toctou race in tinyproxy.py (issue3795)
Mads Kiilerich <madski@unity3d.com>
parents:
16703
diff
changeset
|
130 |
try: |
ca430fb6a668
tests: fix toctou race in tinyproxy.py (issue3795)
Mads Kiilerich <madski@unity3d.com>
parents:
16703
diff
changeset
|
131 |
data = i.recv(8192) |
ca430fb6a668
tests: fix toctou race in tinyproxy.py (issue3795)
Mads Kiilerich <madski@unity3d.com>
parents:
16703
diff
changeset
|
132 |
except socket.error: |
ca430fb6a668
tests: fix toctou race in tinyproxy.py (issue3795)
Mads Kiilerich <madski@unity3d.com>
parents:
16703
diff
changeset
|
133 |
break |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
134 |
if data: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
135 |
out.send(data) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
136 |
count = 0 |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
137 |
else: |
28646
f452c1cf7a8f
tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27637
diff
changeset
|
138 |
print("\t" "idle", count) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
2337
diff
changeset
|
139 |
if count == max_idling: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
2337
diff
changeset
|
140 |
break |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
141 |
|
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
142 |
do_HEAD = do_GET |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
143 |
do_POST = do_GET |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
144 |
do_PUT = do_GET |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
2337
diff
changeset
|
145 |
do_DELETE = do_GET |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
146 |
|
29433
33770d2b6cf9
py3: conditionalize SocketServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29431
diff
changeset
|
147 |
class ThreadingHTTPServer (socketserver.ThreadingMixIn, |
29566
075146e85bb6
py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29565
diff
changeset
|
148 |
httpserver.httpserver): |
16300
74e114ac6ec1
tests: fix startup/shutdown races in test-https
Matt Mackall <mpm@selenic.com>
parents:
14971
diff
changeset
|
149 |
def __init__(self, *args, **kwargs): |
29566
075146e85bb6
py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29565
diff
changeset
|
150 |
httpserver.httpserver.__init__(self, *args, **kwargs) |
16300
74e114ac6ec1
tests: fix startup/shutdown races in test-https
Matt Mackall <mpm@selenic.com>
parents:
14971
diff
changeset
|
151 |
a = open("proxy.pid", "w") |
74e114ac6ec1
tests: fix startup/shutdown races in test-https
Matt Mackall <mpm@selenic.com>
parents:
14971
diff
changeset
|
152 |
a.write(str(os.getpid()) + "\n") |
74e114ac6ec1
tests: fix startup/shutdown races in test-https
Matt Mackall <mpm@selenic.com>
parents:
14971
diff
changeset
|
153 |
a.close() |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
154 |
|
29565
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
155 |
def runserver(port=8000, bind=""): |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
156 |
server_address = (bind, port) |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
157 |
ProxyHandler.protocol_version = "HTTP/1.0" |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
158 |
httpd = ThreadingHTTPServer(server_address, ProxyHandler) |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
159 |
sa = httpd.socket.getsockname() |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
160 |
print("Serving HTTP on", sa[0], "port", sa[1], "...") |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
161 |
try: |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
162 |
httpd.serve_forever() |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
163 |
except KeyboardInterrupt: |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
164 |
print("\nKeyboard interrupt received, exiting.") |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
165 |
httpd.server_close() |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
166 |
sys.exit(0) |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
167 |
|
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
168 |
if __name__ == '__main__': |
28778
256d90bb12fa
tests: make tinyproxy.py not import sys.argv by name
Yuya Nishihara <yuya@tcha.org>
parents:
28773
diff
changeset
|
169 |
argv = sys.argv |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
170 |
if argv[1:] and argv[1] in ('-h', '--help'): |
28646
f452c1cf7a8f
tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27637
diff
changeset
|
171 |
print(argv[0], "[port [allowed_client_name ...]]") |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
172 |
else: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
173 |
if argv[2:]: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
174 |
allowed = [] |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
175 |
for name in argv[2:]: |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
176 |
client = socket.gethostbyname(name) |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
177 |
allowed.append(client) |
28646
f452c1cf7a8f
tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27637
diff
changeset
|
178 |
print("Accept: %s (%s)" % (client, name)) |
2337
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
179 |
ProxyHandler.allowed_clients = allowed |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
180 |
del argv[2:] |
3f24bc5dee81
http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
181 |
else: |
28646
f452c1cf7a8f
tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27637
diff
changeset
|
182 |
print("Any clients will be served...") |
29565
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
183 |
|
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
184 |
parser = optparse.OptionParser() |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
185 |
parser.add_option('-b', '--bind', metavar='ADDRESS', |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
186 |
help='Specify alternate bind address ' |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
187 |
'[default: all interfaces]', default='') |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
188 |
(options, args) = parser.parse_args() |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
189 |
port = 8000 |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
190 |
if len(args) == 1: |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
191 |
port = int(args[0]) |
143d21a7343e
py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29433
diff
changeset
|
192 |
runserver(port, options.bind) |