# --
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --
package Kernel::System::WebUserAgent;
use strict;
use warnings;
use HTTP::Headers;
use List::Util qw(first);
use LWP::UserAgent;
use Kernel::System::VariableCheck qw(:all);
our @ObjectDependencies = (
'Kernel::Config',
'Kernel::System::Encode',
'Kernel::System::Log',
'Kernel::System::Main',
);
=head1 NAME
Kernel::System::WebUserAgent - a web user agent lib
=head1 DESCRIPTION
All web user agent functions.
=head1 PUBLIC INTERFACE
=head2 new()
create an object
use Kernel::System::WebUserAgent;
my $WebUserAgentObject = Kernel::System::WebUserAgent->new(
Timeout => 15, # optional, timeout
Proxy => 'proxy.example.com', # optional, proxy
);
=cut
sub new {
my ( $Type, %Param ) = @_;
# allocate new hash for object
my $Self = {};
bless( $Self, $Type );
# get database object
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
$Self->{Timeout} = $Param{Timeout} || $ConfigObject->Get('WebUserAgent::Timeout') || 15;
$Self->{Proxy} = $Param{Proxy} || $ConfigObject->Get('WebUserAgent::Proxy') || '';
return $Self;
}
=head2 Request()
return the content of requested URL.
Simple GET request:
my %Response = $WebUserAgentObject->Request(
URL => 'http://example.com/somedata.xml',
SkipSSLVerification => 1, # (optional)
NoLog => 1, # (optional)
);
Or a POST request; attributes can be a hashref like this:
my %Response = $WebUserAgentObject->Request(
URL => 'http://example.com/someurl',
Type => 'POST',
Data => { Attribute1 => 'Value', Attribute2 => 'Value2' },
SkipSSLVerification => 1, # (optional)
NoLog => 1, # (optional)
);
alternatively, you can use an arrayref like this:
my %Response = $WebUserAgentObject->Request(
URL => 'http://example.com/someurl',
Type => 'POST',
Data => [ Attribute => 'Value', Attribute => 'OtherValue' ],
SkipSSLVerification => 1, # (optional)
NoLog => 1, # (optional)
);
returns
%Response = (
Status => '200 OK', # http status
Content => $ContentRef, # content of requested URL
);
You can even pass some headers
my %Response = $WebUserAgentObject->Request(
URL => 'http://example.com/someurl',
Type => 'POST',
Data => [ Attribute => 'Value', Attribute => 'OtherValue' ],
Header => {
Authorization => 'Basic xxxx',
Content_Type => 'text/json',
},
SkipSSLVerification => 1, # (optional)
NoLog => 1, # (optional)
);
If you need to set credentials
my %Response = $WebUserAgentObject->Request(
URL => 'http://example.com/someurl',
Type => 'POST',
Data => [ Attribute => 'Value', Attribute => 'OtherValue' ],
Credentials => {
User => 'otrs_user',
Password => 'otrs_password',
Realm => 'OTRS Unittests',
Location => 'ftp.otrs.org:80',
},
SkipSSLVerification => 1, # (optional)
NoLog => 1, # (optional)
);
=cut
sub Request {
my ( $Self, %Param ) = @_;
# define method - default to GET
$Param{Type} ||= 'GET';
my $Response;
# init agent
my $UserAgent = LWP::UserAgent->new();
# In some scenarios like transparent HTTPS proxies, it can be neccessary to turn off
# SSL certificate validation.
if (
$Param{SkipSSLVerification}
|| $Kernel::OM->Get('Kernel::Config')->Get('WebUserAgent::DisableSSLVerification')
)
{
$UserAgent->ssl_opts(
verify_hostname => 0,
);
}
# set credentials
if ( $Param{Credentials} ) {
my %CredentialParams = %{ $Param{Credentials} || {} };
my @Keys = qw(Location Realm User Password);
my $AllCredentialParams = !first { !defined $_ } @CredentialParams{@Keys};
if ($AllCredentialParams) {
$UserAgent->credentials(
@CredentialParams{@Keys},
);
}
}
# set headers
if ( $Param{Header} ) {
$UserAgent->default_headers(
HTTP::Headers->new( %{ $Param{Header} } ),
);
}
# set timeout
$UserAgent->timeout( $Self->{Timeout} );
# get database object
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
# set user agent
$UserAgent->agent(
$ConfigObject->Get('Product') . ' ' . $ConfigObject->Get('Version')
);
# set proxy
if ( $Self->{Proxy} ) {
$UserAgent->proxy( [ 'http', 'https', 'ftp' ], $Self->{Proxy} );
}
if ( $Param{Type} eq 'GET' ) {
# perform get request on URL
$Response = $UserAgent->get( $Param{URL} );
}
else {
# check for Data param
if ( !IsArrayRefWithData( $Param{Data} ) && !IsHashRefWithData( $Param{Data} ) ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message =>
'WebUserAgent POST: Need Data param containing a hashref or arrayref with data.',
);
return ( Status => 0 );
}
# perform post request plus data
$Response = $UserAgent->post( $Param{URL}, $Param{Data} );
}
if ( !$Response->is_success() ) {
if ( !$Param{NoLog} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Can't perform $Param{Type} on $Param{URL}: " . $Response->status_line(),
);
}
return (
Status => $Response->status_line(),
);
}
# get the content to convert internal used charset
my $ResponseContent = $Response->decoded_content();
$Kernel::OM->Get('Kernel::System::Encode')->EncodeInput( \$ResponseContent );
if ( $Param{Return} && $Param{Return} eq 'REQUEST' ) {
return (
Status => $Response->status_line(),
Content => \$Response->request()->as_string(),
);
}
# return request
return (
Status => $Response->status_line(),
Content => \$ResponseContent,
);
}
1;
=head1 TERMS AND CONDITIONS
This software is part of the OTRS project (L).
This software comes with ABSOLUTELY NO WARRANTY. For details, see
the enclosed file COPYING for license information (GPL). If you
did not receive this file, see L.
=cut