init push
This commit is contained in:
79
cmd/healthcheck/main.go
Normal file
79
cmd/healthcheck/main.go
Normal file
@@ -0,0 +1,79 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user