parted ParseHttpResponse fn

This commit is contained in:
Marko Oldenburg 2023-01-03 13:42:10 +01:00
parent 396d69c3f6
commit e21ff5a462

View File

@ -915,16 +915,6 @@ sub _createParamRefForDef {
},
};
::Log( 1,
'!!!DEBUG - MsgcreateParamRef: ' . $paramref->{$def}->{$paramValue} );
::Log( 1,
'!!!DEBUG - Def: '
. $def
. ' ParamValue: '
. $paramValue
. ' Resp: '
. $paramref->{$def}->{$paramValue} );
return (
exists( $paramref->{$def}->{$paramValue} )
&& $paramref->{$def}->{$paramValue}
@ -1160,49 +1150,39 @@ qq($name $param->{'msgnumber'} $def Request Busy/Sync $hash->{helper}->{busy} /
return;
}
sub ParseHttpResponse {
#(CoolTux) hier solltest Du überlegen das Du die einzelnen Anweisung nach der Bedingung in einzelne Funktionen auslagerst
# Subroutine "_PerformHttpRequest" with high complexity score
#(Man-Fred) da ich noch nicht wusste wie ähnlich die Ergebnisse sind habe ich erst mal alles zusammen ausgewertet
sub _ParseHttpResponseWithError {
return 0
unless ( __PACKAGE__ eq caller(0) )
; # nur das eigene Package darf private Funktionen aufrufen (CoolTux)
my $hash = shift;
my $param = shift;
my $err = shift;
my $data = shift;
#::Log( 1, '!!!DEBUG!!! - Error: ' . $err );
#::Log( 1, '!!!DEBUG!!! - Param: ' . Dumper $param);
#::Log( 1, '!!!DEBUG!!! - Data: ' . Dumper $data);
#return;
my $hash = $param->{hash};
my $def = $param->{def};
my $value = $param->{value};
my $name = $hash->{NAME};
my $now = gettimeofday();
my $nextRequest = "";
Log3( $name, 3,
qq($name $param->{'msgnumber'} $def Result $param->{code}) );
readingsBeginUpdate($hash);
###readingsBulkUpdate($hash, "httpHeader", $param->{httpheader});
readingsBulkUpdate( $hash, 'httpStatus', $param->{code} );
readingsBulkUpdate( $hash, 'state', $def . ' - ' . $param->{code} );
if ( $err ne "" ) { # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
Log3( $name, 2, "error while requesting " . $param->{url} . " - $err" )
; # Eintrag fürs Log
readingsBulkUpdate( $hash, 'lastRespErr', $err ); # Reading erzeugen
readingsBulkUpdate( $hash, 'state',
'Error - look lastRespErr reading' );
readingsBulkUpdate( $hash, 'state', 'Error - look lastRespErr reading' );
$hash->{helper}->{softfail} = 3;
$hash->{helper}->{hardfail}++;
return;
}
elsif ( $data ne '' )
{ # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
Log3( $name, 4, $def . " returned: $data" ); # Eintrag fürs Log
my $decoded = eval { decode_json($data) };
Log3( $name, 2, "$name: json error: $@ in data" ) if ($@);
sub _ParseHttpResponseErrorCodeCheck {
return 0
unless ( __PACKAGE__ eq caller(0) )
; # nur das eigene Package darf private Funktionen aufrufen (CoolTux)
my $param = shift;
my $data = shift;
my $now = shift;
my $hash = $param->{hash};
my $name = $hash->{NAME};
if ( $param->{code} == 200 ) {
$hash->{helper}->{softfail} = 0;
@ -1215,21 +1195,29 @@ sub ParseHttpResponse {
readingsBulkUpdate( $hash, 'lastRespErr',
qq(S $hash->{helper}->{'softfail'}: $data) );
Log3( $name, 5,
qq($name $hash->{helper}->{access_token} ${def}End $param->{'msgnumber'}: $hash->{helper}->{next_refresh} > $now)
qq($name $hash->{helper}->{access_token} $param->{def}End $param->{'msgnumber'}: $hash->{helper}->{next_refresh} > $now)
);
}
# readingsBulkUpdate($hash, "fullResponse", $data);
return;
}
# default next request
$nextRequest = 'sync';
sub _ParseHttpResponseM_UNKNOWN_TOKEN {
return 0
unless ( __PACKAGE__ eq caller(0) )
; # nur das eigene Package darf private Funktionen aufrufen (CoolTux)
# An dieser Stelle die Antwort parsen / verarbeiten mit $data
my $param = shift;
my $decoded = shift;
my $nextRequest = shift;
my $hash = $param->{hash};
# "errcode":"M_UNKNOWN_TOKEN: login or refresh
my $errcode = $decoded->{'errcode'} ? $decoded->{'errcode'} : '';
if ( $errcode eq 'M_UNKNOWN_TOKEN' ) {
$hash->{helper}->{'repeat'} = $param if ( $def ne 'sync' );
$hash->{helper}->{'repeat'} = $param
if ( $param->{def} ne 'sync' );
if ( $decoded->{'error'} eq 'Access token has expired' ) {
if ( $decoded->{'soft_logout'} eq 'true' ) {
$nextRequest = 'refresh';
@ -1243,27 +1231,33 @@ qq($name $hash->{helper}->{access_token} ${def}End $param->{'msgnumber'}: $hash-
}
}
if ( $def eq 'register' ) {
$hash->{helper}->{session} = $decoded->{session};
$nextRequest = ''; #'reg2';
return $nextRequest;
}
$hash->{helper}->{session} = $decoded->{session}
if ( $decoded->{'session'} );
readingsBulkUpdate( $hash, 'session', $decoded->{session} )
if ( $decoded->{'session'} );
if ( $def eq 'reg2' || $def eq 'login' || $def eq 'refresh' ) {
sub _ParseHttpResponseReg2LoginRefresh {
return 0
unless ( __PACKAGE__ eq caller(0) )
; # nur das eigene Package darf private Funktionen aufrufen (CoolTux)
my $param = shift;
my $decoded = shift;
my $now = shift;
my $hash = $param->{hash};
my $name = $hash->{NAME};
my $def = $param->{def};
readingsBulkUpdate( $hash, 'lastRegister', $param->{code} )
if $def eq 'reg2';
readingsBulkUpdate( $hash, 'lastLogin', $param->{code} )
if $def eq 'login';
readingsBulkUpdate( $hash, 'lastRefresh', $param->{code} )
if $def eq 'refresh';
if ( $param->{code} == 200 ) {
readingsBulkUpdate( $hash, 'userId', $decoded->{user_id} )
if ( $decoded->{user_id} );
readingsBulkUpdate( $hash, 'homeServer',
$decoded->{homeServer} )
readingsBulkUpdate( $hash, 'homeServer', $decoded->{homeServer} )
if ( $decoded->{homeServer} );
readingsBulkUpdate( $hash, 'deviceId', $decoded->{device_id} )
if ( $decoded->{device_id} );
@ -1278,15 +1272,29 @@ qq($name $hash->{helper}->{access_token} ${def}End $param->{'msgnumber'}: $hash-
$now + $hash->{helper}->{expires} / 1000 -
60; # refresh one minute before end
}
Log3( $name, 5,
qq($name $hash->{helper}->{access_token} refreshEnd $param->{msgnumber}: $hash->{helper}->{'next_refresh'} > $now)
);
}
if ( $def eq "wellknown" ) {
# https://spec.matrix.org/unstable/client-server-api/
return;
}
if ( $param->{code} == 200 && $def eq "sync" ) {
sub _ParseHttpResponseSync {
return 0
unless ( __PACKAGE__ eq caller(0) )
; # nur das eigene Package darf private Funktionen aufrufen (CoolTux)
my $param = shift;
my $decoded = shift;
my $nextRequest = shift;
my $now = shift;
my $hash = $param->{hash};
my $name = $hash->{NAME};
given ( $param->{code} ) {
when (200) {
Log3( $name, 5,
qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{helper}->{'next_refresh'} > $now)
);
@ -1326,8 +1334,8 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{
if ( $ev->{type} eq 'm.room.member' );
}
readingsBulkUpdate( $hash, 'room' . $pos . '.member',
$member );
readingsBulkUpdate( $hash,
'room' . $pos . '.member', $member );
for my $tl ( $list->{$id}->{timeline}->{events}->@* ) {
readingsBulkUpdate(
@ -1346,13 +1354,14 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{
&& $tl->{content}->{msgtype} eq 'm.text' )
{
my $sender = $tl->{sender};
my $message = encode_utf8( $tl->{content}->{body} );
my $message =
encode_utf8( $tl->{content}->{body} );
if ( AttrVal( $name, 'matrixSender', '' ) =~
$sender )
{
readingsBulkUpdate( $hash, "message",
$message );
readingsBulkUpdate( $hash,
"message", $message );
readingsBulkUpdate( $hash, "sender", $sender );
# command
@ -1389,8 +1398,8 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{
if ( AttrVal( $name, 'matrixSender', '' ) =~
$sender )
{
readingsBulkUpdate( $hash, 'message',
$message );
readingsBulkUpdate( $hash,
'message', $message );
readingsBulkUpdate( $hash, 'sender', $sender );
$nextRequest = 'questionEnd';
@ -1406,8 +1415,19 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{
}
}
}
}
return;
}
sub _ParseHttpResponseLogintypes {
return 0
unless ( __PACKAGE__ eq caller(0) )
; # nur das eigene Package darf private Funktionen aufrufen (CoolTux)
my $hash = shift;
my $decoded = shift;
if ( $def eq 'logintypes' ) {
my $types = '';
foreach my $flow ( $decoded->{'flows'}->@* ) {
if ( $flow->{'type'} =~ /m\.login\.(.*)/x ) {
@ -1418,28 +1438,110 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{
}
readingsBulkUpdate( $hash, 'logintypes', $types );
return;
}
if ( $def eq 'filter' ) {
sub ParseHttpResponse {
#(CoolTux) hier solltest Du überlegen das Du die einzelnen Anweisung nach der Bedingung in einzelne Funktionen auslagerst
# Subroutine "_PerformHttpRequest" with high complexity score
#(Man-Fred) da ich noch nicht wusste wie ähnlich die Ergebnisse sind habe ich erst mal alles zusammen ausgewertet
my $param = shift;
my $err = shift;
my $data = shift;
my $hash = $param->{hash};
my $def = $param->{def};
my $value = $param->{value};
my $name = $hash->{NAME};
my $now = gettimeofday();
my $nextRequest = "";
Log3( $name, 3,
qq($name $param->{'msgnumber'} $def Result $param->{code}) );
readingsBeginUpdate($hash);
###readingsBulkUpdate($hash, "httpHeader", $param->{httpheader});
readingsBulkUpdate( $hash, 'httpStatus', $param->{code} );
readingsBulkUpdate( $hash, 'state', $def . ' - ' . $param->{code} );
if ( $err ne '' ) { # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
_ParseHttpResponseWithError( $hash, $param, $err );
}
elsif ( $data ne '' )
{ # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
Log3( $name, 4, $def . " returned: $data" ); # Eintrag fürs Log
my $decoded = eval { decode_json($data) };
if ($@) {
Log3( $name, 2, "$name: json error: $@ in data" );
}
_ParseHttpResponseErrorCodeCheck( $param, $data, $now );
# readingsBulkUpdate($hash, "fullResponse", $data);
# default next request
$nextRequest = 'sync';
# An dieser Stelle die Antwort parsen / verarbeiten mit $data
# "errcode":"M_UNKNOWN_TOKEN: login or refresh
$nextRequest =
_ParseHttpResponseM_UNKNOWN_TOKEN( $param, $decoded, $nextRequest );
given ($def) {
when ('register') {
$hash->{helper}->{session} = $decoded->{session};
$nextRequest = ''; #'reg2';
}
$hash->{helper}->{session} = $decoded->{session}
if ( $decoded->{'session'} );
readingsBulkUpdate( $hash, 'session', $decoded->{session} )
if ( $decoded->{'session'} );
when (/^reg2|login|refresh$/x) {
_ParseHttpResponseReg2LoginRefresh( $param, $decoded, $now );
}
when ('wellknown') {
# https://spec.matrix.org/unstable/client-server-api/
}
when ('sync') {
_ParseHttpResponseSync( $param, $decoded, $nextRequest, $now );
}
when ('logintypes') {
_ParseHttpResponseLogintypes( $hash, $decoded );
}
when ('filter') {
readingsBulkUpdate( $hash, 'filterId', $decoded->{'filter_id'} )
if ( $decoded->{'filter_id'} );
}
if ( $def eq 'msg' ) {
when ('msg') {
readingsBulkUpdate( $hash, 'eventId', $decoded->{'event_id'} )
if ( $decoded->{'event_id'} );
#m.relates_to
}
if ( $def eq 'question' ) {
readingsBulkUpdate( $hash, 'questionId', $decoded->{'event_id'} )
when ('question') {
readingsBulkUpdate( $hash, 'questionId',
$decoded->{'event_id'} )
if ( $decoded->{'event_id'} );
#m.relates_to
}
if ( $def eq 'questionEnd' ) {
when ('questionEnd') {
readingsBulkUpdate( $hash, 'eventId', $decoded->{'event_id'} )
if ( $decoded->{'event_id'} );
readingsBulkUpdate( $hash, 'questionId', '' )
@ -1448,10 +1550,7 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{
#m.relates_to
}
::Log( 1,
'!!!DEBUG - TOKEN aus Hash: ' . $hash->{helper}->{access_token} );
::Log( 1, '!!!DEBUG - TOKEN aus Decode: ' . $decoded->{access_token} )
if ( $decoded->{access_token} );
}
}
readingsEndUpdate( $hash, 1 );
@ -1465,6 +1564,23 @@ qq($name $hash->{helper}->{"access_token"} syncEnd $param->{msgnumber}: $hash->{
; # only one sync at a time!
# _PerformHttpRequest or InternalTimer if FAIL >= 3
_PerformHttpRequestOrInternalTimerFAIL( $hash, $def, $value, $nextRequest );
return;
}
sub _PerformHttpRequestOrInternalTimerFAIL {
return 0
unless ( __PACKAGE__ eq caller(0) )
; # nur das eigene Package darf private Funktionen aufrufen (CoolTux)
my $hash = shift;
my $def = shift;
my $value = shift;
my $nextRequest = shift;
my $name = $hash->{NAME};
Log3( $name, 4, "$name : Matrix::ParseHttpResponse $hash" );
if ( AttrVal( $name, 'matrixPoll', 0 ) == 1 ) {
if ( $nextRequest ne '' && $hash->{helper}->{softfail} < 3 ) {