Eu tenho um pequeno script CGI escrito em Perl que imprime números de 1 a 10 com intervalo de 1 segundo:
root@debian-s-1vcpu-1gb-fra1-01:~# cat /usr/lib/cgi-bin/test
#!/usr/bin/perl
use strict;
local $|=1;
print "Content-encoding: none\nContent-type: text/plain\n\n";
#print "Content-type: text/plain\n\n";
for ( my $i = 1 ; $i <= 10 ; $i++ ) {
print "$i\n";
sleep(1);
}
root@debian-s-1vcpu-1gb-fra1-01:~#
O script funciona conforme o esperado ao usar curl
:
No entanto, com navegadores da Web (por exemplo, Chromium 88.0.4324.182 ou Firefox 78.13.0esr), a página é carregada por 10 segundos e, em seguida, os números de 1 a 10 são exibidos de uma só vez. Os cabeçalhos de solicitação e resposta de um navegador da Web podem ser vistos abaixo:
Mesmo se eu executar curl
com cabeçalhos de solicitação idênticos ao Firefox
exemplo acima, os números serão impressos com intervalo de 1 segundo como deveriam:
$ curl -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Accept-Encoding:
gzip, deflate' -H 'Accept-Language: en-US,en;q=0.5' -H 'Connection: keep-alive' -H 'Host: 164.90.236.255' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0' -v http://164.90.236.255/cgi-bin/test
* Expire in 0 ms for 6 (transfer 0x55b238016fb0)
* Trying 164.90.236.255...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55b238016fb0)
* Connected to 164.90.236.255 (164.90.236.255) port 80 (#0)
> GET /cgi-bin/test HTTP/1.1
> Host: 164.90.236.255
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
> Accept-Encoding: gzip, deflate
> Accept-Language: en-US,en;q=0.5
> Connection: keep-alive
> Upgrade-Insecure-Requests: 1
> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
>
< HTTP/1.1 200 OK
< Date: Mon, 24 Jan 2022 12:19:56 GMT
< Server: Apache/2.4.25 (Debian)
< Content-encoding: none
< Keep-Alive: timeout=5, max=100
< Connection: Keep-Alive
< Transfer-Encoding: chunked
< Content-Type: text/plain
<
1
2
3
4
5
6
7
8
9
10
* Connection #0 to host 164.90.236.255 left intact
$
O servidor está Apache 2.4.25
com mod_deflate
desabilitado.
O que pode causar tal comportamento? Como desabilitar o buffer de script CGI em navegadores da web? Talvez haja um cabeçalho de resposta que permita controlar esse comportamento.
O que você procura é feito via Ajax normalmente. Os navegadores da Web não se comportam da maneira que você deseja porque, imagine uma página HTML/JS/CSS muito complexa que você precisa renderizar 10 vezes em vez de uma. O navegador não pode saber antecipadamente quais dados o servidor enviará, então eles tentam minimizar a quantidade de trabalho para economizar ciclos de CPU.