A 30-second Playwright timeout does not mean the proxy added 30 seconds. It means the operation missed a configured deadline. The main document may not have connected, may still be transferring, or may have finished while the browser waited for a later lifecycle event. The error alone cannot choose among those cases.
A deadline tells you when the client stopped waiting. Timings tell you where the wait accumulated.
Turn cumulative cURL clocks into phases
The cURL write-out fields are cumulative from the start of the transfer. Subtract adjacent boundaries to get useful intervals. With an explicit proxy, time_connect ends when TCP connects to the remote host or proxy, so the labels describe the path cURL actually opened.
| Phase label | Formula | What the interval contains |
|---|---|---|
| Lookup | time_namelookup | The lookup cURL performed, often the proxy endpoint on a proxied path |
| TCP | time_connect - time_namelookup | TCP setup to the remote host or proxy |
| Negotiation | time_pretransfer - time_connect | Protocol-specific work before transfer, which can include proxy and TLS negotiation |
| First-byte wait | time_starttransfer - time_pretransfer | Request transit, intermediary behavior, edge or cache work, and server processing combined |
| Body | time_total - time_starttransfer | The remainder of the completed transfer |
The first-byte interval is not pure origin compute. A proxy exit can change the network route, cache state, edge location, and origin behavior. Direct minus proxied is only the observed path difference for those matched samples.
Decompose one request, locally.
Paste cURL's cumulative timing values. The worksheet subtracts adjacent clocks so you can see where the recorded time accumulated.
Insufficient evidence. 5 cumulative cURL values are still missing.
Insufficient evidence
Enter all five cumulative cURL values before drawing a timing picture.
Nothing leaves this page. Inputs are calculated in your browser and are not saved, logged, or sent anywhere.
Capture one comparable row
# Apply your normal proxy configuration locally. Keep secrets out of this file.
curl --silent --show-error --output /dev/null \
--write-out $'%{time_namelookup},%{time_connect},%{time_pretransfer},%{time_starttransfer},%{time_total},%{http_connect},%{num_connects},%{num_redirects},%{response_code},%{size_download},%{proxy_used}\n' \
"$TARGET_URL"