2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-01 19:30:31 +00:00

98_HTTPMOD.pm: another bugfix concerning precompiled regexes with options

git-svn-id: https://svn.fhem.de/fhem/trunk@20653 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
StefanStrobel 2019-12-03 18:44:30 +00:00
parent eefc058a78
commit 5d73706160

View File

@ -169,7 +169,8 @@
# 2019-11-11 modified precompilation of regexes to better support regex options # 2019-11-11 modified precompilation of regexes to better support regex options
# 2019-11-17 remove unused function, reformat # 2019-11-17 remove unused function, reformat
# 2019-11-19 little bug fixes # 2019-11-19 little bug fixes
# 2019-11-20 precompilation of preProcessRegex removed - needs more testing before a release # 2019-11-20 precompilation of preProcessRegex removed - can't compile a regex inluding a replacement part for s//
# 2019-11-29 new fix for special compiled regexes with regex options
# #
# #
@ -241,7 +242,7 @@ sub HTTPMOD_AddToQueue($$$$$;$$$$$);
sub HTTPMOD_JsonFlatter($$;$); sub HTTPMOD_JsonFlatter($$;$);
sub HTTPMOD_ExtractReading($$$$$); sub HTTPMOD_ExtractReading($$$$$);
my $HTTPMOD_Version = '3.5.18 - 20.11.2019'; my $HTTPMOD_Version = '3.5.19 - 29.11.2019';
# #
# FHEM module intitialisation # FHEM module intitialisation
@ -2003,11 +2004,12 @@ sub HTTPMOD_ExtractReading($$$$$)
@matchlist = (join ",", @matchlist); # old syntax returns only one value @matchlist = (join ",", @matchlist); # old syntax returns only one value
} else { # normal regex } else { # normal regex
$regopt =~ s/[^gceor]//g if ($regopt); # remove anything but gceor options - rest is already compiled in
if ($regopt) { if ($regopt) {
$regopt =~ s/[^gceor]//g; # remove anything but gceor options - rest is already compiled in
Log3 $name, 5, "$name: ExtractReading $reading with regex /$regex/$regopt ..."; Log3 $name, 5, "$name: ExtractReading $reading with regex /$regex/$regopt ...";
eval '@matchlist = ($buffer =~ /' . "$regex/$regopt" . ')'; #eval '@matchlist = ($buffer =~ /' . "$regex/$regopt" . ')'; # so geht es nicht bei speziellen Regexes
Log3 $name, 3, "$name: error in regex matching with regex option: $@" if ($@); eval "\@matchlist = (\$buffer =~ /\$regex/$regopt)";
Log3 $name, 3, "$name: error in regex matching (with regex option $regopt): $@" if ($@);
%namedRegexGroups = %+ if (%+); %namedRegexGroups = %+ if (%+);
} else { } else {
Log3 $name, 5, "$name: ExtractReading $reading with regex /$regex/..."; Log3 $name, 5, "$name: ExtractReading $reading with regex /$regex/...";
@ -2774,7 +2776,11 @@ sub HTTPMOD_Read($$$)
} }
my $ppr = AttrVal($name, "preProcessRegex", ""); my $ppr = AttrVal($name, "preProcessRegex", "");
#my $ppr = HTTPMOD_GetRegex($name, "", "", "preProcessRegex", ""); # klappt so einfach nicht -> intensiveres debugging wegen s// nötig # can't precompile a whole substitution so the GetRegex way doesn't work here.
# we would need to split the regex into match/replace part and only compile the matching part ...
# if a user s affected by Perl's memory he leak he might just add option a to his regex attr
#Log3 $name, 5, "$name: Read preProcessRegex is $ppr";
if ($ppr) { if ($ppr) {
my $pprexp = '$body=~' . $ppr; my $pprexp = '$body=~' . $ppr;
my $oldSig = ($SIG{__WARN__} ? $SIG{__WARN__} : 'DEFAULT'); my $oldSig = ($SIG{__WARN__} ? $SIG{__WARN__} : 'DEFAULT');