httpmod/utils.pm

Begonnen von postman, 15 März 2021, 10:39:52

Vorheriges Thema - Nächstes Thema

CoolTux

ok es ist definitiv das bodyDecode
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

xenos1984

In der Tat, wenn kein Charset-Header gefunden wird, wird $bodyCharset auf "not found" gesetzt:


718     if ($header =~/Content-Type:.*charset=([\w\-\.]+)/i) {
719         $bodyCharset = $1;
720         $hash->{'.bodyCharset'} = $bodyCharset;
721     }
722     else {
723         $bodyCharset = 'not found';
724         delete $hash->{'.bodyCharset'};
725     }


Dies wird später aber nur dann überprüft, wenn bei bodyDecode "auto" gewählt wird:


733     elsif ($bodyDecode =~ m{\A [Aa]uto \z}xms) {
734         if ($bodyCharset eq 'not found') {
735             Log3 $name, 4, "$name: BodyDecode is not decoding the response body (charset header not found, bodyDecode set to auto)";
736         }
737         else {
738             Log3 $name, 4, "$name: BodyDecode is decoding the response body as $bodyCharset (charset header $bodyCharset, bodyDecode set to auto)";
739             $decoding = $bodyCharset;
740         }     
741     }


Wenn ein anderer Wert eingestellt wurde, wird stur der Wert für $bodyCharset genommen:


746     else {
747         Log3 $name, 4, "$name: BodyDecode is decoding the response body as $bodyDecode but charset header is $bodyCharset";
748         $decoding = $bodyCharset;
749     }


...und wenn da "not found" steht, beschwert sich decode und führt zum Crash:


751     if ($decoding) {
752         $body = decode($decoding, $body);
753         $hash->{'.bodyCharset'} = 'internal';
754         #Log3 $name, 5, "$name: BodyDecode " . ($body ? "new body as utf-8 is: \n" . encode ('utf-8', $body) : "body empty");
755     }

CoolTux

--- fhem-code/lib/FHEM/HTTPMOD/Utils.pm 2021-03-16 19:40:33.942253518 +0100
+++ Utils.pm 2021-03-16 20:12:02.178458928 +0100
@@ -730,19 +730,19 @@
     elsif ($bodyDecode eq 'default') {
         Log3 $name, 4, "$name: BodyDecode is not decoding the response body (charset $bodyCharset, bodyDecode defaults to none)";
     }
