55 "fmt"
66 "io"
77 "io/ioutil"
8+ "net"
89 "net/http"
10+ "net/http/httptrace"
911 "time"
1012)
1113
@@ -47,15 +49,15 @@ func (ping *HTTPing) Start() <-chan struct{} {
4749 ping .Stop ()
4850 return
4951 }
50- duration , resp , err := ping .ping ()
52+ duration , resp , remoteAddr , err := ping .ping ()
5153 ping .result .Counter ++
5254
5355 if err != nil {
5456 fmt .Printf ("Ping %s - failed: %s\n " , ping .target , err )
5557 } else {
5658 defer resp .Body .Close ()
5759 length , _ := io .Copy (ioutil .Discard , resp .Body )
58- fmt .Printf ("Ping %s - %s is open - time=%s method=%s status=%d bytes=%d\n " , ping .target , ping .target .Protocol , duration , ping .Method , resp .StatusCode , length )
60+ fmt .Printf ("Ping %s(%s) - %s is open - time=%s method=%s status=%d bytes=%d\n " , ping .target , remoteAddr , ping .target .Protocol , duration , ping .Method , resp .StatusCode , length )
5961 if ping .result .MinDuration == 0 {
6062 ping .result .MinDuration = duration
6163 }
@@ -88,7 +90,7 @@ func (ping *HTTPing) Stop() {
8890 ping .done <- struct {}{}
8991}
9092
91- func (ping HTTPing ) ping () (time.Duration , * http.Response , error ) {
93+ func (ping HTTPing ) ping () (time.Duration , * http.Response , net. Addr , error ) {
9294 var resp * http.Response
9395 var body io.Reader
9496 if ping .Method == "POST" {
@@ -97,17 +99,23 @@ func (ping HTTPing) ping() (time.Duration, *http.Response, error) {
9799 req , err := http .NewRequest (ping .Method , ping .target .String (), body )
98100 req .Header .Set (http .CanonicalHeaderKey ("User-Agent" ), "tcping" )
99101 if err != nil {
100- return 0 , nil , err
102+ return 0 , nil , nil , err
101103 }
102-
104+ var remoteAddr net.Addr
105+ trace := & httptrace.ClientTrace {
106+ GotConn : func (connInfo httptrace.GotConnInfo ) {
107+ remoteAddr = connInfo .Conn .RemoteAddr ()
108+ },
109+ }
110+ req = req .WithContext (httptrace .WithClientTrace (req .Context (), trace ))
103111 duration , errIfce := timeIt (func () interface {} {
104112 client := http.Client {Timeout : ping .target .Timeout }
105113 resp , err = client .Do (req )
106114 return err
107115 })
108116 if errIfce != nil {
109117 err := errIfce .(error )
110- return 0 , nil , err
118+ return 0 , nil , nil , err
111119 }
112- return time .Duration (duration ), resp , nil
120+ return time .Duration (duration ), resp , remoteAddr , nil
113121}
0 commit comments