diff options
author | Rich Bowen <rbowen@apache.org> | 2009-11-13 13:38:55 +0100 |
---|---|---|
committer | Rich Bowen <rbowen@apache.org> | 2009-11-13 13:38:55 +0100 |
commit | 95a33e73d010305928f38cf85470a86e032518a5 (patch) | |
tree | e4cb5ae3d8a1eb54c4828be284670fab453184af /docs/manual/rewrite/advanced.xml | |
parent | Removes an inscrutable recipe - I don't know what problem it's trying to (diff) | |
download | apache2-95a33e73d010305928f38cf85470a86e032518a5.tar.xz apache2-95a33e73d010305928f38cf85470a86e032518a5.zip |
This is a really cool example, and I don't want to lose it. However, I'm
reasonably sure that there's easier ways to do this, and I'm not yet
sure that the example given actually works. Need to revisit this soon.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@835826 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'docs/manual/rewrite/advanced.xml')
-rw-r--r-- | docs/manual/rewrite/advanced.xml | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/docs/manual/rewrite/advanced.xml b/docs/manual/rewrite/advanced.xml index 4446eb2bd9..86fe6abace 100644 --- a/docs/manual/rewrite/advanced.xml +++ b/docs/manual/rewrite/advanced.xml @@ -191,6 +191,156 @@ featureful than anything you can cobble together using mod_rewrite.</p> </section> +<section id="autorefresh"> + <title>Document With Autorefresh</title> + + <dl> + <dt>Description:</dt> + + <dd> + <p>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?</p> + </dd> + + <dt>Solution:</dt> + + <dd> + <p>No! We just combine the MIME multipart feature, the + web server NPH feature, and the URL manipulation power of + <module>mod_rewrite</module>. First, we establish a new + URL feature: Adding just <code>:refresh</code> to any + URL causes the 'page' to be refreshed every time it is + updated on the filesystem.</p> + +<example><pre> +RewriteRule ^(/[uge]/[^/]+/?.*):refresh /internal/cgi/apache/nph-refresh?f=$1 +</pre></example> + + <p>Now when we reference the URL</p> + +<example><pre> +/u/foo/bar/page.html:refresh +</pre></example> + + <p>this leads to the internal invocation of the URL</p> + +<example><pre> +/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html +</pre></example> + + <p>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.</p> + +<example><pre> +#!/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 "&lt;b&gt;ERROR&lt;/b&gt;: 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 "&lt;b&gt;ERROR&lt;/b&gt;: 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, "&lt;$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## +</pre></example> + </dd> + </dl> + +</section> </manualpage> |