#!/usr/bin/perl =head1 NAME ExtendedURI - Convert a given URI into an encoded format that can be used to lookup via DNS on Mailspike EBL =cut =head1 METHODS =over 4 =item encode($url) Returns the encoded URI. Example: encode("http://example.com/XX/somelargerpath/that?foo=bar")' returns: bar.foo.8c9d53a8.645bd428.XX.example.com =cut package ExtendedURI; use strict; use vars qw(@ISA); use bytes; use Digest::MD5 qw{ md5_hex}; use String::CRC32; my $MAXHOSTSIZE = 112; my $MAXPARTSIZE = 8; sub sub_encode { my $string = shift; my $maxpart = shift || $MAXPARTSIZE; #return '"'.$string."-".substr(md5_hex($string),0,34).'"'; #return '"'.$string."-".substr(md5_hex($string),0,$maxpart).'"'; return substr(md5_hex($string),0,$maxpart); } sub encode { my $url = shift || return ''; my $rbl = shift || ''; my $maxpart = shift || $MAXPARTSIZE; my $max = shift || $MAXHOSTSIZE; $rbl = ".$rbl" if $rbl; if ( $url!~/^\w+:\/\// ) { $url="http://".$url; } $url=~/https?:\/\/(.+?)(\/|$)(.*)/; my $domain=$1; $max -= (length($domain) + length($rbl) + $maxpart +1); my $path="/".$3 if $3; my $result; if ( $path ) { my @slices=split(/[\/\?\=\&]/,$path); # Split path into slices shift(@slices); # remove empty slice # Encode it while ((my $slice = shift(@slices)) && ($max > ($maxpart+1))) { substr($path,0,length($slice)+1) = ''; $result = sub_encode($slice,$maxpart).".$result"; $max -= ($maxpart +1); } chop($result); $result = sub_encode($path,$maxpart).".$result" if $path; return "$result.$domain$rbl"; } else { # If no path detected, just return the original domain return $domain; } } 42;