The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Perlbal::Plugin::AutoRemoveLeadingDir;

#
# this plugin auto-removes a leading directory path component
# in the URL, if it's the name of the directory the webserver
# is rooted at.
#
# if docroot = /home/lj/htdocs/stc/
#
# and user requests:
#
#   /stc/img/foo.jpg
#
# Then this plugin will treat that as if it's a request for /img/foo.jpg.
#
# This is useful for css/js/etc to have an "absolute" pathname for
# peer resources (think css having url(/stc/foo.jpg)) that can be served
# from either a separate hostname (stat.livejournal.com) and using a CDN,
# or from www. when cross-domain js restrictions require it.

use Perlbal;
use strict;
use warnings;

sub load   { 1 }
sub unload { 1 }

# called when we're being added to a service
sub register {
    my ($class, $svc) = @_;

    $svc->register_hook('AutoRemoveLeadingDir', 'start_serve_request', sub {
        my Perlbal::ClientHTTPBase $client = shift;
        my $uriref = shift;

        my Perlbal::Service $svc = $client->{service};
        my ($tail) = ($svc->{docroot} =~ m!/([\w-]+)/?$!);
        $$uriref =~ s!^/$tail!! if $tail;
        return 0;
    });

    return 1;
}

# called when we're no longer active on a service
sub unregister {
    my ($class, $svc) = @_;
    return 1;
}

1;