#33547 fix(confluence): stop fetching external DTD in repairPageContent#10
Open
micharoesler wants to merge 1 commit into
Open
#33547 fix(confluence): stop fetching external DTD in repairPageContent#10micharoesler wants to merge 1 commit into
micharoesler wants to merge 1 commit into
Conversation
DOMDocument::validate() validated the page content against the HTML 4.0 loose DTD referenced in its doctype, forcing an outbound HTTP request to w3.org on every page download. In environments without outbound internet access that request failed and PHP emitted: DOMDocument::validate(http://www.w3.org/TR/REC-html40/loose.dtd): Failed to open stream: HTTP request failed! The validation had no functional value (Confluence storage format is never valid HTML 4.0, so it always returned false and the body-extraction branch ran regardless). Remove the validate() call and always strip the document wrapper to the body inner HTML, eliminating the spurious network dependency and the warning. Also guard empty content, which otherwise threw an uncaught ValueError from loadHTML(), and pass LIBXML_NONET as defence in depth. Adds an offline regression test. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
marcreichel
approved these changes
Jul 12, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Zusammenfassung
Behebt die PHP-Warnung aus artemeon/core-ng#33547:
Problem
Beim Herunterladen von Seiteninhalten normalisiert
ConfluencePageContentDownloader::repairPageContent()das HTML mittelsDOMDocument. Dabei wurdeDOMDocument::validate()aufgerufen. Diese Methode validiert das Dokument gegen die im Doctype referenzierte DTD – bei Confluence-Inhalten ist das die HTML-4.0-Transitional-DTD unter der URLhttp://www.w3.org/TR/REC-html40/loose.dtd.Dadurch löste jeder Seiten-Download einen ausgehenden HTTP-Request an w3.org aus, um diese DTD (~45 KB) zu laden. In abgeschotteten Umgebungen ohne ausgehenden Internetzugang (z. B. beim betroffenen Kunden DZ Privatbank) schlägt dieser Request fehl, und PHP gibt die oben genannte Warnung aus.
libxml_use_internal_errors(true)unterdrückt das nicht, da es sich um eine Warnung des PHP-Stream-Wrappers und nicht um einen libxml-Fehler handelt.Warum wir den Code ändern und nicht die Umgebung
Es handelt sich nicht um ein reines Umgebungsproblem, sondern um einen Fehler im Code:
validate()-Aufruf hat hier keinen funktionalen Nutzen. Sein Rückgabewert steuerte lediglich, ob der Body-Inhalt extrahiert wird. Confluence-Storage-Format ist nie gültiges HTML 4.0 (es enthält eigene<ac:...>-Tags), daher liefertevalidate()faktisch immerfalseund der Extraktions-Zweig lief ohnehin. Das Entfernen ist für alle realen Eingaben verhaltensneutral.Die fehlende Netzwerkverbindung in der Kundenumgebung legt den latenten Fehler lediglich offen. Eine Umgebungslösung (Freischaltung von w3.org) würde die überflüssige Abhängigkeit nur kaschieren – die falsche Ebene. Eine Offline-HTML-Bereinigung darf keinen Internetzugang voraussetzen.
Änderungen
DOMDocument::validate()entfernt; der Dokument-Wrapper wird nun immer auf das Body-Inner-HTML reduziert (das Verhalten, das bisher faktisch ohnehin lief).ValueErrorausloadHTML('')aus (separater latenter Fehler in derselben Methode).LIBXML_NONETbeim Parsen als zusätzliche Absicherung gegen Netzwerkzugriffe.Alle Tests grün (22 Tests, 55 Assertions), PHPStan ohne Fehler.
Nach dem Merge
Jede:r aus dem Team kann diesen PR mergen – muss danach aber auch die folgenden Schritte durchführen (mit dem Merge allein ist es nicht getan).
Der eigentliche Fehler liegt in dieser Library (
artemeon/confluence), nicht inartemeon/core-ng.core-ngkonsumiert diese Library als Composer-Abhängigkeit. Daher nach dem Merge in dieser Reihenfolge:artemeon/confluencetaggenartemeon/core-ngaktualisieren, damit der Fix dort greiftCloses artemeon/core-ng#33547