Circle-Common
view release on metacpan or search on metacpan
lib/Circle/Common.pm view on Meta::CPAN
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
=head1 SYNOPSIS
use Circle::Common;
my $url = build_url_template('user', 'getBlockHashList', {
baseHeight => 0,
});
my $response = http_json_get($url);
if ($response->{status} == 200) {
my $data = $response->{data};
( run in 0.995 second using v1.01-cache-2.11-cpan-df04353d9ac )