O que acontece quando uma solicitação HTTP é encerrada prematuramente?

13

Suponha que eu insira uma URL no meu navegador e o navegador envie a solicitação HTTP. O servidor HTTP remoto aceita a solicitação e inicia uma tarefa longa para atender à solicitação.

Se eu encerrar a solicitação antes que ela seja concluída (por exemplo, pressione Esc ou no Firefox), como a solicitação é encerrada? O navegador comunicará essa solicitação de cancelamento ao servidor (acho que não)?

Presumindo que não, após a conclusão da tarefa longa, o que o servidor fará com o resultado? Ele envia de volta mesmo assim? Se isso acontecer, o que acontecerá? Chega até o meu PC? Ou se perde no caminho?

Isto é apenas para minha curiosidade.

Obrigado pelo seu tempo :)

Gowtham
fonte
2
Você já tentou executar uma captura do wireshark? Facilita a visualização do que um computador envia para outro pela rede.
racyclist

Respostas:

8

Bem, tudo depende do que o servidor está fazendo. Normalmente, ele não "detecta" a solicitação finalizada até que um envio seja tentado. Nesse ponto, o script receberá uma mensagem user_abort do servidor web (em php, você pode dizer para ele ignorar o usuário que interrompe ignore_user_abort(true);). Sem tentar enviar dados para o cliente, não há como o servidor saber que a solicitação foi abortada.

Quando ele tenta enviar a solicitação para a conexão TCP fechada, o que acontece depende completamente do software do servidor. O Apache funciona assim: Se os dados enviados ainda estiverem sendo processados ​​por um script dinâmico, ele informará o script sobre a interrupção e permitirá que ele lide com ele da maneira que desejar (o PHP - por padrão - termina). Se o script estiver pronto ou for uma solicitação de arquivo estático, ele simplesmente ignorará a conexão fechada e retornará.

ircmaxell
fonte
-2

Eu acho que é para ser pensado no tipo de coisa de eletricidade. carregar. quando alguma conexão termina, os dados enviados são cobrados, apenas desaparecem, pois não há soquete de escuta disponível para essa transferência específica. somente se houver um soquete, alguma comunicação acontece.

Exemplo:

Nós batemos http://localhostpara apache2 httpd. suponha que não esteja em execução. O navegador abre um soquete, envia uma mensagem para a porta 80 (padrão) e verifica se há alguma resposta. Como não há ouvinte, pois o apache não está em execução, essa solicitação de ping não obtém nenhuma resposta. pelo menos 200 ok ou qualquer tipo de aperto de mão. então o que acontece com o nosso ping? http envia alguma coisa: como GET http://localhost 80... etc. o que acontece com esta linha? GET http://localhost 80? é apenas uma carga e desaparece.

Esta é apenas a minha opinião, e devemos primeiro consultar o TCP para obter mais clareza. Somente então, podemos entender como o protocolo da Internet e o http subsequente se comportam. Por fim, parece que não existe uma definição concreta para uma solicitação HTTP finalizada prematura. É por isso que é chamado encerramento prematuro.

Siva Tumma
fonte
1
Embora poético, talvez, isso seja inexato e não seja uma maneira particularmente útil de considerar o impacto disso.
Falcon Momot 28/12/13