Namespace Titanium.Web.Proxy.Diagnostics
Classes
ClientTlsTiming
Captures the timing of the client-facing (browser-to-proxy) TLS handshake performed while decrypting an HTTPS tunnel. Only populated when EnableRequestTimingCapture is enabled; otherwise no instance is ever allocated.
HttpRequestTiming
Captures the timing of a single HTTP request/response exchange handled by the proxy. Only populated (non-null on Timing) when EnableRequestTimingCapture is enabled; otherwise no instance is ever allocated and this class has zero impact on request handling.
All timestamps are UTC wall-clock instants captured with UtcNow, in the
order the proxy reaches each stage. The derived Duration/TimeToFirstByte properties
are simple differences between two such instants and are null until both of
their endpoints have been recorded - a session that never reaches a given stage (e.g. one
answered synthetically during BeforeRequest, before any upstream connection is ever
attempted, or one that fails before a response is received) simply leaves the later timestamps
null; nothing throws.
A request that is retried (a new upstream connection after RetryableServerConnectionException,
or a re-request after a 401/407 challenge) overwrites the connection/send/receive timestamps with
those of the latest attempt - AttemptCount tracks how many attempts were made in
total. TotalDuration and ClientRequestReadDuration are unaffected by
retries since they only depend on SessionCreatedAt.
TunnelConnectTiming
Captures CONNECT-phase milestones that dominate cold HTTPS page-load latency: certificate readiness, origin capability discovery (SVCB / HTTP/2 probe), and browser TLS completion. Only allocated when EnableRequestTimingCapture is enabled.
UpstreamConnectionTiming
Captures the timing of establishing a single upstream (server-facing) TCP/TLS connection. Only populated when EnableRequestTimingCapture is enabled; otherwise no instance is ever allocated.
One instance is created per upstream connection, at the moment that connection is first established, and is never mutated afterwards. It is shared by every session that later reuses that same connection from the pool - reachable from any of them via UpstreamConnectionTiming.
Address resolution can return more than one IP address for a hostname; the proxy tries them in order until one connects. The duration properties below reflect only the phases of the address that ultimately succeeded - FailedAddressAttempts tells you how many earlier addresses were tried and failed first.