1#!/usr/bin/perl -w 2use HTTP::Proxy qw( :log ); 3use HTTP::Proxy::BodyFilter::tags; 4use HTTP::Proxy::BodyFilter::simple; 5use HTTP::Proxy::BodyFilter::htmltext; 6use strict; 7 8my $proxy = HTTP::Proxy->new(@ARGV); 9 10$proxy->push_filter( 11 mime => 'text/html', 12 response => HTTP::Proxy::BodyFilter::tags->new, # protect tags 13 response => HTTP::Proxy::BodyFilter::simple->new( # rainbow entities 14 sub { ${ $_[1] } =~ s/(&[#\w]+;)/rainbow($1)/eg; } 15 ), 16 response => HTTP::Proxy::BodyFilter::htmltext->new( # rainbow text 17 sub { s/(\S)/rainbow($1)/eg; } 18 ) 19); 20 21sub rainbow { 22 return sprintf qq{<font color="%s">%s</font>}, next_color(), shift; 23} 24 25# the following code courtesy David 'grinder' Landgren 26# but adapted for our needs 27use constant PI_2 => 3.14159265359 * 2; 28my @PRIMES = qw/11 13 17 19 23 29 31 37 41 43 47 53 59/; 29my $red = rand() * PI_2; 30my $green = rand() * PI_2; 31my $blue = rand() * PI_2; 32my $rdelta = PI_2 / $PRIMES[ rand scalar @PRIMES ]; 33my $gdelta = PI_2 / $PRIMES[ rand scalar @PRIMES ]; 34my $bdelta = PI_2 / $PRIMES[ rand scalar @PRIMES ]; 35my ( $rp, $gp, $bp ) = ( sin $red, sin $green, sin $blue ); 36my ( $rq, $gq, $bq ) = qw/ 0 0 0/; 37my ( $rr, $gr, $br ) = qw/ 0 0 0/; 38 39$proxy->start; 40 41sub next_color { 42 my $rs = sin( $red += $rdelta ); 43 my $rc = $rs * 120 + 120; 44 my $gs = sin( $green += $gdelta ); 45 my $gc = $gs * 120 + 120; 46 my $bs = sin( $blue += $bdelta ); 47 my $bc = $bs * 120 + 120; 48 49 $rq = $rp <=> $rs; 50 $gq = $gp <=> $gs; 51 $bq = $bp <=> $bs; 52 53 $rp = $rs; 54 $gp = $gs; 55 $bp = $bs; 56 57 $rdelta = PI_2 / $PRIMES[ rand scalar @PRIMES ] 58 if ( $rr == 1 and $rq < 1 and $rs < 1 ); 59 $gdelta = PI_2 / $PRIMES[ rand scalar @PRIMES ] 60 if ( $gr == 1 and $gq < 1 and $gs < 1 ); 61 $bdelta = PI_2 / $PRIMES[ rand scalar @PRIMES ] 62 if ( $br == 1 and $bq < 1 and $bs < 1 ); 63 64 $rr = $rq; 65 $gr = $gq; 66 $br = $bq; 67 68 $rc = ( $rc < 0 ) ? 0 : ( $rc > 255 ) ? 255 : $rc; 69 $gc = ( $gc < 0 ) ? 0 : ( $gc > 255 ) ? 255 : $gc; 70 $bc = ( $bc < 0 ) ? 0 : ( $bc > 255 ) ? 255 : $bc; 71 72 return sprintf( "#%02x%02x%02x", $rc, $gc, $bc ); 73} 74 75