Skip to content

Commit 1c19aaa

Browse files
committed
For [GH #150] - Add $CON->sigil_type_item. Deprecate parse_request_sigils.
1 parent d350647 commit 1c19aaa

File tree

2 files changed

+123
-41
lines changed

2 files changed

+123
-41
lines changed

Lite.pm

+3-41
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ sub prepare_part_handler {
255255

256256
my $trans = $self->open_trans;
257257

258-
my $mapped = [$file, my ($type, $item) = $self->parse_request_sigil($con)];
258+
my $mapped = [$file, my ($type, $item) = $con->sigil_type_item()];
259259
if (not $self->{cf_dont_debug_param}
260260
and -e ".htdebug_param") {
261261
$self->dump($mapped, [map {[$_ => $con->param($_)]} $con->param]);
@@ -274,48 +274,10 @@ sub prepare_part_handler {
274274
($part, $sub, $pkg, \@args);
275275
}
276276

277+
# XXX: deprecated
277278
sub parse_request_sigil {
278279
(my MY $self, my ($con)) = @_;
279-
my ($subpage, $action);
280-
# XXX: url_param
281-
foreach my $name (grep {defined} $con->param()) {
282-
my ($sigil, $word) = $name =~ /^([~!])(\1|\w*)$/
283-
or next;
284-
# If $name in ('~~', '!!'), use value.
285-
my $new = $word eq $sigil ? $con->param($name) : $word;
286-
# else use $word from ~$word.
287-
# Note: $word may eq ''. This is for render_/action_.
288-
given ($sigil) {
289-
when ('~') {
290-
if (defined $subpage) {
291-
$self->error("Duplicate subpage request! %s vs %s"
292-
, $subpage, $new);
293-
}
294-
$subpage = $new;
295-
}
296-
when ('!') {
297-
if (defined $action) {
298-
$self->error("Duplicate action! %s vs %s"
299-
, $action, $new);
300-
}
301-
$action = $new;
302-
}
303-
default {
304-
croak "Really?";
305-
}
306-
}
307-
}
308-
if (defined $subpage and defined $action) {
309-
# XXX: Reserved for future use.
310-
$self->error("Can't use subpage and action at one time: %s vs %s"
311-
, $subpage, $action);
312-
} elsif (defined $subpage) {
313-
(page => $subpage);
314-
} elsif (defined $action) {
315-
(action => $action);
316-
} else {
317-
();
318-
}
280+
$con->sigil_type_item();
319281
}
320282

321283
sub cut_ext {

Lite/WebMVC0/Connection.pm

+120
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ use YATT::Lite::MFields
1818
dir_config_cache
1919
_site_config_is_examined
2020
21+
_sigil_type_item
22+
2123
current_user
2224
/);
2325
use YATT::Lite::Util qw(globref url_encode nonempty empty rootname lexpand);
@@ -139,6 +141,114 @@ sub multi_param {
139141
}
140142
}
141143

144+
#========================================
145+
146+
sub sigil_type_item {
147+
my PROP $prop = (my $glob = shift)->prop;
148+
149+
@{$prop->{_sigil_type_item} // []};
150+
}
151+
152+
sub collect_request_sigil_by {
153+
my ($glob, $cutter, @list) = @_;
154+
my %dict;
155+
foreach my $name (grep {defined} @list) {
156+
my ($sigil, $word) = $name =~ /^([~!])(\1|\w*)$/
157+
or next;
158+
defined (my $value = $cutter->($name))
159+
or next;
160+
push @{$dict{$sigil}}, do {
161+
if ($sigil eq $word) {
162+
$value;
163+
} else {
164+
$word;
165+
}
166+
};
167+
};
168+
\%dict;
169+
}
170+
171+
sub parse_request_sigil_psgi {
172+
my PROP $prop = (my $glob = shift)->prop;
173+
my ($req) = @_;
174+
175+
176+
my Env $env = $prop->{cf_env};
177+
178+
$prop->{_sigil_type_item} = do {
179+
if ($env->{CONTENT_TYPE} and defined $env->{CONTENT_LENGTH}) {
180+
my @bodyParams = $glob->extract_sigil_from_hmv($req->body_parameters);
181+
my @queryParams = $glob->extract_sigil_from_hmv($req->query_parameters);
182+
if (@bodyParams) {
183+
\@bodyParams
184+
} else {
185+
\@queryParams
186+
}
187+
} else {
188+
[$glob->extract_sigil_from_hmv($req->parameters)];
189+
}
190+
};
191+
}
192+
193+
sub extract_sigil_from_hmv {
194+
my ($glob, $hmv) = @_;
195+
196+
my $sigilsDict = $glob->collect_request_sigil_by(
197+
sub {
198+
my $value = $hmv->{$_[0]};
199+
$hmv->remove($_[0]);
200+
$value;
201+
}, $hmv->keys);
202+
$glob->validate_request_sigils_dict($sigilsDict);
203+
}
204+
205+
sub parse_request_sigil_cgi {
206+
my PROP $prop = (my $glob = shift)->prop;
207+
my ($cgi) = @_;
208+
my $sigilsDict = $glob->collect_request_sigil_by(
209+
sub {
210+
my $value = $cgi->param($_[0]);
211+
$cgi->delete($_[0]);
212+
$value;
213+
}, $cgi->param());
214+
$prop->{_sigil_type_item}
215+
= [$glob->validate_request_sigils_dict($sigilsDict)];
216+
}
217+
218+
sub validate_request_sigils_dict {
219+
my PROP $prop = (my $glob = shift)->prop;
220+
my ($sigilsDict) = @_;
221+
222+
my ($subpage, $action);
223+
if (my $names = $sigilsDict->{'~'}) {
224+
if (@$names >= 2) {
225+
$glob->error("Multiple subpage sigils in request!: %s"
226+
, join(", ", @$names));
227+
}
228+
$subpage = $names->[0];
229+
}
230+
if (my $names = $sigilsDict->{'!'}) {
231+
if (@$names >= 2) {
232+
$glob->error("Multiple action sigils in request!: %s"
233+
, join(", ", @$names));
234+
}
235+
$action = $names->[0];
236+
}
237+
if (defined $subpage and defined $action) {
238+
# XXX: Reserved for future use.
239+
$glob->error("Can't use subpage and action at one time: %s vs %s"
240+
, $subpage, $action);
241+
} elsif (defined $subpage) {
242+
(page => $subpage);
243+
} elsif (defined $action) {
244+
(action => $action);
245+
} else {
246+
();
247+
}
248+
}
249+
250+
#========================================
251+
142252
sub queryobj {
143253
my PROP $prop = (my $glob = shift)->prop;
144254
$prop->{cf_parameters} || $prop->{cf_hmv} || $prop->{cf_cgi};
@@ -191,6 +301,16 @@ sub configure_cgi {
191301
$prop->{cf_cgi} = my $cgi = shift;
192302
return unless $glob->is_form_content_type($cgi->content_type);
193303
return if $prop->{cf_parameters};
304+
305+
#
306+
# parse_request_sigil should be called before parse_nested_query.
307+
#
308+
if ($prop->{cf_is_psgi}) {
309+
$glob->parse_request_sigil_psgi($cgi);
310+
} else {
311+
$glob->parse_request_sigil_cgi($cgi);
312+
}
313+
194314
unless ($prop->{cf_no_nested_query}) {
195315
if ($prop->{cf_is_psgi}) {
196316
$glob->convert_array_param_psgi($cgi);

0 commit comments

Comments
 (0)