Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict;
- use warnings;
- use threads;
- use Getopt::Long;
- use HTTP::Daemon;
- use HTTP::Status;
- use LWP::UserAgent;
- use String::Random;
- my %options;
- my %mode;
- my $default_blur = '-blur 0x6';
- my $default_prefix = 'img';
- my $result = GetOptions (
- "p|port=s" => \$options{'port'},
- "c|imagemagick=s" => \$mode{'imagemagic'},
- "s|substitute=s" => \$mode{'substitute'},
- "b|blur" => \$mode{'blur'},
- "f|flip" => \$mode{'flip'},
- "v|verbose+" => \$options{'verbose'},
- "h|help" => \$options{'help'},
- "r|remove" => \$options{'remove'},
- );
- if (defined $options{'help'}){
- print "-p|port <port>\n";
- print "-c|imagemagick <comand>\n";
- print "-s|substitute <image file>\n";
- print "-b|blur\n";
- print "-f|flip\n";
- print "-v|verbose\n";
- print "-h|help\n";
- print "-r|remove - remove temp images...(does not work on subs)\n";
- exit(0);
- }
- if (!defined $options{'port'}){
- $options{'port'} = "8000";
- print "Port not defined. ";
- }
- print "Using port ".$options{'port'}."\n";
- #clean modes =/
- foreach my $key(keys %mode){
- if(!defined $mode{$key}){
- delete($mode{$key});
- next;
- }
- }
- if ( (keys %mode) == 0){
- print "Error: no mode chosen\n";
- exit(1);
- }
- if ( (keys %mode) > 1){
- print "Error: c|s|b|f, not at the same time!\n";
- exit(1);
- }
- sub verbose{
- if ($options{'verbose'}){
- print @_;
- }
- print "\n";
- }
- my $rand = new String::Random;
- my $ua = LWP::UserAgent->new;
- my $d = new HTTP::Daemon(LocalPort=>$options{'port'});
- my $newImage = "";
- if(defined $mode{'substitute'}){
- verbose("Loading substitute image: ".$mode{'substitute'});
- open IMAGE, $mode{'substitute'} or die "Error opening image: $!\n";
- while(<IMAGE>){
- $newImage .= $_;
- }
- close(IMAGE);
- }
- sub conHandler($) {
- my ($c) = @_;
- verbose("New connection! Total:".threads->list());
- while (my $r = $c->get_request) {
- verbose("GET: ".$r->uri);
- #verbose("REQUEST:\n".$r->as_string."\n-------------");
- my $response = $ua -> request( HTTP::Request->new(
- $r->method,
- $r->url,
- $r->headers,
- $r->content));
- #verbose("RESPONSE:\n".$response->headers_as_string."\n");
- my $goodToGo = 0;
- if($r->method eq "GET"){
- if(defined $response->header('Content-Type') && $response->header('Content-Type') =~ m/image/){
- $goodToGo = 1;
- }
- }
- if($goodToGo){
- if($response->header('Content-Type') =~ m/image\/x-icon/){
- $goodToGo = 0;
- }elsif(defined($response->header('Transfer-Encoding'))){
- $goodToGo = 0;
- }elsif(defined($response->header('Client-Transfer-Encoding'))){
- $goodToGo = 0;
- }
- }
- if($goodToGo){
- verbose("Modifying image...");
- my $name = $response->header('Content-Type');
- $name =~ s/image\/(.+)$/$1/gi;
- $name = $default_prefix.$rand->randregex('\w\w\w\w\w\w\w\w').'.'.$name;
- my $action = "";
- if(defined $mode{'blur'}){
- $action = "convert $name $default_blur $name.mod";
- }elsif(defined $mode{'flip'}){
- $action = "convert $name -flip $name.mod";
- }elsif(defined $mode{'imagemagick'}){
- $action = "convert $name ".$mode{'imagemagick'}. " $name.mod";
- }
- if($action ne ""){
- #verbose("Saving image as $name");
- open IMAGE, ">>".$name or die "erro:$!\n";
- print IMAGE $response->content;
- close IMAGE;
- #verbose("operation: '$action'");
- system($action);
- #verbose("Loading Modification");
- open IMAGE, $name.".mod" or die "erro:$!\n";
- $newImage = "";
- while (<IMAGE>){
- $newImage .= $_;
- }
- close(IMAGE);
- if(defined $options{'remove'} && $options{'remove'}){
- unlink $name;
- unlink $name.".mod";
- }
- }
- verbose("Sending Image");
- $response->content($newImage);
- $response->header('Content-Length' => length($newImage));
- }
- $c->send_response($response);
- }
- $c->close();
- undef($c);
- }
- while (my $c = $d->accept) {
- threads->create('conHandler',$c)->detach();
- }
- print "Daemon crashed?\n";
Add Comment
Please, Sign In to add comment