Mercurial > hg
annotate tests/tinyproxy.py @ 35569:964212780daf
rust: implementation of `hg`
This commit provides a mostly-working implementation of the
`hg` script in Rust along with scaffolding to support Rust in
the repository.
If you are familiar with Rust, the contents of the added rust/
directory should be pretty straightforward. We create an "hgcli"
package that implements a binary application to run Mercurial.
The output of this package is an "hg" binary.
Our Rust `hg` (henceforth "rhg") essentially is a port of the existing
`hg` Python script. The main difference is the creation of the embedded
CPython interpreter is handled by the binary itself instead of relying
on the shebang. In that sense, rhg is more similar to the "exe wrapper"
we currently use on Windows. However, unlike the exe wrapper, rhg does
not call the `hg` Python script. Instead, it uses the CPython APIs to
import mercurial modules and call appropriate functions. The amount of
code here is surprisingly small.
It is my intent to replace the existing C-based exe wrapper with rhg.
Preferably in the next Mercurial release. This should be achievable -
at least for some Mercurial distributions. The future/timeline for
rhg on other platforms is less clear. We already ship a hg.exe on
Windows. So if we get the quirks with Rust worked out, shipping a
Rust-based hg.exe should hopefully not be too contentious.
Now onto the implementation.
We're using python27-sys and the cpython crates for talking to the
CPython API. We currently don't use too much functionality of the
cpython crate and could have probably cut it out. However, it does
provide a reasonable abstraction over unsafe {} CPython function
calls. While we still have our fair share of those, at least we're
not dealing with too much refcounting, error checking, etc. So I
think the use of the cpython crate is justified. Plus, there is
not-yet-implemented functionality that could benefit from cpython. I
see our use of this crate only increasing.
The cpython and python27-sys crates are not without their issues.
The cpython crate didn't seem to account for the embedding use case
in its design. Instead, it seems to assume that you are building
a Python extension. It is making some questionable decisions around
certain CPython APIs. For example, it insists that
PyEval_ThreadsInitialized() is called and that the Python code
likely isn't the main thread in the underlying application. It
is also missing some functionality that is important for embedded
use cases (such as exporting the path to the Python interpreter
from its build script). After spending several hours trying to
wrangle python27-sys and cpython, I gave up and forked the project
on GitHub. Our Cargo.toml tracks this fork. I'm optimistic that
the upstream project will accept our contributions and we can
eventually unfork.
There is a non-trivial amount of code in our custom Cargo build
script. Our build.rs (which is called as part of building the hgcli
crate):
* Validates that the Python interpreter that was detected by the
python27-sys crate provides a shared library (we only support
shared library linking at this time - although this restriction
could be loosened).
* Validates that the Python is built with UCS-4 support. This ensures
maximum Unicode compatibility.
* Exports variables to the crate build allowing the built crate to e.g.
find the path to the Python interpreter.
The produced rhg should be considered alpha quality. There are several
known deficiencies. Many of these are documented with inline TODOs.
Probably the biggest limitation of rhg is that it assumes it is
running from the ./rust/target/<target> directory of a source
distribution. So, rhg is currently not very practical for real-world
use. But, if you can `cargo build` it, running the binary *should*
yield a working Mercurial CLI.
In order to support using rhg with the test harness, we needed to hack
up run-tests.py so the path to Mercurial's Python files is set properly.
The change is extremely hacky and is only intended to be a stop-gap
until the test harness gains first-class support for installing rhg.
This will likely occur after we support running rhg outside the
source directory.
Despite its officially alpha quality, rhg copes extremely well with
the test harness (at least on Linux). Using
`run-tests.py --with-hg ../rust/target/debug/hg`, I only encounter
the following failures:
* test-run-tests.t -- Warnings emitted about using an unexpected
Mercurial library. This is due to the hacky nature of setting the
Python directory when run-tests.py detected rhg.
* test-devel-warnings.t -- Expected stack trace missing frame for `hg`
(This is expected since we no longer have an `hg` script!)
* test-convert.t -- Test running `$PYTHON "$BINDIR"/hg`, which obviously
assumes `hg` is a Python script.
* test-merge-tools.t -- Same assumption about `hg` being executable with
Python.
* test-http-bad-server.t -- Seeing exit code 255 instead of 1 around
line 358.
* test-blackbox.t -- Exit code 255 instead of 1.
* test-basic.t -- Exit code 255 instead of 1.
It certainly looks like we have a bug around exit code handling. I
don't think it is severe enough to hold up review and landing of this
initial implementation. Perfect is the enemy of good.
Differential Revision: https://phab.mercurial-scm.org/D1581
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 10 Jan 2018 08:53:22 -0800 |
parents | 88c1d13b637b |
children | 97e2442a4595 |
rev | line source |
---|---|
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) |