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