Authen-CAS-External
view release on metacpan or search on metacpan
lib/Authen/CAS/External/UserAgent.pm view on Meta::CPAN
# Get the CAS URL to use
my $cas_url = exists $args{cas_url} ? $args{cas_url}
: $self->cas_url;
# Create the beginning of the URL as a URI
my $url = URI->new($cas_url);
# Get the URL path
my @url_path = $url->path_segments;
if (@url_path) {
# Get the last path item
my $last_path_segment = pop @url_path;
if ($last_path_segment ne q{}
&& $last_path_segment ne q{login}) {
# Add the last piece back
push @url_path, $last_path_segment;
}
}
# Set the correct path
$url->path_segments(@url_path, 'login');
if (exists $args{service}) {
$url->query_param('service', $args{service});
}
if (exists $args{gateway}) {
$url->query_param('gateway', $args{gateway} ? 'true' : 'false');
}
if (exists $args{renew}) {
$url->query_param('renew', $args{renew} ? 'true' : 'false');
}
# Return the URI object
return $url;
}
# Private Methods
sub _add_user_agent_handlers {
my ($self, %args) = @_;
# Get the arguments
my ($user_agent, $cas_url) = @args{qw(user_agent cas_url)};
# Default arguments
$cas_url ||= $self->cas_url;
$user_agent ||= $self->user_agent;
# Get fully-qualified host and path
my ($cas_host, $cas_path) = map { $_->host, $_->path }
$self->service_request_url(cas_url => $cas_url);
# Create the owner reference
my $owner = \$self;
# This is a reference to a weak reference to prevent circular references
Scalar::Util::weaken(${$owner});
# Add handlers
$user_agent->add_handler(
request_prepare => \&_process_ticket_granting_cookie,
m_host => $cas_host,
m_method => 'GET',
m_path_match => qr{\A \Q$cas_path\E}msx,
object_instance => $owner,
owner => $self->_handler_owner_name,
);
$user_agent->add_handler(
response_redirect => \&_process_login_page,
m_host => $cas_host,
m_media_type => 'html',
m_path_match => qr{\A \Q$cas_path\E}msx,
object_instance => $owner,
owner => $self->_handler_owner_name,
);
$user_agent->add_handler(
response_done => \&_determine_complete_login,
m_host => $cas_host,
m_path_match => qr{\A \Q$cas_path\E}msx,
object_instance => $owner,
owner => $self->_handler_owner_name,
);
return;
}
sub _cas_url_trigger {
my ($self, $cas_url, $previous_cas_url) = @_;
if (defined $previous_cas_url) {
# Remove the handlers from the current user agent for the previous
# CAS URL.
$self->_remove_user_agent_handlers(
cas_url => $previous_cas_url,
);
}
# Now add the handlers back to the user agent for the new CAS URL.
$self->_add_user_agent_handlers(
cas_url => $cas_url,
);
return;
}
sub _determine_complete_login {
my ($response, $user_agent, $info) = @_;
my $self = ${$info->{object_instance}};
if ($response->request->method ne 'POST' && !$response->is_redirect) {
# Redriects are when the login process is completing
return;
}
# Create a location to store the response data
my %response_data;
( run in 1.744 second using v1.01-cache-2.11-cpan-39bf76dae61 )