Add script to enable use of pac server (#7397)
* Add upstream_pac script * [autofix.ci] apply automated fixes --------- Co-authored-by: jweigel <jweigel@ebay.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
e0434726f3
commit
3819467b04
|
@ -0,0 +1,93 @@
|
||||||
|
"""
|
||||||
|
Mitmproxy add-on to support using a PAC file to determine the upstream proxy to use.
|
||||||
|
Supports adding an alternate proxy to use for when the PAC decides the connection should be DIRECT.
|
||||||
|
Adds two options to mitmproxy:
|
||||||
|
|
||||||
|
pac_url - an url that will return a pac file to use for evaluating which upstream proxy to use.
|
||||||
|
direct_upstream_proxy - an alternate proxy to be used if the PAC returns DIRECT.
|
||||||
|
|
||||||
|
Requires pypac to be installed and available on the python path.
|
||||||
|
|
||||||
|
This class is inspired by the user contributed add-on:
|
||||||
|
https://github.com/mitmproxy/mitmproxy/blob/main/examples/contrib/change_upstream_proxy.py
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import pypac
|
||||||
|
|
||||||
|
from mitmproxy import ctx
|
||||||
|
from mitmproxy import http
|
||||||
|
from mitmproxy.net import server_spec
|
||||||
|
|
||||||
|
|
||||||
|
class UpstreamPac:
|
||||||
|
pac_file: pypac.parser.PACFile | None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def load(loader) -> None:
|
||||||
|
loader.add_option(
|
||||||
|
name="direct_upstream_proxy",
|
||||||
|
typespec=str | None,
|
||||||
|
default=None,
|
||||||
|
help="Alternate upstream proxy to use when PAC resolution returns direct (http://localhost:8081)",
|
||||||
|
)
|
||||||
|
|
||||||
|
loader.add_option(
|
||||||
|
name="pac_url",
|
||||||
|
typespec=str | None,
|
||||||
|
default=None,
|
||||||
|
help="Proxy autoconfig url used to retrieve the PAC file",
|
||||||
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def configure(updated) -> None:
|
||||||
|
if "pac_url" in updated:
|
||||||
|
if ctx.options.pac_url is None:
|
||||||
|
UpstreamPac.pac_file = None
|
||||||
|
logging.info("No pac file specified")
|
||||||
|
else:
|
||||||
|
UpstreamPac.pac_file = pypac.get_pac(
|
||||||
|
url=ctx.options.pac_url,
|
||||||
|
allowed_content_types=[
|
||||||
|
"application/x-ns-proxy-autoconfig ",
|
||||||
|
"application/x-javascript-config",
|
||||||
|
"text/html",
|
||||||
|
"text/plain",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
if UpstreamPac.pac_file is None:
|
||||||
|
logging.error(
|
||||||
|
"Failed to load pac file from: %s", ctx.options.pac_url
|
||||||
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def proxy_address(flow: http.HTTPFlow) -> tuple[str, tuple[str, int]] | None:
|
||||||
|
if UpstreamPac.pac_file:
|
||||||
|
proxy = UpstreamPac.pac_file.find_proxy_for_url(
|
||||||
|
flow.request.url, flow.request.host
|
||||||
|
)
|
||||||
|
|
||||||
|
if proxy == "DIRECT":
|
||||||
|
if ctx.options.direct_upstream_proxy is not None:
|
||||||
|
return server_spec.parse(ctx.options.direct_upstream_proxy, "http")
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
proxy_url = pypac.parser.proxy_url(proxy)
|
||||||
|
return server_spec.parse(proxy_url, "http")
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def request(flow: http.HTTPFlow) -> None:
|
||||||
|
address = UpstreamPac.proxy_address(flow)
|
||||||
|
|
||||||
|
if address is not None:
|
||||||
|
logging.info(
|
||||||
|
"Using proxy %s://%s:%s for %s"
|
||||||
|
% (address[0], address[1][0], address[1][1], flow.request.host)
|
||||||
|
)
|
||||||
|
flow.server_conn.via = address
|
||||||
|
|
||||||
|
|
||||||
|
addons = [UpstreamPac()]
|
Loading…
Reference in New Issue