Я пытаюсь корректно завершить работу моего HTTP-сервера.Я взял подсказки из поста здесь и настроил свой код следующим образом:
func start() {
//......
//START HTTP/SOCKET LISTENER
if settings.TLS {
httpServer = makeServer("/wss", settings.TLS);
} else {
httpServer = makeServer("/ws", settings.TLS);
}
//...
}
func makeServer(handleDir string, tls bool) (*http.Server) {
server := &http.Server{Addr: settings.IP+":"+strconv.Itoa(settings.Port)}
http.HandleFunc(handleDir, socketInitializer)
if tls {
go func() {
err := server.ListenAndServeTLS(settings.CertFile, settings.PrivKeyFile)
if err != nil {
serverError(err)
}
}()
}else{
go func() {
err := server.ListenAndServe()
if err != nil {
serverError(err)
}
}()
}
//
return server
}
Итак, у меня есть несколько вопросов о том, как все это работает сейчас:
1) Ответ, который я связал выше, гласит: «ПРИМЕЧАНИЕ: есть вероятность, что следующая строка не успеет ...» для обработки ошибок ListenAndServe()
внутри программы.Как я могу убедиться, что serverError()
будет гарантировать завершение?Нужно ли делать какие-то блокировки в этом потоке или создать канал в главном потоке, который он может вызывать?
2) На данный момент я не уверен, есть ли у меня способсообщать, если у меня Server.ShutDown()
http.Server
, или он выдал ошибку и выключился сам.Выдается ли ошибка ListenAndServe()
, даже если я использовал метод Server.ShutDown()
?Вот почему принятый ответ в ссылке использует err != http.ErrServerClosed
при проверке ошибки ListenAndServe()
?
3) Функция start()
(конечно) выполняется в главном потоке.Разве мне не нужно каким-то образом блокировать этот поток, чтобы программа не возвращалась и не выходила, или ListenAndServe()
позаботился об этом для меня?
4) После вызова Server.ShutDown()
нужно ли мнесделать что-нибудь, чтобы отключить http.HandleFunc()
слушателей?
Любая помощь по любой из этих тем будет принята с благодарностью, поэтому не беспокойтесь, если вы не можете затронуть все сразу:)
РЕДАКТИРОВАТЬ: Если кто-то хочет увидеть, как я в итоге все это работает правильно, вы можете посмотреть этот файл , строка 225 и далее.