From 68aec1d84356729415493b7a2971396807f7bf9b Mon Sep 17 00:00:00 2001
From: Rich Bowen
Wouldn't it be nice, while creating a complex web page, if - the web browser would automatically refresh the page every - time we save a new version from within our editor? - Impossible?
-No! We just combine the MIME multipart feature, the
- web server NPH feature, and the URL manipulation power of
- mod_rewrite
. First, we establish a new
- URL feature: Adding just :refresh
to any
- URL causes the 'page' to be refreshed every time it is
- updated on the filesystem.
RewriteRule ^(/[uge]/[^/]+/?.*):refresh /internal/cgi/apache/nph-refresh?f=$1- - -
Now when we reference the URL
- -
-/u/foo/bar/page.html:refresh
-
this leads to the internal invocation of the URL
- -
-/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html
-
The only missing part is the NPH-CGI script. Although - one would usually say "left as an exercise to the reader" - ;-) I will provide this, too.
- -#!/sw/bin/perl -## -## nph-refresh -- NPH/CGI script for auto refreshing pages -## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved. -## -$| = 1; - -# split the QUERY_STRING variable -@pairs = split( /&/, $ENV{'QUERY_STRING'} ); -foreach $pair (@pairs) { - ( $name, $value ) = split( /=/, $pair ); - $name =~ tr/A-Z/a-z/; - $name = 'QS_' . $name; - $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; - eval "\$$name = \"$value\""; -} -$QS_s = 1 if ( $QS_s eq '' ); -$QS_n = 3600 if ( $QS_n eq '' ); -if ( $QS_f eq '' ) { - print "HTTP/1.0 200 OK\n"; - print "Content-type: text/html\n\n"; - print "<b>ERROR</b>: No file given\n"; - exit(0); -} -if ( !-f $QS_f ) { - print "HTTP/1.0 200 OK\n"; - print "Content-type: text/html\n\n"; - print "<b>ERROR</b>: File $QS_f not found\n"; - exit(0); -} - -sub print_http_headers_multipart_begin { - print "HTTP/1.0 200 OK\n"; - $bound = "ThisRandomString12345"; - print "Content-type: multipart/x-mixed-replace;boundary=$bound\n"; - &print_http_headers_multipart_next; -} - -sub print_http_headers_multipart_next { - print "\n--$bound\n"; -} - -sub print_http_headers_multipart_end { - print "\n--$bound--\n"; -} - -sub displayhtml { - local ($buffer) = @_; - $len = length($buffer); - print "Content-type: text/html\n"; - print "Content-length: $len\n\n"; - print $buffer; -} - -sub readfile { - local ($file) = @_; - local ( *FP, $size, $buffer, $bytes ); - ( $x, $x, $x, $x, $x, $x, $x, $size ) = stat($file); - $size = sprintf( "%d", $size ); - open( FP, "<$file" ); - $bytes = sysread( FP, $buffer, $size ); - close(FP); - return $buffer; -} - -$buffer = &readfile($QS_f); -&print_http_headers_multipart_begin; -&displayhtml($buffer); - -sub mystat { - local ($file) = $_[0]; - local ($time); - - ( $x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime ) = stat($file); - return $mtime; -} - -$mtimeL = &mystat($QS_f); -$mtime = $mtime; -for ( $n = 0 ; $n & lt ; $QS_n ; $n++ ) { - while (1) { - $mtime = &mystat($QS_f); - if ( $mtime ne $mtimeL ) { - $mtimeL = $mtime; - sleep(2); - $buffer = &readfile($QS_f); - &print_http_headers_multipart_next; - &displayhtml($buffer); - sleep(5); - $mtimeL = &mystat($QS_f); - last; - } - sleep($QS_s); - } -} - -&print_http_headers_multipart_end; - -exit(0); - -##EOF##- -