Releases: genotrance/px
Releases · genotrance/px
Px v0.11.0
New features
- Added Kerberos ticket management (
--kerberos) for Linux and macOS — Px
acquires and renews Kerberos tickets automatically usingkinitwith the
configured--usernameand password fromPX_PASSWORDor keyring. No keytab
file is created. Addresses #252 and #258.
Bug fixes
- Fixed auth failure recovery when a Kerberos ticket becomes available after Px
startup — clearingMCURL.failedallows previously-blocked proxies to be
retried (#258). - Fixed
--verboseoutput not appearing in non-TTY environments (e.g. Docker
withworkers=1) due to Python block-buffering stdout.
Docker
- Added
BUILDERbuild arg and local builder stage toDockerfileto support
both CI (pre-built wheel) and local (source tree) builds. - The full Docker image now requires
--cap-add IPC_LOCK— gnome-keyring 48+
(Alpine 3.23+) links libcap-ng which aborts without theIPC_LOCKcapability.
Improvements
- Replaced synchronous
http.server+ threading withasyncio+h11.
CONNECT tunnels now use zero-thread bidirectional relays:TunnelRelay
(FD watchers viaadd_reader/add_writer) on Linux, and
_async_tunnel_relay(asyncioStreamReader/StreamWriterfor the
client side, IOCP-backedsock_recv/sock_sendallfor the upstream
libcurl socket) on Windows. Thread count stays bounded at the thread
pool size regardless of active tunnel count. - Changed
--workersdefault from 2 to 1 — the async event loop handles
concurrency without multiple processes. - Reduced per-request overhead: double-checked locking in
reload_proxy(),
cachedget_curl_features()andnoproxy_hosts, shallow copy for proxy
server lists, tuples for hot-path membership checks. - Optimized
--verboselogging: skipped file I/O overhead and
process/thread name lookup when--workers=1. Log output is more
compact (timestamp + call tree + message) while retaining diagnostic value. - Added Winget package support — Px can now be installed on Windows via
winget install genotrance.px. Manifests are submitted automatically on
release viavedantmgoyal9/winget-releaser. Addresses #115, PR #264. - Documented WinSW service account and environment variable options for
running Px as a Windows service with SSPI or explicit credentials (#259).
Internal
- Added
h11runtime dependency,psutildev dependency. - Wired
--threadstoasynciodefault executor pool size. - Dynamic xdist worker count (
-n auto) — auto-scales to hardware via a
platform-awarepytest_xdist_auto_num_workershook inconftest.py. - Switched test fixtures and helpers from
--debug(file logging) to
--verbose(stdout logging), reducing test suite runtime by ~58%. - Added concurrency benchmark tests (
make benchmark) covering HTTP
throughput, CONNECT tunnel throughput, thread pool saturation, active data
exchange, thread count bounds, and memory bounds. Benchmarks now test up to
1 000–1 024 concurrent connections with sliding success thresholds for
barrier-synchronised active tunnel tests. - Added large data transfer reliability tests (
make test-large-data) with
SHA-256 integrity verification for concurrent multi-MB GET/POST over HTTP
and HTTPS. CI jobs run these on both Linux and Windows.
Px v0.10.3
Bug fixes
- Fixed #248 — check install cmd if modified.
- Fixed #255 — handle Python v3.13 runtime context on startup.
- Fixed
set_client_auth()mutating the globalAUTH_SUPPORTEDlist when
called withANYorANYSAFE— now copies the list. - Fixed
cfg_int_init()/cfg_float_init()passing invalid string values to
callbacks when config values fail to parse — now falls back to default. - Fixed
send_html()in handler inserting a tuple instead of a string into
the error pageexplainfield. - Fixed
file_url_to_local_path()returningNonefor non-Windows file URLs. - Fixed
--hostonlyand--quitfailing in emulated/virtualized environments
(QEMU, Docker on ARM) by adding a fallback whenpsutil.net_if_stats()is
unavailable (psutil#2693).
Improvements
- Replaced
quickjsdependency withquickjs-ng. - Dropped Python 3.8 and 3.9 support; minimum is now Python 3.10.
- Added Python 3.14 classifier.
- Restructured
README.mdwith basic install/config/usage info and full
github.comlinks (for PyPI/Docker Hub display). - Made
docs/configuration.mda complete user-facing reference with all CLI
flags, environment variables, INI keys, defaults, and auth types. - Split detailed documentation into user-facing (
docs/installation.md,
docs/usage.md,docs/configuration.md) and developer (docs/architecture.md,
docs/build.md,docs/testing.md) sections.
Internal
- Modernised project tooling: ruff, mypy, pre-commit, Makefile,
docs/folder. - CI workflow (
ci.yml) now triggers ondevelpush and PRs only (not
master). Test matrix expanded to 9 jobs: Ubuntu on Python 3.10–3.14, macOS
on 3.10 and 3.14, Windows on 3.10 and 3.14. - Build workflow (
build.yml) now triggers onmasterpush and
workflow_dispatchonly. Docker build and push steps merged into the
releasejob (separatedockerjob removed). - Added Dependabot configuration for monthly pip and GitHub Actions updates.
tools.py: allsys.exit()calls changed tosys.exit(1)for proper error
propagation. Docker function updated to accept--pushflag and
--wheels-diroption for CI usage.build.sh: addedbuild_localfunction for end-to-end local build and test
using Docker containers (musl or glibc). Addedauditwheelto pip install in
build_binaryfor both musl and glibc. Added error checking (|| return 1)
tobuild_localsteps.- Added
test-muslandtest-glibcMakefile targets for local container
testing. - Updated GitHub Actions to Node 24:
actions/setup-pythonv6,
astral-sh/setup-uvv7, Docker actions v4. - Fixed build workflow: Linux musl Nuitka builds now use Alpine containers
(both x86_64 and aarch64) since musllinux containers lack Python dev headers
needed by Nuitka. Linux glibc builds use Python 3.13 from the manylinux
container (/opt/python/cp313-cp313/). All Linux container builds install
uvvia curl consistently. - Fixed test-binary workflow: release archives from the binary job are now
extracted before testing. ThePXBINenvironment variable is now properly
exported to tox so thebinarytox environment actually tests the compiled
Nuitka/embedded binary. - Resolved ruff violations in
px/package — reduced suppressed rules to
minimal intentional set. - Ported
HISTORY.txttodocs/changelog.mdand removed the original file. - Expanded
docs/architecture.mdwith State singleton, request handling, spnego
monkey-patching, PAC evaluation, proxy reload, and error handling details. - Expanded pytest suite: added
test_debug.py,test_wproxy.py,test_pac.py,
test_network.py; expandedtest_config.pywith unit tests for utility
functions and defaults. Deleted legacytest.py. - Updated tox configuration to run all test files.
- Added
./mcurllibas local wheel index to Makefile install for testing with
unreleased mcurl versions. - Cleaned up
tools.py: removed obsolete functions (get_curl,pyinstaller,
scoop, and all GitHub API release management). Remaining targets are
--wheel,--nuitka,--embed,--deps,--depspkg, and--docker. - Removed old
build.shandbuild.ps1monolithic build scripts — replaced
by GitHub Actions workflows and the newbuild.shfunction library. - Added GitHub Actions CI workflow (
ci.yml) with quality checks and test
matrix across Python 3.10–3.14 on ubuntu, macos, and windows. - Added GitHub Actions build workflow (
build.yml) for wheels, Nuitka/embedded
binaries, multi-distro testing, GitHub release posting, and PyPI publishing.
Platform matrix covers all targets where bothpymcurlandquickjs-ng
provide wheels. - Added shared
.github/actions/setup-python-envcomposite action. - Added
build.shas a shell function library sourced bybuild.yml. It
consolidates repeated CI scaffolding (uv installation, Python discovery,
wheel building, binary building, archive extraction, test execution) into
reusable functions, keepingbuild.ymlconcise. - Refactored
tools.py: madepymcurlimport lazy so the script can run
without it installed (guards incurl()andnuitka()). Added
make_archive_with_hash()helper to deduplicate archive+hash blocks.
Added--historyflag to print the latest changelog section (used by the
release job). Made version import resilient with apyproject.toml
fallback whenpx-proxyis not installed as a package.
Px v0.10.2
- Fixed #246 - resolved crash caused by PAC hostname resolution
- Added gui script
pxw.exeto run Px in the background on Windows, addressing
#203, #213 and #235 by providing correct path for px.ini and logs. - Enhanced
px --installto write--config=pathinto the registry to support
non-standard locations forpx.ini - Fixed #217 - updated
px --installto writepxwinto the registry to run
Px in the background on Windows startup - Added support to read and write px.ini from the user config directory
- Fixed #218 - improved config load order to cwd, user config or script path
if file already exists. If --save, the file should be writable, otherwise use
the user config directory.
Px v0.10.1
- Fixed docker image to work correctly with command line flags, include kerberos
packages - Merged PR #233 - force flag to overwrite existing installation of Px in the
Windows registry - Merged PR #237 - handle pid reuse and support for pwsh
- Fixed #225, #245 - better handling of PAC file failures and fallback to DIRECT
mode when they happen - Replaced quickjs Context with Function as recommended in #206 to avoid thread
safety issues in PAC handling - Proxy reload support also for MODE_CONFIG_PAC if loading a PAC URL
- Fixed #208 - try GSS-API authentication on all OS if supported by libcurl
Px v0.10.0
- Replaced ctypes based libcurl backend with pymcurl which uses cffi and includes
the latest libcurl binaries - Fixed #219, #224 - pymcurl uses libcurl with schannel on Windows which loads
certs from the OS - Fixed #214 - handle case where no headers are received from client
- Fixed issue curl/discussions/15700 where POST was failing in auth=NONE mode for
NTLM proxies - Fixed issue in the Px docker container that would not stop unless it was killed
Px v0.9.2
Px v0.9.1
- Fixed issue with logging not working when set from px.ini - #204
- Fixed issue with environment variables not propagating to all processes in Linux
- Documented how to install binary version of Px on Windows without running in a
console window - #203 - Fixed issue with quickjs crashing in PAC mode with multiple threads - #198 / #206
Px v0.9.0
- Added support for domains in noproxy - #2
- Expanded noproxy to work in all proxy modes - #177
- Added --test to verify Px configuration
- Windows binary now created with embeddable Python to avoid being flagged
by virus scanners - #182 #197 - Added support for Python 3.11 and 3.12, removed Python 2.7
- Fixed #183 - keyring import on OSX
- Fixed #187 - removed dependency on keyring_jeepney which is deprecated
- Fixed #188 - removed keyrings.alt and added docs for leveraging third
party keyring backends - Added support to load Px flags from environment variables and dotenv files
- Changed loading order of px.ini - from CLI flag first, environment next,
working directory and finally from the Px directory - Fixed #200 - print debug messages when --gateway or --hostonly overrides
listen and allow rules - Fixed #199 - cache auth mechanism that libcurl discovers and uses with
upstream proxy - speeds up transactions and avoids POST/PUT rewind issue - Added support to log to the working directory - #189. Logging destination now
configurable via CLI, env and px.ini. - Added --restart to quit Px and start a new instance - #185
- Fixed #184 - PAC proxy list was including blank entries
- Fixed #152 - increased number of default threads from 5 to 32
- Fixed issue leading to connection reuse by client after HTTPS connection was
closed by server - Mapped additional libcurl errors to HTTP errors to inform client
- Added support to listen on multiple interfaces - #195
- Added support for --auth=NONE which defers all authentication to the client,
allowing multiple instances of Px to be chained together to access an upstream
proxy that is not directly connected - Fixed issue with getting all interfaces correctly for --hostonly
- Fixed issue with HTTP PUT not working in some scenarios
- Added support for client authentication - support for NEGOTIATE, NTLM, DIGEST
and BASIC auth with SSPI when available - #117 - Refined --quit to directly communicate with running instances instead of looking
for process matches - fixed issue on OSX where Px was not quitting in script and
pip modes