package main import ( "encoding/json" "log" "net/http" "os" "strconv" ) type ErrorResponse struct { Message string `json:"message"` StatusCode int `json:"statusCode"` } type SuccessResponse struct { Name string `json:"name"` } func handler(w http.ResponseWriter, r *http.Request) { log.Println("Running handler...") code := getResponseCode(r) w.WriteHeader(code) w.Header().Set("Content-Type", "application/json") if (code != 200) { json.NewEncoder(w).Encode(ErrorResponse{ Message: "There has been an error.", StatusCode: code, }) } else { json.NewEncoder(w).Encode(SuccessResponse{ Name: "Oliver Davies", }) } } func getResponseCode(r *http.Request) int { // If the `force-fail` header is set, get and return its value. if failCode := r.Header.Get("force-fail"); failCode != "" { log.Println("`force-fail` header set...") if code, err := strconv.Atoi(failCode); err == nil { log.Printf("Setting the response code to %d...", code) return code } } return http.StatusOK } func getPort() string { port := os.Getenv("PORT") if port != "" { return port } return "8080" } func main() { http.HandleFunc("/", handler) addr := ":" + getPort() log.Printf("Starting server on %s", addr) if err := http.ListenAndServe(addr, nil); err != nil { log.Fatal(err) } }