This question already has an answer here:
I am serving index.html through go. However, depending upon certain parameters that will be send through the page, go should redirect successfully to a different page. I am getting the below error while trying to execute the code.
http: multiple response.WriteHeader calls
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, r.URL.Path[1:])
fmt.Println(r.FormValue("login"))
if r.FormValue("signup") == "signup" {
signup(w, r)
} else if r.FormValue("login") == "login" {
if login(w, r) {
if r.Method == "POST" {
fmt.Println("I m here")
http.Redirect(w, r, "http://localhost:8080/home.html" (http://localhost:8080/home.html') , http.StatusSeeOther)
}
}
}
})
var port string
if port = os.Getenv("PORT"); len(port) == 0 {
port = DEFAULT_PORT
}
log.Fatal(http.ListenAndServe(":"+port, nil))
}
</div>
As already mentioned in the comments and implied in the error message, you can't change the response header twice:
http.ServeFile(w, r, r.URL.Path[1:])
is called in some point w.WriteHeader(statusCode)
will be called. In other words, an HTTP response will be sent with statusCode
as status code.singup
or http.Redirect
sends an HTTP response after calling w.WriteHeader
.So it is very confusing which response should be sent. You may want to check signup
and login
first and if none then call http.ServeFile
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.FormValue("login"))
switch {
case r.FormValue("signup") == "signup":
signup(w, r)
case r.FormValue("login") == "login" && login(w,r):
if r.Method == "POST" {
fmt.Println("I m here")
http.Redirect(w, r, "http://localhost:8080/home.html" (http://localhost:8080/home.html') , http.StatusSeeOther)
default:
http.ServeFile(w, r, r.URL.Path[1:])
}
})
More about why WriteHeader is warning you about this
from a probably duplicated thread