diff options
Diffstat (limited to 'include/nms/web.pm')
-rwxr-xr-x | include/nms/web.pm | 112 |
1 files changed, 0 insertions, 112 deletions
diff --git a/include/nms/web.pm b/include/nms/web.pm deleted file mode 100755 index 7c9339e..0000000 --- a/include/nms/web.pm +++ /dev/null @@ -1,112 +0,0 @@ -#! /usr/bin/perl -# vim:ts=8:sw=8 -use strict; -use warnings; -use utf8; -use DBI; -use Data::Dumper; -use JSON; -use nms; -use Digest::SHA; -use FreezeThaw; -use URI::Escape; -package nms::web; - -use base 'Exporter'; -our %get_params; -our %json; -our @EXPORT = qw(finalize_output now json $dbh db_safe_quote %get_params get_input %json); -our $dbh; -our $now; -our $when; -our %cc; - -sub get_input { - my $in = ""; - while(<STDIN>) { $in .= $_; } - return $in; -} -# Print cache-control from %cc -sub printcc { - my $line = ""; - my $first = ""; - foreach my $tmp (keys(%cc)) { - $line .= $first . $tmp . "=" . $cc{$tmp}; - $first = ", "; - } - print 'Cache-Control: ' . $line . "\n"; -} - -sub db_safe_quote { - my $word = $_[0]; - my $term = $get_params{$word}; - if (!defined($term)) { - if(defined($_[1])) { - $term = $_[1]; - } else { - die "Missing CGI param $word"; - } - } - return $dbh->quote($term) || die; -} - -# returns a valid $when statement -# Also sets cache-control headers if time is overridden -# This can be called explicitly to override the window of time we evaluate. -# Normally up to 15 minutes old data will be returned, but for some API -# endpoints it is better to return no data than old data (e.g.: ping). -sub setwhen { - $now = "now()"; - my $window = '8m'; - my $offset = '0s'; - if (@_ > 0) { - $window = $_[0]; - } - if (@_ > 1) { - $offset = $_[1]; - } - if (defined($get_params{'now'})) { - $now = db_safe_quote('now') . "::timestamp with time zone "; - $cc{'max-age'} = "3600"; - } - $now = "(" . $now . " - '" . $offset . "'::interval)"; - $when = " time > " . $now . " - '".$window."'::interval and time < " . $now . " "; -} - -sub finalize_output { - my $query; - my $hash = Digest::SHA::sha512_base64(FreezeThaw::freeze(%json)); - $dbh->commit; - $query = $dbh->prepare('select extract(epoch from date_trunc(\'seconds\', ' . $now . ')) as time;'); - $query->execute(); - - $json{'time'} = int($query->fetchrow_hashref()->{'time'}); - $json{'hash'} = $hash; - - printcc; - - print "Etag: $hash\n"; - print "Access-Control-Allow-Origin: *\n"; - print "Access-Control-Allow-Methods: HEAD, GET\n"; - print "Content-Type: text/json; charset=utf-8\n\n"; - print JSON::XS::encode_json(\%json); - print "\n"; -} - -sub populate_params { - my $querystring = $ENV{'QUERY_STRING'} || ""; - foreach my $hdr (split("&",$querystring)) { - my ($key, $value) = split("=",$hdr,"2"); - $get_params{$key} = URI::Escape::uri_unescape($value); - } -} - -BEGIN { - $cc{'stale-while-revalidate'} = "3600"; - $cc{'max-age'} = "20"; - - $dbh = nms::db_connect(); - populate_params(); - setwhen(); -} -1; |