"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como desligar normalmente um servidor HTTP após retornar uma resposta?

Como desligar normalmente um servidor HTTP após retornar uma resposta?

Publicado em 2024-11-07
Navegar:762

How to Gracefully Shut Down an HTTP Server After Returning a Response?

Desligando o servidor HTTP após retornar a resposta

Você está desenvolvendo um bot de linha de comando que interage com a API do Instagram usando OAuth, que não é otimizado para linha de comando aplicações. Para superar isso, você configurou um servidor HTTP local como URI de redirecionamento para autorização. Depois que o usuário autoriza o aplicativo e é redirecionado para o servidor, você deseja encerrar o servidor assim que o token de acesso for exibido.

Você encontrou um problema ao implementar o mecanismo de desligamento. Especificamente, chamar srv.Shutdown(nil) no manipulador de solicitação (showTokenToUser) leva a um erro:

2017/11/23 16:02:03 Httpserver: ListenAndServe() error: http: Server closed
2017/11/23 16:02:03 http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference

Solução

O problema surge porque você estão chamando srv.Shutdown(nil) várias vezes:

  1. No manipulador showTokenToUser, onde está localizado dentro de um encerramento.
  2. Depois que o manipulador termina a execução na função principal.

Chamar srv.Shutdown enquanto o servidor ainda está escutando conexões leva a uma condição de corrida. A goroutine ListenAndServe() tenta fechar os listeners abertos e as conexões inativas, mas é interrompida pela chamada subsequente para Shutdown no fechamento do manipulador. Essa inconsistência de estado desencadeia o pânico.

Para resolver esse problema, você pode usar um dos dois métodos:

1. Use context.WithCancel:

Nesta abordagem, você cria um context.Context com uma função de cancelamento. O contexto é passado para a goroutine ListenAndServe e para a função manipuladora showTokenToUser. Dentro do manipulador, quando o token de acesso for exibido ao usuário, você chama a função cancel para encerrar o contexto. A goroutine ListenAndServe desligará normalmente o servidor quando o contexto for cancelado.

2. Use o mesmo Context:

Em vez de chamar context.WithCancel, você pode passar o mesmo context.Context para a goroutine ListenAndServe e a função manipuladora. Quando o token de acesso é exibido, você chama cancel() no contexto, o que acionará o desligamento do manipulador e da goroutine ListenAndServe.

Após implementar qualquer abordagem, lembre-se de aguardar a função srv.Shutdown para ser concluído antes de sair do programa.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3