Segmenter les réponses AJAX dans perl CGI?

Est-il possible pour un script perl cgi de segmenter ses réponses AJAX dans de nombreuses réponses HTTP individuelles?

Dis ce code:

xmlhttp=new XMLHttpRequest(); xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { onDataReceived(xmlhttp.responseText); } else if(xmlhttp.status!=200 && xmlhttp.status!=0) { } } xmlhttp.open("POST","script.cgi",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send(toURLString(options)); 

En tant que javascript (ne me parle pas des problèmes de compatibilité des objets xml avec ie, je le sais et je m'en fous).

et ça:

 print "Content-type: text/html\n\n"; my %form = Vars(); if($ENV{REQUEST_METHOD} eq "POST" ) { $|=1; for(my $i, (1..100000000)) { print "1\n"; } } 

Comme perl cgi. Est-il possible d'imprimer ce résultat dans de nombreux paquets individuels de 1s, au lieu de générer 100000000 1s avant d'avoir finalement une sortie?

Voir cette question SO pour les approches possibles, mais ce n'est pas spécifique à Perl:

Faire face à la réponse incrémentielle du serveur dans AJAX (en JavaScript)

À partir de l'article Wiki lié, ce lien semble le plus pertinent: http://en.wikipedia.org/wiki/Comet_%28programming%29#XMLHttpRequest

Cependant, je suggérerais fortement d'envisager une approche de vote au lieu de la «poussée du serveur» que vous envisagez :

Le serveur stocke les morceaux de données en tant que fichiers accessibles (avec certaines méta-informations de commande)

 print "Location: xxxx"; # Sorry, forgot the exact form of Location HTTP response. # Location points to URL mapped to /home/htdocs/webdocs/tmp/chunk_0.html my %form = Vars(); if($ENV{REQUEST_METHOD} eq "POST" ) { $|=1; $file_num = 0; my $fh; for(my $i, (1..100000000)) { if ($i % 1000 == 0) { close $fh if $fh; open $fh, ">", "/home/htdocs/webdocs/tmp/chunk_${file_num}.html"; # Add the usual error handling on open/close i'm too lazy to type $file_num++; } print $fh "1\n"; } print $fh "\n##############END_TRANSMISSION__LAST_FILE####################\n"; # This was a singularly dumb way of marking EOF but you get the drift close $fh; } 

Le polisseur AJAX les récupère dans une boucle une par une, en traitant la réponse contenant le morceau suivant et en recherchant la méta-info pour savoir quoi (et si) la prochaine pièce à rechercher est.