[gelöst] HTTPMOD Frage - Konvertierung von non UTF-8 vor dem parsen des JSON

Begonnen von strategy, 13 Januar 2021, 14:54:01

Vorheriges Thema - Nächstes Thema

strategy

Hallo zusammen,

ich habe die folgende Problemstellung:
Ich lese aus meiner TVHeadend Software die geplanten Recordings aus.
Diese Information, kombiniert mit der Anwesenheitskontrolle, verwende ich um mein NAS aufzuwecken und den Antennenverstärker ein oder aus zu schalten. Das hat auch in der Vergangenheit Problemlos funktioniert.
Wie das bei Sachen ist die funktionieren: Die hat man nicht ständig im Auge. Daher ist mit heute morgen aufgefallen das es keine Daten aus der TVHeadend Software mehr gibt.

Die Daten rufe ich über eine REST Schnittstelle ab und der Inhalt ist JSON codiert.
Für den Abruf benutze ich HTTPMOD und für das Auslesen der einzelnen Readings habe ich extractAllJSON auf 1 gesetzt.
Wie gesagt hat genau diese Konfiguration in der Vergangenheit funktioniert.

Leider habe ich zwischenzeitlich mehrer Updates von FHEM und auch TvHeadend gemacht, sodass ich nicht sagen kann welches der beiden Systeme für das Problem verantwortlich ist.
Der Fehler scheint an einem unsauberen Encoding der Inhalte zu liegen. Scheinbar stellt die Quelle (TvHeadend) die Daten nicht im UTF-8 Format zur Verfügung oder die Kodierung ist nicht sauber.

Jedenfalls werden keine Readings mehr erzeugt und im Log findet sich stattdessen folgender Fehler:


2021.01.13 13:48:20 3: tvheadend_test: error while parsing JSON data: malformed UTF-8 character in JSON string, at character offset 542 (before "\x{fffd} Handlungen ...") at lib/FHEM/HTTPMOD/Utils.pm line 668.

2021.01.13 13:48:20 3: tvheadend_test: no parsed JSON structure available



Da ich TvHeadend leider auch nicht beeinflussen kann, habe ich mir die FHEM Seite angeschaut und konnte mit einer kleinen Anpassung am Code das Problem lösen:

(HTTPMOD/Utils.pm Line 668)


     my $decoded = eval { decode_json(encode_utf8($buffer)) };
    #my $decoded = eval { decode_json($buffer) };


Wenn ich die zurückgelieferten Daten zuerst als UTF8 kodiere und dann decode_json aufrufe läuft das Ganze. Der auskommentierte Aufruf läuft bei mir auf einen Fehler.

Ich bin mir bewusst, dass die neue Zeile nicht ganz sauber ist, und möchte auch ungern mit modifiziertem Code arbeiten. Spätestens mit dem nächsten Update macht das keinen Spaß mehr.

Daher die Frage an die Experten:
- Habt Ihr schon mal ein ähnliches Problem gehabt und wie habt Ihr es gelöst?
- Gibt es eventuell schon die Möglichkeit im HTTPMOD mit einem "unwilligen" Encoding umzugehen?
- Habt Ihr Lösungsvorschläge die keine Anpassung des Quellcodes erfordern?

Bitte berücksichtigt bei den Vorschlägen, dass ich das Quellsystem leider nicht beeinflussen kann und mit dem Output leben muss, so wie er ist.

Danke,
Matthias

StefanStrobel

Hallo Matthias,

der Effekt kommt von der automatischen Dekodierung von Content, die in der neuen Version von HTTPMOD aktiv ist.
Ein

attr bodyDecode none


Gruss
   Stefan

strategy