Skip to content

Commit a8a8dc0

Browse files
committed
Add Go 1.8 TLS tracing support & refactor timing code
To have accurate measurement of TLS and support skipped steps (DNS, TCP and TLS reuse), the timing code has been refactored to use Go 1.8 support for TLS tracing as well as a more descriptive variable namings for steps time. This commit removes support for Go versions lower than 1.8.
1 parent 0db7dd0 commit a8a8dc0

File tree

2 files changed

+44
-33
lines changed

2 files changed

+44
-33
lines changed

.travis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
language: go
22
go_import_path: github.com/davecheney/httpstat
33
go:
4-
- 1.7.x
5-
- 1.8.x
6-
- 1.9.x
4+
- "1.8.x"
5+
- "1.9.x"
6+
- "1.10.x"
77

88
os:
99
- linux

main.go

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -202,27 +202,30 @@ func headerKeyValue(h string) (string, string) {
202202
func visit(url *url.URL) {
203203
req := newRequest(httpMethod, url, postBody)
204204

205-
var t0, t1, t2, t3, t4 time.Time
205+
var tStart, tDNSStart, tDNSEnd, tConnectStart, tConnectEnd, tTLSStart, tTLSEnd, tConnected, tTTBF, tDone time.Time
206206

207207
trace := &httptrace.ClientTrace{
208-
DNSStart: func(_ httptrace.DNSStartInfo) { t0 = time.Now() },
209-
DNSDone: func(_ httptrace.DNSDoneInfo) { t1 = time.Now() },
208+
GetConn: func(_ string) { tStart = time.Now() },
209+
DNSStart: func(_ httptrace.DNSStartInfo) { tDNSStart = time.Now() },
210+
DNSDone: func(_ httptrace.DNSDoneInfo) { tDNSEnd = time.Now() },
210211
ConnectStart: func(_, _ string) {
211-
if t1.IsZero() {
212+
if tConnectStart.IsZero() {
212213
// connecting to IP
213-
t1 = time.Now()
214+
tConnectStart = time.Now()
214215
}
215216
},
216217
ConnectDone: func(net, addr string, err error) {
217218
if err != nil {
218219
log.Fatalf("unable to connect to host %v: %v", addr, err)
219220
}
220-
t2 = time.Now()
221+
tConnectEnd = time.Now()
221222

222223
printf("\n%s%s\n", color.GreenString("Connected to "), color.CyanString(addr))
223224
},
224-
GotConn: func(_ httptrace.GotConnInfo) { t3 = time.Now() },
225-
GotFirstResponseByte: func() { t4 = time.Now() },
225+
TLSHandshakeStart: func() { tTLSStart = time.Now() },
226+
TLSHandshakeDone: func(_ tls.ConnectionState, _ error) { tTLSEnd = time.Now() },
227+
GotConn: func(_ httptrace.GotConnInfo) { tConnected = time.Now() },
228+
GotFirstResponseByte: func() { tTTBF = time.Now() },
226229
}
227230
req = req.WithContext(httptrace.WithClientTrace(context.Background(), trace))
228231

@@ -272,10 +275,18 @@ func visit(url *url.URL) {
272275
bodyMsg := readResponseBody(req, resp)
273276
resp.Body.Close()
274277

275-
t5 := time.Now() // after read body
276-
if t0.IsZero() {
277-
// we skipped DNS
278-
t0 = t1
278+
tDone = time.Now() // after read body
279+
if tDNSStart.IsZero() {
280+
tDNSStart = tStart
281+
tDNSEnd = tStart
282+
}
283+
if tConnectStart.IsZero() {
284+
tConnectStart = tStart
285+
tConnectEnd = tStart
286+
}
287+
if tTLSStart.IsZero() {
288+
tTLSStart = tStart
289+
tTLSEnd = tStart
279290
}
280291

281292
// print status line and headers
@@ -313,27 +324,27 @@ func visit(url *url.URL) {
313324
switch url.Scheme {
314325
case "https":
315326
printf(colorize(HTTPSTemplate),
316-
fmta(t1.Sub(t0)), // dns lookup
317-
fmta(t2.Sub(t1)), // tcp connection
318-
fmta(t3.Sub(t2)), // tls handshake
319-
fmta(t4.Sub(t3)), // server processing
320-
fmta(t5.Sub(t4)), // content transfer
321-
fmtb(t1.Sub(t0)), // namelookup
322-
fmtb(t2.Sub(t0)), // connect
323-
fmtb(t3.Sub(t0)), // pretransfer
324-
fmtb(t4.Sub(t0)), // starttransfer
325-
fmtb(t5.Sub(t0)), // total
327+
fmta(tDNSEnd.Sub(tDNSStart)), // dns lookup
328+
fmta(tConnectEnd.Sub(tConnectStart)), // tcp connection
329+
fmta(tTLSEnd.Sub(tTLSStart)), // tls handshake
330+
fmta(tTTBF.Sub(tConnected)), // server processing
331+
fmta(tDone.Sub(tTTBF)), // content transfer
332+
fmtb(tDNSEnd.Sub(tStart)), // namelookup
333+
fmtb(tConnectEnd.Sub(tStart)), // connect
334+
fmtb(tConnected.Sub(tStart)), // pretransfer
335+
fmtb(tTTBF.Sub(tStart)), // starttransfer
336+
fmtb(tDone.Sub(tStart)), // total
326337
)
327338
case "http":
328339
printf(colorize(HTTPTemplate),
329-
fmta(t1.Sub(t0)), // dns lookup
330-
fmta(t3.Sub(t1)), // tcp connection
331-
fmta(t4.Sub(t3)), // server processing
332-
fmta(t5.Sub(t4)), // content transfer
333-
fmtb(t1.Sub(t0)), // namelookup
334-
fmtb(t3.Sub(t0)), // connect
335-
fmtb(t4.Sub(t0)), // starttransfer
336-
fmtb(t5.Sub(t0)), // total
340+
fmta(tDNSEnd.Sub(tDNSStart)), // dns lookup
341+
fmta(tConnectEnd.Sub(tConnectStart)), // tcp connection
342+
fmta(tTTBF.Sub(tConnected)), // server processing
343+
fmta(tDone.Sub(tTTBF)), // content transfer
344+
fmtb(tDNSEnd.Sub(tStart)), // namelookup
345+
fmtb(tConnectEnd.Sub(tStart)), // connect
346+
fmtb(tTTBF.Sub(tStart)), // starttransfer
347+
fmtb(tDone.Sub(tStart)), // total
337348
)
338349
}
339350

0 commit comments

Comments
 (0)