Сбой сервера после инструкции return

#go

#Вперед

Вопрос:

У меня есть служба, написанная на Go с использованием net/http пакета.

 http.HandleFunc("/hello", Hello)
log.Fatal(http.ListenAndServe(":8080", nil))
 

пока все хорошо.
Внутри func Hello заглушка кода выглядит следующим образом:

 func Hello(w http.ResponseWriter, r *http.Request) {
    
    c, err := r.Cookie("token")
    if err != nil {
        if err == http.ErrNoCookie {
            // If the cookie is not set, return an unauthorized status
            w.WriteHeader(http.StatusUnauthorized)
            log.WithFields(log.Fields{
                "fnc": "Hello",
            }).Fatal(err)
            return
            //exit status 1 < Server stops here.
        }
        
        w.WriteHeader(http.StatusBadRequest)
        log.WithFields(log.Fields{
            "fnc": "Hello",
        }).Fatal(err)
        return
    }
 

Проблемы возникают, когда поток кода достигает того места, где в запросе не найден файл cookie ErrNoCookie , программа / сервер существует после инструкции return с отображением консоли exit status 1 , а на стороне клиента ошибка принимается как Error: read ECONNRESET

Однако, как служба, я ожидаю, что она продолжит работать и отвечать на последующие запросы.

Что я делаю не так?

Ответ №1:

Вы вызываете это:

 log.WithFields(log.Fields{
"fnc": "Hello",
}).Fatal(err)
 

прямо перед возвратом. И Fatal фактически завершается с кодом 1.
https://godoc.org/github.com/sirupsen/logrus#Fatal

Попробуйте удалить все вызовы Fatal .