"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment arrêter progressivement un serveur HTTP après avoir renvoyé une réponse ?

Comment arrêter progressivement un serveur HTTP après avoir renvoyé une réponse ?

Publié le 2024-11-07
Parcourir:647

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

Arrêter le serveur HTTP après avoir renvoyé une réponse

Vous développez un robot en ligne de commande qui interagit avec l'API Instagram à l'aide d'OAuth, qui n'est pas optimisé pour la ligne de commande candidatures. Pour surmonter ce problème, vous avez configuré un serveur HTTP local comme URI de redirection pour l'autorisation. Une fois que l'utilisateur a autorisé l'application et est redirigé vers le serveur, vous souhaitez arrêter le serveur une fois le jeton d'accès affiché.

Vous avez rencontré un problème lors de la mise en œuvre du mécanisme d'arrêt. Plus précisément, l'appel de srv.Shutdown(nil) dans le gestionnaire de requêtes (showTokenToUser) entraîne une erreur :

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

Solution

Le problème se pose parce que vous appellent srv.Shutdown(nil) plusieurs fois :

  1. Dans le gestionnaire showTokenToUser, où il se trouve dans une fermeture.
  2. Une fois l'exécution du gestionnaire terminée dans la fonction principale.

Appeler srv.Shutdown alors que le serveur est toujours à l'écoute des connexions entraîne une condition de concurrence critique. La goroutine ListenAndServe() tente de fermer les écouteurs ouverts et les connexions inactives, mais elle est interrompue par l'appel ultérieur à Shutdown lors de la fermeture du gestionnaire. Cette incohérence d'état déclenche la panique.

Pour résoudre ce problème, vous pouvez utiliser l'une des deux méthodes suivantes :

1. Utilisez context.WithCancel :

Dans cette approche, vous créez un context.Context avec une fonction d'annulation. Le contexte est transmis à la goroutine ListenAndServe et à la fonction de gestionnaire showTokenToUser. À l'intérieur du gestionnaire, lorsque le jeton d'accès a été affiché à l'utilisateur, vous appelez la fonction d'annulation pour mettre fin au contexte. La goroutine ListenAndServe arrêtera progressivement le serveur lorsque le contexte sera annulé.

2. Utilisez le même Context:

Au lieu d'appeler context.WithCancel, vous pouvez transmettre le même context.Context à la goroutine ListenAndServe et à la fonction de gestionnaire. Lorsque le jeton d'accès est affiché, vous appelez Cancel() sur le contexte, ce qui déclenchera l'arrêt du gestionnaire et de la goroutine ListenAndServe.

Après avoir implémenté l'une ou l'autre approche, n'oubliez pas d'attendre la fonction srv.Shutdown à terminer avant de quitter le programme.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3