Committer: gariev
LJRU-2138: Special URLs to count how many people hit the link (and redirect them to their actual link)U trunk/cgi-bin/LJ/Hooks/SUP.pm
Modified: trunk/cgi-bin/LJ/Hooks/SUP.pm =================================================================== --- trunk/cgi-bin/LJ/Hooks/SUP.pm 2010-08-10 08:03:40 UTC (rev 9324) +++ trunk/cgi-bin/LJ/Hooks/SUP.pm 2010-08-10 08:52:26 UTC (rev 9325) @@ -884,4 +884,37 @@ LJ::register_hook('has_image_dangerous_content', sub { require LJ::ImageContent; LJ::ImageContent::has_image_dangerous_content (@_); }); +LJ::register_hook("should_redirect", sub { + my ($host, $uri, $get) = @_; + + if ($host eq $LJ::DOMAIN_WEB && $uri =~ m!^/redirect/!) { + my $url = $get->{'url'}; + if ($url + && $url =~ m! ^ https?:// [-\w.]*? ([-\w]+ \. [-\w]+) / !x + && $LJ::ALLOWED_REDIRECT_TO_DOMAIN{$1}) + { + ## + ## Notify BinAccessLogs (XCounter1) explicitely, since PerlCleanupHandler (where the logging is done) + ## is not called for requests ended by redirect under mod_perl/Apache 1. + ## Warnings: + ## 1) AccessLogRecord is not fully initialized here. + ## 2) Under mod_perl2, AccessLogSink will be notified twice, field _explicit is used for unambiguity. + ## Status and content type are faked so that log records are counted by XCounter1. + ## + use LJ::AccessLogSink::BinAccessLogs; + use LJ::AccessLogRecord; + my $log_record = LJ::AccessLogRecord->new; + $log_record->{'ctype'} = 'text/html'; + $log_record->{'status'} = 200; + $log_record->{'_explicit'} = 1; + LJ::AccessLogSink::BinAccessLogs->new->log($log_record); + + return $url; + } + ## else - if not handled here, /redirect/... url will return 404 + } +}); + + + 1;