-    elsif ($bodyDecode =~ m{\A [Aa]uto \z}xms) {
-        if ($bodyCharset eq 'not found') {
-            Log3 $name, 4, "$name: BodyDecode is not decoding the response body (charset header not found, bodyDecode set to auto)";
-        }
-        else {
-            Log3 $name, 4, "$name: BodyDecode is decoding the response body as $bodyCharset (charset header $bodyCharset, bodyDecode set to auto)";
-            $decoding = $bodyCharset;
-        }     
+    elsif ($bodyDecode =~ m{\A [Aa]uto \z}xms
+        && $bodyCharset ne 'not found' )
+    {
+        Log3 $name, 4, "$name: BodyDecode is decoding the response body as $bodyCharset (charset header $bodyCharset, bodyDecode set to auto)";
+        $decoding = $bodyCharset;
     }
     elsif (lc($bodyDecode) eq lc($bodyCharset)) {
         Log3 $name, 4, "$name: BodyDecode is decoding the response body as $bodyDecode";   
         $decoding = $bodyCharset;
-    }
+    }
+    elsif ($bodyCharset eq 'not found') {
+        Log3 $name, 4, "$name: BodyDecode is not decoding the response body (charset header not found, bodyDecode set to auto)";
+    }
     else {
         Log3 $name, 4, "$name: BodyDecode is decoding the response body as $bodyDecode but charset header is $bodyCharset";
         $decoding = $bodyCharset;


Meine Lösung.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Habe Stefan gerade geschrieben. Mal schauen ob er sich da heute noch drum kümmern kann.

Du kannst wenn Du es Dir zu traust den Patch mal testen oder entfernst das Attribut bodyDecode vorerst
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

StefanStrobel

Hallo,

ich glaube es war nur ein kleiner Tippfehler. Wenn bodyDecode auf utf8 steht, dann soll ja utf8 verwendet werden. Egal was im character-Header steht.
Zeile 748 muss also $decoding = $bodyDecode; lauten.

Probiert doch bitte mal die angehängte Version. Fhem muss nach dem Einspielen neu gestartet werden, sonst läd es die Utils nicht neu.
Wenn es funktioniert, checke ich die Version morgen gleich ein.

Gruss
   Stefan

CoolTux

Habe gerade geschaut. Ja das war auch einer meiner ersten Gedanken, wusste aber nicht genau ob oder nicht da die falsche Variable genommen wurde. So ergibt es aber mehr Sinn.
Aber schon interessant das es überhaupt aufgefallen ist.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

postman

Hallo zusammen,
ich habe die von Stefan angehängte utils.pm in das lib/FHEM/HTTPMOD Verzeichnis kopiert und FHEM neu gestartet.
Nach einem "shutdown restart" funktioniert es bis jetzt jedenfalls.
Zum Testen habe ich erst einmal nur mein TestFHEM verwendet.
Das bodyDecode utf8 benötige ich, damit Umlaute richtig dargestellt werden (Den Tipp hab ich übrigens von Stefan :))
@Stefan: Ich melde mich morgen noch mal und berichte, ob FHEM jetzt zumindest auf dem TestFHEM ohne Probleme wieder läuft; kannst Du solange mit dem einschecken der neuen utils.pm warten? Kommt je wohl nicht auf einen Tag an oder?

Gruß
Raspberry Pi Version 2 QUAD-CORE CPU und 1 GB RAM, CUL V3 868 MHz,  stapelbarer CC1101 (SCC) 433 MHz, Enocean-Stick,Jeelink-Stick, BSB-Lanadapter

Spruch eines Ausbilders: Theorie ist, wenn man alles weiss und nichts funktioniert; Praxis ist, wenn alles funktioniert und keiner weiss warum...

postman

Hallo zusammen,
mit der utils.pm, die StefanStrobel gestern hier angehängt hat, funktioniert FHEM wieder ohne Störungen.
Herzlichen Dank für eure Hilfe.
@StefanStrobel: Du kannst die utils.pm gern einschecken, falls Du es noch nicht getan hast ;)
Ansonsten; tolle Arbeit, die ihr da macht.
Mal eine Frage out of topik: gibt es soetwas wie das HTTPMOD.pm auch für die serielle Schnittstelle, mit der auf einfache Weise so ähnliche Abfragen wie mit HTTPMOD erstellt werden können? ECMD und ECMDDevice finde ich zu kompliziert  und funktionieren auch nicht wirklich so, wie ich es bräuchte. Ich scheine auch nicht der einzige zu sein, der so etwas brauchen könnte.
Gruß und noch mal Danke
Raspberry Pi Version 2 QUAD-CORE CPU und 1 GB RAM, CUL V3 868 MHz,  stapelbarer CC1101 (SCC) 433 MHz, Enocean-Stick,Jeelink-Stick, BSB-Lanadapter

Spruch eines Ausbilders: Theorie ist, wenn man alles weiss und nichts funktioniert; Praxis ist, wenn alles funktioniert und keiner weiss warum...

StefanStrobel

Hallo,

ich habe es jetzt eingecheckt.

So was wie HTTPMOD für serielle Leitungen hatte ich mir vor ein paar Jahren auch mal überlegt, aber dann wieder verworfen.
Letztlich waren doch alle meine Geräte so speziell, dass ich ein eigenes dediziertes Modul dafür geschrieben habe.
Das Problem fängt bei Frame-Formaten an, geht über Prüfsummen, Feldtrennungen etc.

Gruss
   Stefan