5 use URI::Escape qw(uri_unescape);
10 $$self =~ m,^([^?\#]*)(?:\?([^\#]*))?(.*)$,s or die;
16 $q =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
24 # Handle ...?foo=bar&bar=foo type of query
27 my $old = $self->query;
29 # Try to set query string
33 if (ref($n) eq "ARRAY") {
36 elsif (ref($n) eq "HASH") {
41 while (my($key,$vals) = splice(@new, 0, 2)) {
42 $key = '' unless defined $key;
43 $key =~ s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/g;
45 $vals = [ref($vals) eq "ARRAY" ? @$vals : $vals];
46 for my $val (@$vals) {
47 $val = '' unless defined $val;
48 $val =~ s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/g;
50 push(@query, "$key=$val");
53 $self->query(@query ? join('&', @query) : undef);
55 return if !defined($old) || !length($old) || !defined(wantarray);
56 return unless $old =~ /=/; # not a form
57 map { s/\+/ /g; uri_unescape($_) }
58 map { /=/ ? split(/=/, $_, 2) : ($_ => '')} split(/&/, $old);
61 # Handle ...?dog+bones type of query
65 my $old = $self->query;
67 # Try to set query string
69 @copy = @{$copy[0]} if @copy == 1 && ref($copy[0]) eq "ARRAY";
70 for (@copy) { s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/g; }
71 $self->query(@copy ? join('+', @copy) : undef);
73 return if !defined($old) || !defined(wantarray);
74 return if $old =~ /=/; # not keywords, but a form
75 map { uri_unescape($_) } split(/\+/, $old, -1);
78 # Some URI::URL compatibility stuff