package main import ( "fmt" "io" "log" "net/http" "os" "strings" ) const ( MethodPurge = "PURGE" ) var ( varnishList = MakeVarnishList() ) // MakeVarnishList reads the list of varnish servers from a file on disk. func MakeVarnishList() []string { Data, err := os.ReadFile("./varnish") if err != nil { log.Fatal(err) } sliceData := strings.Split(string(Data), ",") return sliceData } // PurgeHandler handles PURGE request to broadcast it to all varnish instances. func PurgeHandler(w http.ResponseWriter, r *http.Request) { var resp http.Response url := r.URL.String() SendToVarnish(url) io.WriteString(w, resp.Status) } func SendToVarnish(url string) int { var status int var respListStatus []string // Take url to ban as argument. // Loop over the list of Varnish servers and send PURGE request to each. for i := 0; i < len(varnishList); i++ { client := &http.Client{} domain := strings.Trim(varnishList[i], "\r\n") req, err := http.NewRequest(MethodPurge, domain + url, nil) //fmt.Printf("Request: %v",req) if err != nil { log.Fatal("NewRquest: %s", err) } resp, err := client.Do(req) if err != nil { log.Fatal("Client.do: %s", err) } fmt.Printf("Resp: %v\n", resp) respListStatus = append(respListStatus, resp.Status) } fmt.Println(respListStatus) return status } func main() { http.HandleFunc("/", PurgeHandler) log.Fatal(http.ListenAndServe(":6081",nil)) }