tests/tinyproxy.py
author Matt Harbison <matt_harbison@yahoo.com>
Thu, 12 Sep 2024 12:53:00 -0400
changeset 51861 f81e0ce5103a
parent 49279 127d33e63d1a
permissions -rwxr-xr-x
typing: simplify archive.gz writing and drop a few pytype suppressions I was waiting until 3.8 to use `Literal` to fix this, but there's also the ":" and "|" characters that are passed along here, meant only for the non-gz archive types. But manipulating what the local caller passes is silly- we know we're writing, so just open it for writing. As an added bonus, PyCharm stops flagging the call too (since it doesn't know about pytype suppression comments).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47500
23f5ed6dbcb1 run-tests: stop writing a `python3` symlink pointing to python2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45830
diff changeset
     1
#!/usr/bin/env python
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     2
27302
faca4adfed0a tests: use absolute_import in tinyproxy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
     3
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     4
__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
     5
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     6
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
     7
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
     8
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
     9
tested yet.
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    10
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    11
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
    12
"""
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
__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
    15
29565
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
    16
import optparse
27302
faca4adfed0a tests: use absolute_import in tinyproxy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    17
import os
faca4adfed0a tests: use absolute_import in tinyproxy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    18
import select
faca4adfed0a tests: use absolute_import in tinyproxy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    19
import socket
28778
256d90bb12fa tests: make tinyproxy.py not import sys.argv by name
Yuya Nishihara <yuya@tcha.org>
parents: 28773
diff changeset
    20
import sys
29431
80880ad3fccd py3: conditionalize the urlparse import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28778
diff changeset
    21
41709
97e2442a4595 py3: port tinyproxy.py to work with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32916
diff changeset
    22
from mercurial import (
97e2442a4595 py3: port tinyproxy.py to work with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32916
diff changeset
    23
    pycompat,
97e2442a4595 py3: port tinyproxy.py to work with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32916
diff changeset
    24
    util,
97e2442a4595 py3: port tinyproxy.py to work with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32916
diff changeset
    25
)
29431
80880ad3fccd py3: conditionalize the urlparse import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28778
diff changeset
    26
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29565
diff changeset
    27
httpserver = util.httpserver
29433
33770d2b6cf9 py3: conditionalize SocketServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29431
diff changeset
    28
socketserver = util.socketserver
31571
b2a41a826d71 tests: use urlreq in tinyproxy.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31005
diff changeset
    29
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
    30
31005
d8d698bcdcd6 tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 29566
diff changeset
    31
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
    32
    family = socket.AF_INET6
d8d698bcdcd6 tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 29566
diff changeset
    33
else:
d8d698bcdcd6 tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 29566
diff changeset
    34
    family = socket.AF_INET
d8d698bcdcd6 tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 29566
diff changeset
    35
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    36
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    37
class ProxyHandler(httpserver.basehttprequesthandler):
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29565
diff changeset
    38
    __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
    39
    __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
    40
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    41
    server_version = "TinyHTTPProxy/" + __version__
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    42
    rbufsize = 0  # self.rfile Be unbuffered
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    43
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    44
    def handle(self):
27637
b502138f5faa cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents: 27302
diff changeset
    45
        (ip, port) = self.client_address
14971
0b21ae0a2366 tests: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14494
diff changeset
    46
        allowed = getattr(self, 'allowed_clients', None)
0b21ae0a2366 tests: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14494
diff changeset
    47
        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
    48
            self.raw_requestline = self.rfile.readline()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 2337
diff changeset
    49
            if self.parse_request():
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 2337
diff changeset
    50
                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
    51
        else:
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    52
            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
    53
14093
ce99d887585f httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents: 10282
diff changeset
    54
    def log_request(self, code='-', size='-'):
ce99d887585f httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents: 10282
diff changeset
    55
        xheaders = [h for h in self.headers.items() if h[0].startswith('x-')]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    56
        self.log_message(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    57
            '"%s" %s %s%s',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    58
            self.requestline,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    59
            str(code),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    60
            str(size),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    61
            ''.join([' %s:%s' % h for h in sorted(xheaders)]),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    62
        )
32906
23b07333a8b2 tinyproxy: explicitly flush logged messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 31571
diff changeset
    63
        # 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
    64
        sys.stdout.flush()
32906
23b07333a8b2 tinyproxy: explicitly flush logged messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 31571
diff changeset
    65
        sys.stderr.flush()
14093
ce99d887585f httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents: 10282
diff changeset
    66
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    67
    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
    68
        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
    69
        if i >= 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    70
            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
    71
        else:
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    72
            host_port = netloc, 80
28646
f452c1cf7a8f tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
    73
        print("\t" "connect to %s:%d" % host_port)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    74
        try:
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    75
            soc.connect(host_port)
49274
b5fe10b3c9f5 py3: don’t subscript socket.error
Manuel Jacob <me@manueljacob.de>
parents: 47500
diff changeset
    76
        except socket.error as e:
b5fe10b3c9f5 py3: don’t subscript socket.error
Manuel Jacob <me@manueljacob.de>
parents: 47500
diff changeset
    77
            self.send_error(404, e.strerror)
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    78
            return 0
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    79
        return 1
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    80
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    81
    def do_CONNECT(self):
31005
d8d698bcdcd6 tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 29566
diff changeset
    82
        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
    83
        try:
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    84
            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
    85
                self.log_request(200)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    86
                self.wfile.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    87
                    pycompat.bytestr(self.protocol_version)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    88
                    + b" 200 Connection established\r\n"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    89
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    90
                self.wfile.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    91
                    b"Proxy-agent: %s\r\n"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    92
                    % pycompat.bytestr(self.version_string())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
    93
                )
41709
97e2442a4595 py3: port tinyproxy.py to work with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32916
diff changeset
    94
                self.wfile.write(b"\r\n")
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    95
                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
    96
        finally:
28646
f452c1cf7a8f tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
    97
            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
    98
            soc.close()
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    99
            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
   100
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   101
    def do_GET(self):
31571
b2a41a826d71 tests: use urlreq in tinyproxy.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31005
diff changeset
   102
        (scm, netloc, path, params, query, fragment) = urlreq.urlparse(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   103
            self.path, 'http'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   104
        )
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   105
        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
   106
            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
   107
            return
31005
d8d698bcdcd6 tinyproxy: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 29566
diff changeset
   108
        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
   109
        try:
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   110
            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
   111
                self.log_request()
41709
97e2442a4595 py3: port tinyproxy.py to work with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32916
diff changeset
   112
                url = urlreq.urlunparse(('', '', path, params, query, ''))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   113
                soc.send(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   114
                    b"%s %s %s\r\n"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   115
                    % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   116
                        pycompat.bytestr(self.command),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   117
                        pycompat.bytestr(url),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   118
                        pycompat.bytestr(self.request_version),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   119
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   120
                )
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   121
                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
   122
                del self.headers['Proxy-Connection']
41709
97e2442a4595 py3: port tinyproxy.py to work with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32916
diff changeset
   123
                for key, val in self.headers.items():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   124
                    soc.send(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   125
                        b"%s: %s\r\n"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   126
                        % (pycompat.bytestr(key), pycompat.bytestr(val))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   127
                    )
41709
97e2442a4595 py3: port tinyproxy.py to work with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32916
diff changeset
   128
                soc.send(b"\r\n")
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   129
                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
   130
        finally:
28646
f452c1cf7a8f tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
   131
            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
   132
            soc.close()
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   133
            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
   134
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   135
    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
   136
        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
   137
        ow = []
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   138
        count = 0
14494
1ffeeb91c55d check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents: 14093
diff changeset
   139
        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
   140
            count += 1
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   141
            (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
   142
            if exs:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 2337
diff changeset
   143
                break
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   144
            if ins:
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   145
                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
   146
                    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
   147
                        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
   148
                    else:
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   149
                        out = soc
18519
ca430fb6a668 tests: fix toctou race in tinyproxy.py (issue3795)
Mads Kiilerich <madski@unity3d.com>
parents: 16703
diff changeset
   150
                    try:
ca430fb6a668 tests: fix toctou race in tinyproxy.py (issue3795)
Mads Kiilerich <madski@unity3d.com>
parents: 16703
diff changeset
   151
                        data = i.recv(8192)
ca430fb6a668 tests: fix toctou race in tinyproxy.py (issue3795)
Mads Kiilerich <madski@unity3d.com>
parents: 16703
diff changeset
   152
                    except socket.error:
ca430fb6a668 tests: fix toctou race in tinyproxy.py (issue3795)
Mads Kiilerich <madski@unity3d.com>
parents: 16703
diff changeset
   153
                        break
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   154
                    if data:
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   155
                        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
   156
                        count = 0
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   157
            else:
28646
f452c1cf7a8f tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
   158
                print("\t" "idle", count)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 2337
diff changeset
   159
            if count == max_idling:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 2337
diff changeset
   160
                break
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   161
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   162
    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
   163
    do_POST = do_GET
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   164
    do_PUT = do_GET
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 2337
diff changeset
   165
    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
   166
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   167
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   168
class ThreadingHTTPServer(socketserver.ThreadingMixIn, httpserver.httpserver):
16300
74e114ac6ec1 tests: fix startup/shutdown races in test-https
Matt Mackall <mpm@selenic.com>
parents: 14971
diff changeset
   169
    def __init__(self, *args, **kwargs):
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29565
diff changeset
   170
        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
   171
        a = open("proxy.pid", "w")
74e114ac6ec1 tests: fix startup/shutdown races in test-https
Matt Mackall <mpm@selenic.com>
parents: 14971
diff changeset
   172
        a.write(str(os.getpid()) + "\n")
74e114ac6ec1 tests: fix startup/shutdown races in test-https
Matt Mackall <mpm@selenic.com>
parents: 14971
diff changeset
   173
        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
   174
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   175
29565
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   176
def runserver(port=8000, bind=""):
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   177
    server_address = (bind, port)
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   178
    ProxyHandler.protocol_version = "HTTP/1.0"
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   179
    httpd = ThreadingHTTPServer(server_address, ProxyHandler)
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   180
    sa = httpd.socket.getsockname()
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   181
    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
   182
    try:
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   183
        httpd.serve_forever()
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   184
    except KeyboardInterrupt:
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   185
        print("\nKeyboard interrupt received, exiting.")
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   186
        httpd.server_close()
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   187
        sys.exit(0)
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   188
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   189
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   190
if __name__ == '__main__':
28778
256d90bb12fa tests: make tinyproxy.py not import sys.argv by name
Yuya Nishihara <yuya@tcha.org>
parents: 28773
diff changeset
   191
    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
   192
    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
   193
        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
   194
    else:
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   195
        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
   196
            allowed = []
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   197
            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
   198
                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
   199
                allowed.append(client)
28646
f452c1cf7a8f tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
   200
                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
   201
            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
   202
            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
   203
        else:
28646
f452c1cf7a8f tests: make tinyproxy.py use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27637
diff changeset
   204
            print("Any clients will be served...")
29565
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   205
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   206
        parser = optparse.OptionParser()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   207
        parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   208
            '-b',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   209
            '--bind',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   210
            metavar='ADDRESS',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   211
            help='Specify alternate bind address ' '[default: all interfaces]',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   212
            default='',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41709
diff changeset
   213
        )
29565
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   214
        (options, args) = parser.parse_args()
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   215
        port = 8000
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   216
        if len(args) == 1:
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   217
            port = int(args[0])
143d21a7343e py3: re-implement the BaseHTTPServer.test() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
   218
        runserver(port, options.bind)