File Coverage

blib/lib/Protocol/Sys/Virt/URI.pm
Criterion Covered Total %
statement 41 42 97.6
branch 11 14 78.5
condition 7 10 70.0
subroutine 9 9 100.0
pod 1 1 100.0
total 69 76 90.7


line stmt bran cond sub pod time code
1             ####################################################################
2             #
3             # This file was generated using XDR::Parse version v1.0.1,
4             # XDR::Gen version 1.1.2 and LibVirt version v12.5.0
5             #
6             # Don't edit this file, use the source template instead
7             #
8             # ANY CHANGES HERE WILL BE LOST !
9             #
10             ####################################################################
11              
12              
13 2     2   143121 use v5.14;
  2         8  
14 2     2   9 use warnings;
  2         2  
  2         117  
15              
16             package Protocol::Sys::Virt::URI v12.5.1;
17              
18 2     2   704 use parent qw(Exporter);
  2         504  
  2         9  
19              
20 2     2   95 use Carp qw(croak);
  2         3  
  2         101  
21 2     2   8 use List::Util qw(pairmap);
  2         4  
  2         88  
22 2     2   827 use Log::Any qw($log);
  2         15200  
  2         7  
23 2     2   4634 use URI::Encode qw(uri_encode uri_decode);
  2         29743  
  2         1095  
24              
25             our @EXPORT = qw( parse_url );
26              
27             sub parse_url {
28 13     13 1 129267 my $url = shift;
29 13         39 my ($base, $query) = split( /\?/, $url, 2 );
30 13   100     38 $query //= '';
31 13         17 my %args;
32             pairmap {
33 11 100   11   8149 if ($a eq 'argv') {
34 2 100       4 if (exists $args{argv}) {
35 1         3 push $args{argv}->@*, $b;
36             }
37             else {
38 1         3 $args{argv} = [ $b ];
39             }
40             }
41             else {
42 9         64 $args{$a} = $b;
43             }
44             }
45             map {
46 22         11979 uri_decode($_)
47             }
48             map {
49 13         85 my ($key, $val) = split( /=/, $_, 2 );
  11         21  
50 11   50     17 $val //= '';
51 11         27 ($key, $val);
52             }
53             split( /&/, $query );
54              
55 13 50       161 if ($base =~ m#^
56             (?[a-z0-9_]+)
57             (?:\+(?[a-z0-9_]+))?
58             ://
59             (?:(?[^@]+)@)?
60             ((?[a-z0-9_\-\.]+)
61             (?:\:(?\d+))?
62             )?
63             /
64             (?system|session)
65             $
66             #xi) {
67 13         93 my $bare = "$+{hypervisor}:///$+{type}";
68 13 100 66     52 $bare .= '?' if ($args{mode} or $args{socket});
69             $bare .= 'mode=' . uri_encode($args{mode},
70             { encode_reserved => 1 })
71 13 100       38 if $args{mode};
72 13 50 66     6637 $bare .= '&' if ($args{mode} and $args{socket});
73             $bare .= 'socket=' . uri_encode($args{socket},
74             { encode_reserved => 1 })
75 13 50       26 if $args{socket};
76 13         346 return (base => $base,
77             proxy => $bare,
78             name => "$+{hypervisor}:///$+{type}",
79             %+,
80             query => \%args);
81             }
82              
83 0           die "Malformed hypervisor URI $url";
84             }
85              
86             1;
87              
88              
89             __END__