Supongamos que ingreso una URL en mi navegador y el navegador envía la solicitud HTTP. El servidor HTTP remoto acepta la solicitud e inicia una tarea larga para atender la solicitud.
Si termino la solicitud antes de que se complete (por ejemplo, presiono Esc o en Firefox), ¿cómo se cierra la solicitud? ¿El navegador comunicará esta solicitud de cancelación al servidor (creo que no es así)?
Suponiendo que no, al finalizar la larga tarea, ¿qué hará el servidor con el resultado? ¿Lo devuelve de todos modos? Si es así, ¿qué pasará? ¿Llega hasta mi PC? ¿O se pierde en el camino?
Esto es sólo por mi curiosidad.
Gracias por tu tiempo :)
Respuesta1
Bueno, todo depende de lo que esté haciendo el servidor. Normalmente, no "detectará" la solicitud terminada hasta que se intente realizar un envío. En ese punto, el script recibirá un mensaje user_abort del servidor web (en php, puede indicarle que ignore los abortos del usuario con ignore_user_abort(true);
). Sin intentar enviar datos al cliente, el servidor no tiene forma de saber que la solicitud fue abortada.
Cuando intenta enviar la solicitud a la conexión TCP cerrada, lo que sucede depende completamente del software del servidor. Apache funciona así: si los datos enviados aún permanecen mientras se procesa un script dinámico, le informará al script sobre el aborto y le permitirá manejarlo como quiera (PHP, por defecto, finaliza). Si el script finaliza, o es una solicitud de archivo estático, simplemente ignorará la conexión cerrada y regresará.
Respuesta2
Creo que hay que pensar en algo así como la electricidad. cargar. cuando finaliza alguna conexión, los datos que se envían son un cargo, simplemente desaparecen ya que no hay una toma de escucha disponible para esa transferencia en particular. Sólo si hay un enchufe, se produce alguna comunicación.
Ejemplo:
Pulsamos http://localhost
para apache2 httpd. Supongamos que no está funcionando. El navegador abre un socket, envía un mensaje al puerto 80 (predeterminado) y busca si hay alguna respuesta. Como no hay ningún oyente porque Apache no se está ejecutando, esta solicitud de ping no obtiene ninguna respuesta. al menos 200 ok o cualquier tipo de apretón de manos. Entonces ¿qué pasa con nuestro ping? http envía algo: como GET http://localhost 80
... etc. ¿Qué pasa con esta línea? GET http://localhost 80
? es solo un cargo y desaparece.
Esta es sólo mi creencia, y primero deberíamos referirnos atcppara mayor claridad. Sólo entonces podremos entender cómo se comporta el protocolo de Internet y el posterior http. En última instancia, parece que no existe una definición concreta para una solicitud http finalizada prematuramente. Por eso se llama terminación prematura.