80 lines
1.5 KiB
Go
80 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"net"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
defaultTarget = "http://127.0.0.1:8080/health"
|
|
timeout = 2 * time.Second
|
|
)
|
|
|
|
func main() {
|
|
target := strings.TrimSpace(os.Getenv("HEALTHCHECK_URL"))
|
|
if target == "" {
|
|
target = defaultTarget
|
|
}
|
|
if len(os.Args) > 1 {
|
|
if arg := strings.TrimSpace(os.Args[1]); arg != "" {
|
|
target = arg
|
|
}
|
|
}
|
|
|
|
addr, path, ok := splitTarget(target)
|
|
if !ok {
|
|
os.Exit(1)
|
|
}
|
|
|
|
conn, err := net.DialTimeout("tcp", addr, timeout)
|
|
if err != nil {
|
|
os.Exit(1)
|
|
}
|
|
defer conn.Close()
|
|
|
|
_ = conn.SetDeadline(time.Now().Add(timeout))
|
|
request := "GET " + path + " HTTP/1.1\r\nHost: " + addr + "\r\nConnection: close\r\n\r\n"
|
|
if _, err := conn.Write([]byte(request)); err != nil {
|
|
os.Exit(1)
|
|
}
|
|
|
|
line, err := bufio.NewReader(conn).ReadString('\n')
|
|
if err != nil {
|
|
os.Exit(1)
|
|
}
|
|
|
|
fields := strings.Fields(line)
|
|
if len(fields) < 2 {
|
|
os.Exit(1)
|
|
}
|
|
|
|
code := fields[1]
|
|
if len(code) != 3 || (code[0] != '2' && code[0] != '3') {
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func splitTarget(target string) (string, string, bool) {
|
|
target = strings.TrimSpace(target)
|
|
if target == "" || strings.HasPrefix(target, "https://") {
|
|
return "", "", false
|
|
}
|
|
|
|
target = strings.TrimPrefix(target, "http://")
|
|
addr := target
|
|
path := "/"
|
|
if slash := strings.IndexByte(target, '/'); slash >= 0 {
|
|
addr = target[:slash]
|
|
path = target[slash:]
|
|
}
|
|
|
|
if addr == "" || !strings.Contains(addr, ":") {
|
|
return "", "", false
|
|
}
|
|
|
|
return addr, path, true
|
|
}
|