#!/home/merlyn/bin/perl -Tw use strict; $|++; use LWP::UserAgent; use CGI qw(:standard); use HTTP::Date qw(time2str); ### constants my $BOUNDARY = "ThisRandomString"; my $SLEEPTIME = 30; my $URL_PREFIX = "http://www.kgw.com/images/skycam"; my $CAM_MAP = { 'skycam-1-75.jpg' => 'Vancouver, USA [medium]', 'skycam-2-75.jpg' => 'Portland OMSI Tower [medium]', 'skycam-3-75.jpg' => 'Timberline/Mt. Hood [medium]', 'skycam-4-75.jpg' => 'Cedar Hills [medium]', 'skycam-5-75.jpg' => 'Portland International Airport [medium]', 'skycam-6-75.jpg' => 'Oregon Coast [medium]', 'skycam-8-75.jpg' => 'Salem State Capitol [medium]', 'skycam-9-75.jpg' => 'Newport, Oregon [medium]', }; ### end constants my $nph = $0 =~ /nph-/; my $image = param("image") || ""; unless ($image =~ /^(?!\.)[-\w.]+$/) { print header( -nph => $nph, -date => time2str, "Last-modified" => time2str, -pragma => "no-cache", -expires => '+0d', ); print start_html("Skycams!"), h1("Skycams!"), "\n"; print p("Images are courtesy of", a({-HREF => "http://www.kgw.com/"}, "KGW Television"), " -- check there for more info.", ); print hr, start_form("GET"); print p(submit("get this image:"), popup_menu(-name => "image", "values" => [sort keys %$CAM_MAP], -labels => $CAM_MAP, )); print end_form, hr; exit; } my $AGENT = LWP::UserAgent->new; $AGENT->agent("watcher/0.5"); $AGENT->env_proxy; my $REQUEST = HTTP::Request->new('GET', "$URL_PREFIX/$image"); my $basetime = 0; print header( -nph => $nph, -date => time2str, "Last-modified" => time2str, -pragma => "no-cache", -expires => '+0d', -type => "multipart/x-mixed-replace;boundary=$BOUNDARY", ); print "--$BOUNDARY\n"; { $REQUEST->if_modified_since($basetime); my $response = $AGENT->request($REQUEST); if ($response->is_success) { $basetime = $response->last_modified; print $response->headers_as_string; print "\n"; print $response->content; print "\n--$BOUNDARY\n"; sleep $SLEEPTIME; redo; } elsif ( $response->code == 304 # not changed yet or $response->code == 500 # cannot connect for some reason ) { sleep $SLEEPTIME; redo; } else { die "[" . localtime(time) . "]" . "$0 failure: %d %s\n", $response->code, $response->message; } }