Maison >développement back-end >Golang >Comment arrêter progressivement un 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, appeler 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
Le problème survient parce que vous appelez srv.Shutdown(nil) plusieurs fois :
Appel 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 gracieusement 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.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!