Proxy troubleshooting

Proxy Timeout Errors: How to Diagnose Slow or Unreachable Proxies

A practical timeout checklist for browsers, scraping scripts, API clients and monitoring jobs.

Fast diagnosis

A proxy timeout means the client waited too long for a connection or response. Check whether the proxy is reachable, whether the destination is slow, and whether the timeout value is too aggressive for the route.

  1. Identify the timeout stage
  2. Measure the route
  3. Adjust workload and limits
Timeouts can come from proxy route, target server or client limits.

Do not change five things at once. Test the proxy directly, then test the same proxy inside the browser, script or application that fails.

Symptoms you usually see

  • The request hangs and then fails with timeout.
  • Some proxy locations work while others fail.
  • Small pages load but large pages fail.
  • The target works directly but not through a proxy route.

Most likely causes

Cause How to confirm it
Proxy server unreachable Test the same proxy with a known fast target.
Target site slow or blocking Compare direct access and another proxy location.
Timeout too low Increase connect timeout and total timeout separately.
Route problem Use traceroute or location checks to inspect the path.

Fix workflow

  1. Test the proxy with a lightweight target first.
  2. Separate connect timeout from full response timeout.
  3. Try another proxy in the same location to identify a single-IP issue.
  4. Try another target to identify destination slowness.
  5. Increase timeout only after confirming the proxy is healthy.

Field notes

Proxy errors become harder to solve when every layer changes at the same time. Keep the proxy, target URL, protocol and client constant until you know which layer fails. If the proxy fails in a simple direct test, the browser or script is not the first thing to fix. If the proxy works in a direct test but fails in the application, focus on application format, authentication handling, DNS behavior and whether another proxy/VPN setting overrides the request.

When debugging production jobs, save the exact proxy format, source machine, public IP, target URL, response code and timestamp. That small record is often enough to separate a temporary route failure from a repeated configuration mistake.

Useful checks

Use the Proxy Tester to confirm the proxy answers, then use Traceroute IP when the route itself looks unstable.

Compare a direct request and a proxy request from the same machine

Run both checks on the computer or server where the application fails. Use the same small HTTPS URL, method and timeout values. A hosted Proxy Tester sends requests from its own server, so its result cannot confirm the route or source-IP authorization of your machine.

These commands use cURL and a small GET request. On Windows PowerShell, use curl.exe instead of curl. Replace the example destination with a read-only URL you are authorized to check. The 5-second connection and 15-second total limits are starting values for this comparison, not universal settings or performance targets. The total limit includes the connection phase. See the cURL option reference.

Direct check:

curl --disable --noproxy "*" --connect-timeout 5 --max-time 15 --silent --show-error --output direct-response.txt --write-out "http=%{http_code} connect=%{http_connect} tcp=%{time_connect}s tls=%{time_appconnect}s first_byte=%{time_starttransfer}s total=%{time_total}s\n" https://example.com/

For the proxy check, create a private local proxy-test.conf containing your endpoint and its authentication. The values below are placeholders, not a working proxy. Do not share the completed file or commit it to a repository.

proxy = "http://proxy.example.com:3128"
proxy-user = "USERNAME:PASSWORD"
noproxy = ""

For source-IP authorization, omit proxy-user and confirm the public outgoing IP of this machine is authorized. The example uses an HTTP proxy carrying an HTTPS destination; it is not a SOCKS5 command.

Proxy check:

curl --disable --config proxy-test.conf --connect-timeout 5 --max-time 15 --silent --show-error --output proxy-response.txt --write-out "http=%{http_code} connect=%{http_connect} tcp=%{time_connect}s tls=%{time_appconnect}s first_byte=%{time_starttransfer}s total=%{time_total}s\n" https://example.com/

Both commands ignore the default cURL configuration and do not enable redirects or retries. The explicit proxy bypass settings prevent environment NO_PROXY settings from changing the intended comparison. Credentials stay in the local configuration file. Restrict access to that file and remove it when it is no longer needed.

Record cURL's process exit code immediately after each command: $LASTEXITCODE in PowerShell, or $? in a POSIX shell. The output does not print real endpoint addresses or credentials; review and redact response files and error messages before sharing them.

Interpret the codes using the official cURL error reference, together with the write-out documentation:

Observation What it establishes Next check
cURL exit 28 A configured deadline was reached; this alone does not identify the failing component. Compare the direct result, connection/handshake timings, destination and application deadline.
cURL exit 5, 6 or 7 A name could not be resolved or a connection could not be established, depending on the exact exit code. Read the error message and verify the proxy host, destination host, port and network path.
CONNECT response 407 The HTTP proxy requested or rejected authentication before establishing the tunnel. Check credentials, accepted authentication method and source-IP authorization.
cURL exit 35 or 60 A TLS handshake or certificate-verification error occurred. Check the hostname, certificate trust, system clock and any inspecting network software; keep certificate verification enabled.
cURL exit 0, CONNECT response 200, destination HTTP 403 or 429 The transfer completed through the tunnel with an HTTP rejection or rate-limit response, rather than a transfer timeout. Identify the responding system and review its access or rate-limit requirements before another request.
cURL exit 0, destination HTTP 200 The transfer completed with HTTP 200; the body still needs validation. Check the response content. If it is correct but the application fails, compare that application's proxy, protocol and timeout configuration.
Both checks fail This pair does not isolate a proxy-only fault. Check the common destination and client network first; compare one other small authorized destination if appropriate.

Timings are cumulative milestones measured from the start of each transfer. With this HTTP proxy, TCP refers to the connection to the proxy; the TLS timing also includes the earlier connection and tunnel setup. Zero timings can mean a milestone was not reached; they do not prove instantaneous completion. HTTP 000 means no final destination status was recorded, not a real HTTP status. CONNECT 000 is expected in the direct check because it does not use an HTTP proxy tunnel. See the TLS timing definition.

Keep the endpoint, destination and client fixed while changing one relevant setting. Do not treat a timeout as proof that credentials are invalid or that the proxy is unusable for every destination. For a fuller explanation of cURL stages and errors, continue with cURL proxy errors and same-device proxy checks.

FAQ

Is every timeout a bad proxy?

No. The destination website, route, DNS, TLS handshake or client timeout settings can also cause it.

What timeout should I use?

Use a short connect timeout and a longer total timeout, then tune based on the target website.

Should I retry timeouts?

Yes, but use controlled retries with backoff so the workflow does not make the problem worse.

Scroll to Top