Circle-Common
view release on metacpan or search on metacpan
lib/Circle/Common.pm view on Meta::CPAN
package Circle::Common;
use 5.006;
use strict;
use warnings;
use Exporter 'import';
use URL::Encode qw(url_encode_utf8);
use LWP::UserAgent;
use HTTP::Request;
use Slurp;
use Try::Tiny;
use YAML;
use JSON;
use Carp;
use File::Share ':all';
our @EXPORT_OK = qw(
load_config
build_url_template
http_json_post
http_json_get
);
our $VERSION = '0.06';
my $config = undef;
sub load_config {
if ($config) {
return $config;
}
my $config_path;
if (-e "./config.yml") {
$config_path = "./config.yml";
} else {
$config_path = dist_file('Circle-Common', 'config.yml');
}
try {
my $content = slurp($config_path);
$config = Load($content);
}
catch {
carp "cannot load config, error: $_";
};
return $config;
}
sub get_session_key {
my $config = load_config();
my $user = $config->{user};
my $home = $ENV{HOME};
my $session_path = $user->{sessionPath};
my $file_path = "${home}/${session_path}";
my $session_key = '';
# print "file_path: $file_path\n";
try {
my @lines = slurp($file_path);
my @session_keys = grep { chomp($_); $_ =~ /^sessionKey/; } @lines;
if ( @session_keys > 0 ) {
$session_key = $session_keys[0];
$session_key =~ s/sessionKey=//;
}
}
catch {
carp "cannot read $session_path, error: $_";
};
return $session_key;
}
sub http_json_post {
my ( $url, $data, $need_session_key ) = @_;
$need_session_key //= 1;
my $config = load_config();
my $http = $config->{http};
my $session_key = get_session_key();
my $ua = LWP::UserAgent->new();
$ua->timeout( $http->{timeoutWrite} );
my $header;
if ($need_session_key && $session_key) {
$header = [
'AuthorizationV2' => $session_key,
'Content-Type' => 'application/json; charset=UTF-8'
];
}
else {
$header = [ 'Content-Type' => 'application/json; charset=UTF-8' ];
}
my $request = HTTP::Request->new( 'POST', $url, $header, encode_json($data) );
my $response = $ua->request($request);
if ( $response->is_success ) {
return decode_json( $response->decoded_content );
}
else {
carp 'http_json_post' . $response->status_line ? $response->status_line : 'unknown';
return {
status => $response->status_line,
message => $response->decoded_content,
};
}
}
sub http_json_get {
my ($url, $need_session_key) = @_;
$need_session_key //= 1;
my $config = load_config();
my $http = $config->{http};
my $session_key = get_session_key();
my $ua = LWP::UserAgent->new();
$ua->timeout( $http->{timeoutRead} );
my $header;
# print "need_session_key: $need_session_key, session_key: $session_key";
if ($need_session_key && $session_key) {
$header = [
'AuthorizationV2' => $session_key,
'Content-Type' => 'application/json; charset=UTF-8'
];
}
else {
$header = [ 'Content-Type' => 'application/json; charset=UTF-8' ];
}
my $request = HTTP::Request->new( 'GET', $url, $header );
my $response = $ua->request($request);
if ( $response->is_success ) {
return decode_json( $response->decoded_content );
}
else {
carp 'http_json_get' . $response->status_line ? $response->status_line : 'unknown';
return {
status => $response->status_line,
message => $response->decoded_content,
};
}
}
sub get_host {
my $config = load_config();
my $http = $config->{http};
my $protocol = $http->{protocol};
my $host = $http->{host};
return "$protocol://$host";
}
sub build_url_template {
my ( $buz, $path, $params_for ) = @_;
my $config = load_config();
my $block_path = $config->{$buz}->{path};
my $base_uri = $block_path->{$path};
my $host = get_host();
my $url = "${host}${base_uri}";
# print "base url: $url, params:\n" . Dump($params_for) . "\n";
my @params;
if ($params_for) {
@params = map {
my $value = $params_for->{$_};
$value = url_encode_utf8($value);
"$_=$value";
} ( keys %{$params_for} );
# print "params:\n" . Dump( \@params ) . "\n";
}
if ( @params > 0 ) {
$url = $url . '?' . join( '&', @params );
}
# print "final url: $url\n";
return $url;
}
1;
__END__
=head1 NAME
Circle::Common - the common module for Circle::Chain SDK
=head1 VERSION
Version 0.06
( run in 1.512 second using v1.01-cache-2.11-cpan-5837b0d9d2c )