Repository navigation
This release adds authenticated proxies, SOCKS4 and a command-line mode. It also fixes many bugs, makes big proxy lists much faster, updates dependencies and cleans up the codebase.
New features
-
Authenticated proxies (#17). Lists accept
user:pass@host:portandhost:port:user:passas well ashost:port. Credentials work for all three types:- HTTP:
Proxy-Authorization: Basic - SOCKS5: username and password (RFC 1929)
- SOCKS4: the user name is sent as the user id
Each connection carries its own credentials; Java's JVM-wide
Authenticatoris never used. So checking many proxies with different credentials at the same time is safe. Exports keep proxies exactly as they were loaded, credentials included. The CSV export gains Username, Password and Type columns, and credentials never appear in logs. - HTTP:
-
SOCKS4/4a support. You can now choose HTTP, SOCKS4 or SOCKS5 in Preferences and on the command line. SOCKS4 falls back to SOCKS4a (the proxy resolves the host name) when the judge host can't be resolved locally. Settings saved as "SOCKS" by 1.2 are read as SOCKS5.
-
Command-line mode (#4). It runs without the GUI and never initialises JavaFX, so it works on headless servers:
java -jar ProxyChecker.jar --cli -i proxies.txt -t socks5 --threads 200 --timeout 5000 -o results.csv --only-working cat proxies.txt | java -jar ProxyChecker.jar --cli -i - -q -w > working.txt- Options:
--format txt|csv,--my-ip,--api-url,-v,-q,--helpand--version. -v/--verboseprints the settings used (inputs, public IP, judge API, type, threads, timeout, output) and one line per proxy as soon as it finishes, with the reason when it's dead:Reasons:[WORKING] 1.0.133.89:4153 socks4 anonymous United States 812ms [DEAD] 203.0.113.7:1080 socks4 connection refused [DEAD] alice@203.0.113.9:1080 socks5 auth failedtimeout,connection refused,auth failed,auth required,bad handshake,rejected by proxy,bad HTTP response,bad API response,HTTP <code>. Passwords are never printed.- Default output shows a startup line, progress, and a summary with working/dead counts, why dead proxies failed, the elapsed time and where results were written. Progress is a live line on a terminal. Otherwise (pipes, log files,
docker runwithout-t) it's a plainProgress:line every 5 seconds. -V/--versionmust be used on its own. Combined with other options it's an error that suggests-v/--verbose.- Results are written in input order. Lines starting with
#are ignored. - Exit codes:
0= working proxies found,1= none working,2= usage error,3= file or IP-lookup error,130= interrupted with Ctrl+C. - Launching without arguments still opens the GUI.
- Docker: the image now uses
ENTRYPOINT, sodocker run --rm -v "$PWD:/data" faiqsohail/proxychecker --cli -i /data/proxies.txt -vworks.
- Options:
-
Stop a running check (GUI). The Check button turns into Stop while checking. Stopping skips proxies that haven't started, closes connections in progress at once instead of waiting for timeouts, and keeps the results already in the table; the status bar shows how many were checked and how many weren't. Results that arrive after the stop are discarded. Closing the window or File → Quit also stops cleanly.
-
Inputs are locked while checking. The proxy input, the loaded list (adding, deleting, drag and drop), File → Open… and Preferences… are disabled during a check and re-enabled when it finishes or is stopped.
-
Ctrl+C in the command line stops the check, still writes the proxies checked so far, prints the summary (
Stopped after 2.3s: 4 of 5 checked, ...andNot checked: 1 (interrupted)) and exits with code130. -
New network layer. A built-in HTTP client tunnels through HTTP, SOCKS4/4a and SOCKS5 proxies. It has per-read timeouts plus an overall deadline, and limits how much a response can send.
Bug fixes
- Checks never finishing / the Check button staying disabled. Whether a check was running used to be guessed by counting JVM threads. It's now tracked explicitly, and completion is reported exactly once.
- Invalid ports no longer stall a check. A proxy with a port above 65535 used to crash its worker without a sound, so the check never finished. Ports must now be 1–65535, and every proxy always gets a result.
- Fewer false positives (#22). A proxy used to count as working as soon as a TCP connection opened, even if it answered with its own login or error page. Now a proxy only counts as working if it returns HTTP 200 with a valid proxy judge response that includes an anonymity level.
- More accurate response times. They now cover the full request through the proxy, not only the TCP connect.
- Fixed socket and file-handle leaks. HTTP connections are always closed. The config file used to be reopened (and never closed) on every table row repaint.
- Settings are more robust. A missing, unreadable or corrupt
config.jsonno longer crashes the app; defaults are used and a corrupt file is left alone. Out-of-range values are fixed up, the file is written atomically, and existing configs from 1.2 keep working. - Settings take effect right away. Changed proxy settings apply to the next check, no restart needed.
- Colour preferences: dark colours (red channel below
0x10) were saved wrong or crashed the settings window. - Settings window: saving with an empty field no longer crashes it. Thread count is limited to 1–1000 so the app can't run out of memory.
- Update check: added timeouts so startup can't hang, it no longer crashes on unexpected tags, and versions are compared properly (e.g. 1.10 > 1.9). "Download" now opens the latest release page.
- Copying from the result table (
C) with no row selected no longer throws an error. - Clipboard and browser now use JavaFX instead of AWT, which avoids hangs on macOS and unsupported-operation errors on some Linux desktops.
- Drag and drop now completes properly and is ignored while a check is running.
- Export: CSV now has a header row (see the new columns above) and correct quoting (e.g.
"Korea, Republic of"). Empty values are left blank instead ofnull, files are UTF-8, and write errors are reported instead of being silently swallowed. - Loading lists: files are read as UTF-8, and a BOM and surrounding whitespace are stripped.
Performance
- Large proxy lists load almost instantly (#12). De-duplication was O(n²), so an 11 MB list froze the app. 500,000 lines now load in under half a second.
- The UI stays responsive during large checks. Results reach the table in batches instead of one UI update per proxy.
- Settings are cached in memory instead of being re-read from disk on every table repaint.
- The thread pool no longer starts more threads than there are proxies.
Dependencies & build
- Gson 2.8.5 → 2.13.2 (fixes CVE-2022-25647).
- JavaFX 17 → 17.0.20.
- Java 11+ is now the documented requirement. JavaFX 17 already needed it; the README said 1.8+.
- Maven plugin versions are pinned and a JUnit 5 test suite was added (25 tests, run by
mvn package). - Docker image: maintained
eclipse-temurinbase images, the runtime libraries JavaFX actually needs, and a cached dependency layer.
Code cleanup
- Standard Java/Maven conventions: lower-case packages (
co.proxychecker.*), resources insrc/main/resources, and camelCase naming in controllers and FXML. - The version is defined once, in
pom.xml. - Removed dead code, unused imports and duplicated icon/FXML loading.
- Consistent error handling and
java.util.logginginstead ofSystem.out/printStackTrace. - README build and run instructions updated.
Known limitations
- SOCKS4 has no passwords; only the user name is sent. IPv6 proxy addresses are not supported.
- The jar contains JavaFX native libraries for the OS it was built on. The command-line mode doesn't need them and runs anywhere with Java 11+.
Note for anyone launching the app by class name: the main class is now
co.proxychecker.startup.Launcher.java -jar ProxyChecker.jarworks as before.