ad4U関連通信をダンプするプロキシ

高木先生がad4Uについて書かれていました。気になっていたのですが、ちょっと成り行きを見ていました。
テクノロジー : 日経電子版
結局、ログインに関わらずページを見ている人が、どこのサイトを閲覧しているのか分かってしまう点が問題になるのでしょうね。はてなブックマークに関連のあるアドレスを埋め込めば、はてなユーザーIPアドレスを結びつけることも可能かもしれません。また、セクシーなサイトめぐりに使われているブラウザでは、ターゲティング広告で、セクシーな広告ばかり見せられるかも。確かに「お前の秘密を知ってる。」みたいな広告は勘弁ですね。

実際にどんなデータが流れているのか気になったので、ちょっとプロキシ作ってみました。ポート8888番で動作します。

use strict;
use warnings;

package Local::Proxy::BodyCheckFilter;
use base 'HTTP::Proxy::BodyFilter';
use HTTP::Proxy qw(FILTERS);

my @check_hosts = (
	[ qr/ias\.rakuten\.co\.jp$/,      "maybe" ],
	[ qr/image\.adv\.livedoor\.com$/, "full" ],
	[ qr/ad4u\.drecom\.jp$/,          "full" ],
);

sub filter {
	my ($self, $dataref, $message, $protocol, $buffer) = @_;

	defined $$dataref or return;
	length $$dataref  or return;

	my $host = $message->request->headers->header('host');
	print "HOST: ", $host, "\n";

	foreach(@check_hosts){
		$host =~ /$_->[0]/ or next;

		my $method = $message->request->method;
		my $uri    = $message->request->uri;
		$self->proxy->log(FILTERS, $method, $uri);

		print $message->headers->as_string, "\n";
		print {
			"none"  => sub{ "" },
			"full"  => sub{ $$dataref },
			"head"  => sub{ substr($$dataref, 0, 64) },
			"maybe" => sub{
				my $data = substr($$dataref, 0, 128);
				($data =~ tr/\r\n\t\x20-\x7e//c) <= 5 ?
					$$dataref : 'may be binary..';
			},
		}->{$_->[1] || 'none'}->(), "\n\n";
		last;
	}
}

package main;
use HTTP::Proxy qw(:log);
use HTTP::Proxy::BodyFilter::complete;

MAIN: {
	my $proxy = HTTP::Proxy->new(port => 8888);
	$proxy->via("(HTTP::Proxy/$HTTP::Proxy::VERSION)");
	$proxy->x_forwarded_for(0);
	$proxy->logmask(FILTERS);

	$proxy->push_filter(
		response => HTTP::Proxy::BodyFilter::complete->new,
		response => Local::Proxy::BodyCheckFilter->new
	);
	$proxy->start;

	exit;
}

@check_hostに、チェックするホスト名と、none/full/head/maybe のいずれかをペアにして配列に入れておけば、そのホストから帰ってきたレスポンスヘッダと内容を表示します(noneを選ぶと表示しません/maybeはテキストかどうかを適当に判断して表示します)。
楽天では、一部バイナリっぽいデータが流れていました。で、実際、データを見たのですが…さっぱりぽん(ダメじゃん。