File Coverage

blib/lib/CGI/Enurl.pm
Criterion Covered Total %
statement 19 31 61.2
branch 8 10 80.0
condition n/a
subroutine 2 3 66.6
pod 2 3 66.6
total 31 47 65.9


line stmt bran cond sub pod time code
1              
2             =head1 NAME
3              
4             CGI::Enurl.pm - module for URL-encoding strings and hashes
5              
6             version 1.07
7              
8             =head1 SYNOPSIS
9              
10             use CGI::Enurl;
11             %hash = (name=>'Jenda Krynicky',address=>'Nerudova 1016');
12             print "Location: http://$ENV{SERVER_NAME}/cgi-bin/do.pl?",enurl \%hash,"\n\n";
13              
14             =head1 DESCRIPTION
15              
16             This is a little module made for CGI scripting. It encodes the parameters
17             to be passed to a CGI. It does nothing more, so it's much smaller and loads
18             more quickly.
19              
20             =head1 Functions
21              
22             =over 2
23              
24             =item enurl STRING
25              
26             =item enurl ARRAY
27              
28             =item enurl HASH
29              
30             Encodes the parameter. If the parameter is a single string
31             it encodes it and returns the encoded form.
32              
33             If it is an array or a reference to an array it encodes all
34             items and returns them joined by '&'.
35              
36             If it is a hash it encodes the values and return a querystring in form
37             "key2=encoded_value1&key2=encoded_value2&...".
38              
39             !!! Please note that a hash in a list context returns a list of all
40             keys and values. This means that if you call enurl(%hash) you will NOT
41             get what you may thing you should. You HAVE to use enurl(\%hash) !!!
42              
43             =item enURL STRING
44              
45             Encodes the parameter, this version doesn't encode '=' and '&' characters,
46             so you should make sure they are not present in the data.
47              
48             Notice the difference :
49              
50             enurl 'a&b=f o o' => 'a%26b%3Df+o+o'
51             enURL 'a&b=f o o' => 'a&b=f+o+o'
52              
53             =item $CGI::Enurl::ParamSeparator
54              
55             You may specify another character to be used as the parameter separator.
56             Simply set this variable to the character (or string) you want to use.
57              
58             The default value is '&'
59              
60             =item $CGI::Enurl::KeepUnencoded
61              
62             This variable contains the characters that should stay unencoded.
63             Please keep in mind that the string will be interpolated into a regexp
64             in a [^...] group!
65              
66             Any change of this variable will be ignored after the first call to
67             enurl or enURL. (I'm using /o switch in the regexp.) So if you want to
68             change the variable you should do it as soon as posible. You may do that
69             even before you "use" the module!
70              
71             The default value is 'a-zA-Z 0-9_\\-@.='
72              
73             =back
74              
75             =head2 EXAMPLE:
76              
77             use CGI::Enurl;
78              
79             print "Location: http://www.somewhere.com/Scripts/search.pl?",
80             enurl('something strange'),"\n\n";
81              
82             or
83              
84             use CGI::Enurl;
85              
86             print "Location: http://www.somewhere.com/Scripts/search.pl?",
87             enurl('something strange','and other',666),"\n\n";
88              
89             or
90              
91             use CGI::Enurl;
92              
93             print "Location: http://www.somewhere.com/Scripts/myscript.pl?",
94             enurl({fname => 'Jan',lname => 'Krynický',tel => '+420-2-9618 1234'},1),"\n\n";
95              
96             or
97              
98             use CGI::Enurl;
99              
100             print "Location: http://www.somewhere.com/Scripts/myscript.pl?",
101             enURL('fname=Jan&lname=Krynický&tel=+420-2-9618 1234&1',"\n\n";
102              
103              
104             or using the tricks of Interpolation.pm - http://www.plover.com/~mjd/perl/Interpolation/manual.html
105              
106             use CGI::Enurl;
107             use Interpolation URL => \&enurl;
108             print "name=$URL{'Jann Linder, jr'}&address=$URL{'129 kjhlkjd st'}";
109              
110             or even
111              
112             use CGI::Enurl;
113             use Interpolation enurl => sub {my %hash=split /$;/o,$_[0];enurl \%hash};
114             # use other name instead of enurl if you like.
115              
116             print "script.pl?$enurl{name=>'Jenda Krynicky',address=>'Nerudova 1016'}\n";
117              
118             %hash = (name=>'Jenda Krynicky',address=>'Nerudova 1016');
119              
120             sub var {
121             if (ref $_[0] eq 'HASH') {
122             join $;, %{shift()}, @_;
123             } else {
124             join $;, @_;
125             }
126             }
127              
128             print "script.pl?$enurl{var %hash}\n";
129             # the "var" is necessary !
130             # without it you will get : "Odd number of elements in hash list at ... line 2."
131              
132             print "script.pl?$enurl{var %hash,age=>22}\n";
133              
134             # you may omit the "var" only if you enter the hash as a constant directly
135             # into $enurl{...}.
136              
137             If you want to be cheeky you may use '$?{}' as the interpolator:
138              
139             use CGI::Enurl;
140             use Interpolation '?' => sub {my %hash=split /$;/o,$_[0]; '?' . enurl \%hash};
141              
142             print "cript.pl$?{a=>5,b=>7,n=>'Jenda Krynicky'}\n";
143              
144             or
145              
146             use CGI::Enurl;
147             use Interpolation '?' => sub {'?' . enURL $_[0]};
148              
149             print "cript.pl$?{'a=5&b=7&n=Jenda Krynicky'}\n";
150             # # or
151             # print qq{cript.pl$?{"a=5&b=7&n=$name"}\n};
152              
153             Please read the docs for enurl versus enURL so that you understand the difference!
154              
155             =cut
156              
157             #!/big/bin/perl
158             package CGI::Enurl;
159             $VERSION='1.07';
160             require Exporter;
161             @ISA = (Exporter);
162             @EXPORT = qw(&enurl &enURL);
163             @EXPORT_OK = qw(&enurl &enURL &enurl_str);
164              
165             $ParamSeparator = '&' unless $ParamSeparator;
166             $KeepUnencoded = 'a-zA-Z 0-9_\\-@.=' unless $KeepUnencoded;
167              
168             sub enurl {
169 7     7 1 408 my @data;
170             my $item;
171 7         14 foreach $item (@_) {
172 8 100       27 if (ref $item eq 'HASH') {
    100          
173 4         5 my $key;
174 4         13 foreach $key (keys %$item) {
175 7 100       26 if ($key =~ /^\d+$/) {
176 3 50       9 if (ref $item->{$key} eq 'ARRAY') {
177 0         0 foreach (@{$item->{$key}}) {
  0         0  
178 0         0 push @data,enurl_str($_);
179             }
180             } else {
181 3         9 push @data,enurl_str($item->{$key});
182             }
183             } else {
184 4 50       12 if (ref $item->{$key} eq 'ARRAY') {
185 0         0 foreach (@{$item->{$key}}) {
  0         0  
186 0         0 push @data,(enurl_str($key).'='.enurl_str($_));
187             }
188             } else {
189 4         8 push @data,(enurl_str($key).'='.enurl_str($item->{$key}));
190             }
191             }
192             }
193             } elsif (ref $item eq 'ARRAY') {
194 1         2 my $x;
195 1         3 foreach $x (@$item) {
196 2         4 push @data,enurl_str($x);
197             }
198             } else {
199 3         6 push @data,enurl_str($item);
200             }
201             }
202 7         29 return (join $ParamSeparator, @data);
203             }
204              
205             #sub enurl_str ($);
206             sub enurl_str {
207 16     16 0 26 my($toencode) = @_;
208 16         63 $toencode=~s/([^$KeepUnencoded])/sprintf("%%%02X",ord($1))/ego;
  0         0  
209 16         32 $toencode=~s/ /+/gm;
210 16         61 return $toencode;
211             }
212              
213             #sub enURL ($);
214             sub enURL {
215 0     0 1   my($toencode) = @_;
216 0           $toencode=~s/([^$ParamSeparator$KeepUnencoded])/sprintf("%%%02X",ord($1))/ego;
  0            
217 0           $toencode=~s/ /+/gm;
218 0           return $toencode;
219             }
220              
221             1;
222              
223             =head2 DISCLAIMER
224              
225             The enurl_str function is taken from CGI.pm. (It's named 'escape' there.) Thanks.
226              
227             =head2 AUTHOR
228              
229             Jan Krynicky
230              
231             =head2 COPYRIGHT
232              
233             Copyright (c) 1997-2001 Jan Krynicky . All rights reserved.
234             This program is free software; you can redistribute it and/or
235             modify it under the same terms as Perl itself.
236              
237             =cut
238