"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo cerrar correctamente un servidor HTTP después de devolver una respuesta?

¿Cómo cerrar correctamente un servidor HTTP después de devolver una respuesta?

Publicado el 2024-11-07
Navegar:110

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

Apagando el servidor HTTP después de devolver la respuesta

Estás desarrollando un bot de línea de comandos que interactúa con la API de Instagram usando OAuth, que no está optimizado para la línea de comandos aplicaciones. Para superar esto, ha configurado un servidor HTTP local como URI de redireccionamiento para la autorización. Después de que el usuario autoriza la aplicación y es redirigido al servidor, le gustaría apagar el servidor una vez que se haya mostrado el token de acceso.

Encontró un problema al implementar el mecanismo de apagado. Específicamente, llamar a srv.Shutdown(nil) en el controlador de solicitudes (showTokenToUser) genera un error:

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

Solución

El problema surge porque usted están llamando a srv.Shutdown(nil) varias veces:

  1. En showTokenToUser controlador, donde se encuentra dentro de un cierre.
  2. Después de que el controlador finaliza la ejecución en la función principal.

Llamar a srv.Shutdown mientras el servidor aún está escuchando conexiones genera una carrera condición. La rutina ListenAndServe() intenta cerrar los oyentes abiertos y las conexiones inactivas, pero es interrumpida por la llamada posterior a Shutdown en el cierre del controlador. Esta inconsistencia del estado desencadena el pánico.

Para resolver este problema, puede utilizar uno de dos métodos:

1. Utilice context.WithCancel:

En este enfoque, crea un context.Context con una función de cancelación. El contexto se pasa a la rutina ListenAndServe y a la función de controlador showTokenToUser. Dentro del controlador, cuando el token de acceso se ha mostrado al usuario, se llama a la función cancelar para finalizar el contexto. La rutina ListenAndServe cerrará correctamente el servidor cuando se cancele el contexto.

2. Utilice el mismo contexto:

En lugar de llamar a context.WithCancel, puede pasar el mismo contexto.Context a la rutina ListenAndServe y a la función de controlador. Cuando se muestra el token de acceso, llama a cancel() en el contexto, lo que activará el cierre tanto del controlador como de la rutina ListenAndServe.

Después de implementar cualquiera de los enfoques, recuerde esperar la función srv.Shutdown completar antes de salir del programa.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3