feat(py): step 2 — per-phase latency measurement (phases.py)
Hand-drives raw sockets to time each HTTP phase individually — DNS (getaddrinfo), TCP connect, TLS handshake (ssl.wrap_socket, https only), TTFB (sendall → first recv), Transfer (first byte → EOF), Total. Partial phases are preserved on failure (same invariant as Go's probe.go). Error classification mirrors Go's priority: dns → timeout → tls → connect. Output format matches Go's single-sample text layout. Input: bare URL args or plain-text config file (same format as simple.py). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
15
CHANGELOG.md
15
CHANGELOG.md
@@ -4,6 +4,21 @@ All completed features are logged here in reverse-chronological order.
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-01 12:04 — Per-phase latency measurement (Python, Step 2)
|
||||
|
||||
- `python/phases.py`: self-contained script; hand-drives raw sockets to time
|
||||
each HTTP phase individually — DNS (`getaddrinfo`), TCP connect, TLS handshake
|
||||
(`ssl.wrap_socket`, HTTPS only), TTFB (sendall → first recv), Transfer, Total
|
||||
- Partial phases preserved on failure (same invariant as Go's `probe.go`)
|
||||
- Error classification mirrors Go's priority: dns → timeout → tls → connect
|
||||
- Output format matches Go's single-sample text layout (14-char labels, `─`
|
||||
separator, `%8.2f ms` alignment)
|
||||
- Input: bare URL args or plain-text config file (same format as `simple.py`)
|
||||
- Exits 0 if all URLs complete without network error; 1 if any failed
|
||||
- User doc: `docs/usage/py-phases.md`
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-01 11:30 — Error-path example configs for simple.py (Python, Step 1 refinement)
|
||||
|
||||
- `python/configs/` directory with 7 purpose-built config files, one per error class:
|
||||
|
||||
Reference in New Issue
Block a user