Как безопасно отключить службу golang после получения параметров - Лучшие практики - PullRequest
3 голосов
/ 04 мая 2019

Я внедряю сервер, используя golang. Мне нужно выключить сервер после получения ожидаемого параметра «код». Перед выключением сервера мне нужно перенаправить на другую веб-страницу. Я реализовал как дать ниже. Этот код работает. Мне нужно знать, является ли это лучшим способом сделать это? Ваши предложения приветствуются ..

func main() {
    var code string
    const port  int = 8888
    httpPortString := ":" + strconv.Itoa(port)
    mux := http.NewServeMux()
    fmt.Printf("Http Server initialized on Port %s", httpPortString)
    server := http.Server{Addr: httpPortString, Handler: mux}
    var timer *time.Timer
    mux.HandleFunc("/auth", func(w http.ResponseWriter, r *http.Request) {
        err := r.ParseForm()
        if err != nil {
            fmt.Printf("Error parsing the code: %s", err)
        }
        code = r.Form.Get("code")
        if err != nil {
            log.Printf("Error occurred while establishing the server: %s", err)
        }
        http.Redirect(w, r, "https://cloud.google.com/sdk/auth_success", http.StatusMovedPermanently)

        timer = time.NewTimer(2 * time.Second)
        go func() {
            <-timer.C
            server.Shutdown(context.Background())
        }()
    })
    if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        fmt.Printf("Error while establishing the service: %s", err)
    }
    fmt.Println("Finished executing the the service")

}

Спасибо ..!

1 Ответ

1 голос
/ 04 мая 2019

Принимая предложение по очистке @Peter и идеи из приведенного примера здесь :

f, ok := w.(http.Flusher)
if !ok {
    http.Error(w, "no flush support", http.StatusInternalServerError)
    return
}   

http.Redirect(w, r, "https://cloud.google.com/sdk/auth_success", http.StatusSeeOther)

f.Flush() // <-- ensures client gets all writes
          // this is done implicitly on http handler returns, but...
          // we're shutting down the server now!

go func() {
    server.Shutdown(context.Background())
    close(idleConnsClosed)
}()

См. Полную версию игровой площадки для idleConnsClosed настройки / очистки: https://play.golang.org/p/UBmLfyhKT0B


P.S. Не используйте http.StatusMovedPermanently, если вы действительно не хотите, чтобы пользователи никогда больше не использовали исходный URL. Браузеры пользователей будут кэшировать этот (301) код - и не попадать на ваш сервер - что может не соответствовать вашим ожиданиям. Если вы хотите временные перенаправления, используйте http.StatusSeeOther (код 303).

...