Skip to content

ProxyChecker-v1.3

Latest

Choose a tag to compare

@github-actions github-actions released this 12 Oct 06:44
f3fefb4

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:port and host:port:user:pass as well as host: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 Authenticator is 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.

  • 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, --help and --version.
    • -v/--verbose prints 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:
      [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 failed
      
      Reasons: timeout, 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 run without -t) it's a plain Progress: line every 5 seconds.
    • -V/--version must 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, so docker run --rm -v "$PWD:/data" faiqsohail/proxychecker --cli -i /data/proxies.txt -v works.
  • 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, ... and Not checked: 1 (interrupted)) and exits with code 130.

  • 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.json no 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 of null, 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-temurin base images, the runtime libraries JavaFX actually needs, and a cached dependency layer.

Code cleanup

  • Standard Java/Maven conventions: lower-case packages (co.proxychecker.*), resources in src/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.logging instead of System.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.jar works as before.