Apache2-ApacheMobileFilter
view release on metacpan or search on metacpan
lib/Apache2/AMFLiteDetectionFilter.pm view on Meta::CPAN
my $returnValue="nc";
my @osTypesArray = split(/,/, "windows,mac,linux");
my $osNumber=0;
foreach my $os (@osTypesArray){
if ($UserAgent =~ /$os/) {
if ($osNumber == 0 ) {
$returnValue="windows";
} elsif ($osNumber == 1 ) {
$returnValue="mac";
} elsif ($osNumber == 2 ) {
$returnValue="windows";
}
return $returnValue;
}
$osNumber++;
}
return $returnValue;
}
sub getBrowserVersion {
my ($UserAgent, $os) = (@_);
my $regex="(firefox|msie|chrome|chromium|safari|edge|seamonkey|opera)\\/(([0-9]?)([0-9]?)([0-9]?)(.?)([0-9]?)([0-9]?)([0-9]?)(.?)([0-9]?)([0-9]?)([0-9]?)(.?)([0-9]?)([0-9]?)([0-9]?)(.?)([0-9]?)([0-9]?)([0-9]?))";
my $regex2='(msie|(?!gecko.+)firefox|(?!applewebkit.+chrome.+)safari|(?!applewebkit.+)chrome|applewebkit(?!.+chrome|.+safari)|gecko(?!.+firefox))(?: |\/)([\d\.apre]+)';
my $type="nc";
my $version="nc";
my ($mtype,$mversion)=($UserAgent =~ /$regex/i);
if (!$mtype) {
my ($mtype2,$mversion2)=($UserAgent =~ /$regex2/i);
if ($mtype2) {
$type=$mtype2;
$version=$mversion2;
}
} else {
$type=$mtype;
$version=$mversion;
}
print $type."\n";
print $version."\n";
return ($type,$version);
}
sub handler {
my $f = shift;
my $capability2;
my $variabile="";
my $user_agent=lc($f->headers_in->{'User-Agent'}|| '');
my $x_user_agent=$f->headers_in->{'X-Device-User-Agent'}|| '';
my $x_operamini_phone_ua=$f->headers_in->{'X-OperaMini-Phone-Ua'}|| '';
my $x_operamini_ua=$f->headers_in->{'X-OperaMini-Ua'}|| '';
my $query_string=$f->args;
my $docroot = $f->document_root();
my $id="";
my $location="none";
my $isTablet="false";
my $width_toSearch;
my $type_redirect="internal";
my $return_value;
my $dummy="";
my $variabile2="";
my %ArrayCapFound;
my $controlCookie;
my $query_img="";
$ArrayCapFound{is_transcoder}='false';
my %ArrayQuery;
my $var;
my $mobile=0;
my $amf_device_istablet='false';
my $amf_device_istouch='false';
my $amf_device_ismobile='';
my $amf_device_istv='';
my $version="";
my $amf_device_os='nc';
my $amf_device_os_version='nc';
my $amf_browser_type='nc';
my $amf_browser_version='nc';
if ($user_agent eq "") {
$user_agent="no useragent found";
}
if ($x_user_agent) {
$user_agent=lc($x_user_agent);
}
if ($x_operamini_phone_ua) {
$user_agent=lc($x_operamini_phone_ua);
}
my $cookie = $f->headers_in->{Cookie} || '';
if ($CommonLib->readCookie($cookie) eq 'true' || $CommonLib->readCookie($cookie) eq 'false') {
$amf_device_ismobile=$CommonLib->readCookie($cookie);
}
my $amfFull=$CommonLib->readCookie_fullB($cookie);
if ($query_string) {
my @vars = split(/&/, $query_string);
foreach $var (sort @vars){
if ($var) {
my ($v,$i) = split(/=/, $var);
$v =~ tr/+/ /;
$v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
if ($i) {
$i =~ tr/+/ /;
$i =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$i =~ s/<!--(.|\n)*-->//g;
$ArrayQuery{$v}=$i;
}
}
}
if (($ArrayQuery{amf}) && $restmode eq 'true') {
$user_agent=lc($ArrayQuery{amf});
}
if ($ArrayQuery{$mobilenable}) {
$f->err_headers_out->set('Set-Cookie' => "amfFull=false; path=/;");
$amfFull='ok';
}
}
$user_agent=&cleanUA($user_agent);
if ($amf_device_ismobile eq "") {
$amf_device_ismobile = &isMobile($user_agent);
if ($amf_device_ismobile eq 'true') {
$amf_device_istouch = &isTouch($user_agent);
$amf_device_istablet=&isTablet($user_agent);
$amf_device_os=&getOperativeSystem($user_agent);
} else {
$amf_device_os=&getOperativeDesktopSystem($user_agent);
}
$amf_device_os_version=&getOperativeSystemVersion($user_agent,$amf_device_os);
$amf_device_istv = &isTV($user_agent);
if ($cookiecachesystem eq "true") {
$f->err_headers_out->set('Set-Cookie' => "amfID=$id; path=/;");
}
}
($amf_browser_type,$amf_browser_version)=&getBrowserVersion($user_agent);
if ($amfFull ne "") {
$f->subprocess_env("AMF_FORCE_TO_DESKTOP" => 'true');
$f->pnotes("amf_force_to_desktop" => 'true');
}
$f->pnotes('is_tablet' => $amf_device_istablet);
$f->pnotes("amf_device_ismobile" => $amf_device_ismobile);
$f->pnotes("is_touch" => $amf_device_istouch);
$f->subprocess_env("AMF_ID" => "amf_lite_detection");
$f->subprocess_env("AMF_DEVICE_IS_MOBILE" => $amf_device_ismobile);
$f->subprocess_env("AMF_DEVICE_IS_TABLET" => $amf_device_istablet);
$f->subprocess_env("AMF_DEVICE_IS_TOUCH" => $amf_device_istouch);
$f->subprocess_env("AMF_DEVICE_IS_TV" => $amf_device_istv);
$f->subprocess_env("AMF_DEVICE_OS" => $amf_device_os);
$f->subprocess_env("AMF_DEVICE_OS_VERSION" => $amf_device_os_version);
$f->subprocess_env("AMF_BROWSER_TYPE" => $amf_browser_type);
$f->subprocess_env("AMF_BROWSER_VERSION" => $amf_browser_version);
$f->subprocess_env("AMF_VER" => $VERSION);
$f->headers_out->set("AMF-Ver"=> $VERSION);
if ($x_operamini_ua) {
$f->subprocess_env("AMF_MOBILE_BROWSER" => $x_operamini_ua);
$f->pnotes("mobile_browser" => $x_operamini_ua);
$f->subprocess_env("AMF_IS_TRANCODER" => 'true');
$f->pnotes("is_transcoder" => 'true');
} else {
$f->pnotes("is_transcoder" => 'true');
}
return Apache2::Const::DECLINED;
}
1;
=head1 NAME
Apache2::AMFLiteDetectionFilter - The module detects in lite mode the mobile device and passes few capabilities on to the other web application as environment variables
=head1 DESCRIPTION
Module for device detection, parse the user agent and decide if the device is mobile, touch or tablet.
=head1 AMF PROJECT SITE
http://www.apachemobilefilter.org
=head1 DOCUMENTATION
http://wiki.apachemobilefilter.org
Perl Module Documentation: http://wiki.apachemobilefilter.org/index.php/AMFLiteDetectionFilter
=head1 AUTHOR
Idel Fuschini (idel.fuschini [at] gmail [dot] com)
=head1 COPYRIGHT
You may distribute under the terms of either the GNU General Public
( run in 0.624 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )