#!/usr/bin/perl
# blogscript.cgi by i16 -- 2006/04/20 - 2007/03/24 - 2007/4/15
##入口近くに日本語

use Socket;

my ($proxy_host, $proxy_port, $chost, $cport);
my ($host, $port, $url, $path, $ip, $sockaddr);
my ($arg, $buf);

sub convertcdata { my($s)=@_;
	$s=~s/\0//gs;
	$s=~s/\<.*?\>//gs;
	$s=~s/\&/\&amp\;/gs;
	$s=~s/\</\&lt\;/gs;
	$s=~s/\>/\&gt\;/gs;
	$s=~s/\"/\&quot\;/gs;
	$s=~s/\n/\<br\>\n/gs;
##$s="";
	return $s;
	}


$arg=$ENV{'QUERY_STRING'};
##$arg=~s/%([0-9a-f][0-9a-f])/chr(hex($1))/ig;
#($arg) = @ARGV; ## say : http://i16.jugem.cc/?mode=rss

#$proxy_host = 'XXX.XXX.XXX.XXX';
#$proxy_port = 8080;

$host = '127.0.0.1';
$port = 80;
$path = '/';

$lines = $1 if $arg =~ s/^lines(\d+)://;
$subject = $1 if $arg =~ s/^subject([^\:]+)://;
$subject =~ s/%([0-9a-f][0-9a-f])%([0-9a-f][0-9a-f])%([0-9a-f][0-9a-f])/chr(hex($1)).chr(hex($2)).chr(hex($3))/eig;
$subject =~ s/%([0-9a-f][0-9a-f])%([0-9a-f][0-9a-f])/chr(hex($1)).chr(hex($2))/eig;
$subject =~ s/%([0-9a-f][0-9a-f])/chr(hex($1))/ige;
$lines =~ s/%([0-9a-f][0-9a-f])/chr(hex($1))/ige;
$arg =~ s/%([0-9a-f][0-9a-f])/chr(hex($1))/ige;
$arg =~ m!(http:)?(//)?([^:/]*)?(:([0-9]+)?)?(/.*)?!;
$host = $3 if $3;
$port = $5 if $5;
$path = $6 if $6;
##print "host=$host, port=$port, url=$url\n";

if($proxy_host) { ($chost,$cport,$url) = ($proxy_host,$proxy_port,$arg);}
else { ($chost,$cport,$url) = ($host,$port,$path);}

$ip = inet_aton($chost) || die "host($chost) not found.\n";
$sockaddr = pack_sockaddr_in($cport, $ip);
socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die "socket error.\n";

connect(SOCKET, $sockaddr) || die "connect $chost $cport error.\n";
$fhwk=select(SOCKET);$|=1;select($fhwk);

##HTTP/1.1だとTransfer-Encoding: chunkedが返って来ちゃうことがあるので避ける
print SOCKET <<"_TXT_";
GET $url HTTP/1.0
Host: $host

_TXT_

@aa=<SOCKET>;
close(SOCKET);

$a=join("",@aa);
$z="";
while($a =~ s/^(.*?)\<\!\[CDATA\[//s) {
	$z.=$1; $a =~ s/(^.*?)\]\]\>//s; $z.=&convertcdata($1);
	}
$z.= $a;

print <<"_TXT_";
Content-type: text/html

document.write('<div class=blog>',
'<ul>',
_TXT_
while($z =~ s/(\<(item|entry)[\>\s].*?\<\/\2\>)//s) {
	$m=$1;
	foreach $p (('link','title','dc:date','dc:subject','description','pubDate','content:encoded','content')) {
		$p2=$p;$p2=~s/\W//g;
		$p=~/(1232123212321234565343221)/;
		$m=~s/\<$p\>(.*?)\<\/$p\>//is;
		$$p2=$1;
		}
	if(0) { ## for test
		print "'";
		foreach $p (('link','title','dcdate','dcsubject','description','pubDate','contentencoded','content')) {
			print"<hr>$p = $$p\n";
			}
		print "<hr>',\n";
		}
	if(!$subject || ($subject eq $dcsubject)) {
		$dcdate =~ s/T.*//;
		if(!$dcdate) {
			$pubDate=~/(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun), )?(\d{1,2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}|\d{2}) (\d{1,2}):(\d{2})(?::(\d{2}))? (UT|GMT|[ECMP][SD]T|[ZAMNY]|[+-]\d{4})/;
			($wday,$ddd,$mmm,$yyy,$hhh,$min,$sss,$zzz)=($1,$2,$3,$4,$5,$6,$7,$8);
			my %monthes = qw(Jan 01 Feb 02 Mar 03 Apr 04 May 05 Jun 06 Jul 07 Aug 08 Sep 09 Oct 10 Nov 11 Dec 12);
			$mmm=$monthes{$mmm};
			$pubDate2=sprintf("%04d-%02d-%02d",$yyy,$mmm,$ddd);
			$dcdate=$pubDate2;
			}
		$title =~ s/[\r\n]+/ /gs;
		$title =~ s/(\"|\')/\\$1/g;
		print "'<li><a href=\"$link\" target=\"_top\">$title ($dcdate)</a></li>',\n";
		last if $lines && !--$lines;
		}
	}
print <<"_TXT_";
'</ul>',
'</div>');
_TXT_

#end
