mirror of
https://github.com/wweir/sower.git
synced 2024-04-21 12:42:15 +00:00
45 lines
970 B
Go
45 lines
970 B
Go
package util
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// HTTPPing try connect to a http server with domain though the http addr
|
|
|
|
func HTTPPing(tcpAddr, domain string, timeout time.Duration) <-chan error {
|
|
errCh := make(chan error)
|
|
go func() {
|
|
errCh <- httpPing(tcpAddr, domain, timeout)
|
|
}()
|
|
return errCh
|
|
}
|
|
|
|
func httpPing(tcpAddr, domain string, timeout time.Duration) error {
|
|
conn, err := net.DialTimeout("tcp", tcpAddr, timeout)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer conn.Close()
|
|
|
|
conn.SetDeadline(time.Now().Add(timeout))
|
|
if _, err = conn.Write(
|
|
[]byte("TRACE / HTTP/1.1\r\nHost: " + domain + "\r\n\r\n")); err != nil {
|
|
return err
|
|
}
|
|
|
|
// err -> nil: read something succ
|
|
// err -> io.EOF: no such domain or connection refused
|
|
// err -> timeout: tcp package has been dropped
|
|
_, err = conn.Read(make([]byte, 1))
|
|
if err == io.EOF {
|
|
idx := strings.Index(tcpAddr, ":")
|
|
if idx >= 0 && tcpAddr[:idx] == domain {
|
|
return nil
|
|
}
|
|
}
|
|
return err
|
|
}
|