X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=www%2Fanalysis.pl;h=96226231312afd2db7a739d4ab05c8de5f9cd620;hp=9b45cc77870df40f804ef244eb1c3db1445fcedc;hb=0647de73921822fe0a3612bd36e430355176ddd8;hpb=cdb5cb80047a5a852bf9ba64fb14aa5bc5ef84d5 diff --git a/www/analysis.pl b/www/analysis.pl index 9b45cc7..9622623 100755 --- a/www/analysis.pl +++ b/www/analysis.pl @@ -1,17 +1,17 @@ #! /usr/bin/perl use CGI; -use POSIX; -use Date::Manip; use Linux::Inotify2; use AnyEvent; use strict; use warnings; +our $json_filename = "/srv/analysis.sesse.net/www/analysis.json"; + my $cv = AnyEvent->condvar; my $updated = 0; my $cgi = CGI->new; my $inotify = Linux::Inotify2->new; -$inotify->watch("/srv/analysis.sesse.net/analysis.json", IN_MODIFY, sub { +$inotify->watch($json_filename, IN_MODIFY, sub { $updated = 1; $cv->send; }); @@ -24,13 +24,13 @@ my $wait = AnyEvent->timer ( cb => sub { $cv->send; }, ); +# Yes, this is reinventing If-Modified-Since, but browsers are so incredibly +# unpredictable on this, so blargh. my $ims = 0; -if (exists($ENV{'HTTP_IF_MODIFIED_SINCE'})) { - my $date = Date::Manip::Date->new; - $date->parse($ENV{'HTTP_IF_MODIFIED_SINCE'}); - $ims = $date->printf("%s"); +if (defined($cgi->param('ims')) && $cgi->param('ims') ne '') { + $ims = $cgi->param('ims'); } -my $time = (stat("/srv/analysis.sesse.net/analysis.json"))[9]; +my $time = (stat($json_filename))[9]; # If we have something that's modified since IMS, send it out at once if ($time > $ims) { @@ -38,26 +38,25 @@ if ($time > $ims) { exit; } -# If not, wait, then send. Apache will deal with the 304-ing. -if (defined($cgi->param('first')) && $cgi->param('first') != 1) { - $cv->recv; -} +# If not, wait, then send. +$cv->recv; output(); sub output { - my $time = (stat("/srv/analysis.sesse.net/analysis.json"))[9]; - my $lm_str = POSIX::strftime("%a, %d %b %Y %H:%M:%S %z", localtime($time)); - - print CGI->header(-type=>'text/json', - -last_modified=>$lm_str, - -access_control_allow_origin=>'http://analysis.sesse.net', - -expires=>'now'); - open my $fh, "<", "/srv/analysis.sesse.net/analysis.json" - or die "/srv/analysis.sesse.net/analysis.json: $!"; + open my $fh, "<", $json_filename + or die "$json_filename: $!"; my $data; { local $/ = undef; $data = <$fh>; } + my $time = (stat($fh))[9]; + close $fh; + + print CGI->header(-type=>'text/json', + -x_remoteglot_last_modified=>$time, + -access_control_allow_origin=>'http://analysis.sesse.net', + -access_control_expose_headers=>'X-Remoteglot-Last-Modified', + -expires=>'now'); print $data; }