#!/usr/bin/perl use HTTP::Proxy; use HTTP::Proxy::HeaderFilter::simple; use Digest::MD5 qw(md5_hex); my $proxy = HTTP::Proxy->new( port => 3128 ); my $filter = HTTP::Proxy::HeaderFilter::simple->new( sub { my ($self, $headers, $request) = @_; my $uri = $request->uri(); my $cache_path = md5_hex($uri); # (depending on the file system being used, you might want to # have the cache files spread across several directory levels; # you'd of course need to have stored them that way in the first place...) substr($cache_path, $_, 0) = "/" for (2,5,8); # prepend base path $cache_path = "/path/to/cache/$cache_path"; # debug printf "URI = %s\n", $uri; printf "host = %s\n", $uri->host(); printf "path = %s\n", $uri->path(); printf "query = %s\n", $uri->query(); printf "cache_path = %s\n", $cache_path; if (-s $cache_path) { # is it in the cache? # this would of course be the content read from the cache file... my $content = "
...yadda yadda..."; # create response my $res = HTTP::Response->new(200); $res->content_type('text/html'); $res->content($content); # send back (short-circuit normal content fetching) $self->proxy()->response($res); } } ); $proxy->push_filter( request => $filter ); $proxy->start; ####
URI = http://perlmonks.org/?node_id=799308
host = perlmonks.org
path = /
query = node_id=799308
cache_path = /path/to/cache/0c/12/7f/026c96a135e45706194ba5b1f8