Aggiungere una profondità di annidamento massima per i dettagli comprimibili

Vorrei suggerire di aggiungere una profondità massima di annidamento per la funzione integrata [details], oppure di introdurre un’impostazione del sito che consenta agli amministratori di configurare questo limite.

Il problema

Recentemente, un utente del mio forum Discourse ha creato un post contenente 24 livelli di sezioni [details] annidate.

Ciò ha causato diversi problemi:

  1. Prestazioni del browser: Gli utenti hanno segnalato che l’espansione di più livelli causava a Firefox di diventare estremamente lento o non reattivo.
  2. Timeout dell’endpoint Markdown: L’accesso all’endpoint .md del topic diventava estremamente lento. Abbiamo osservato richieste che richiedevano 19,8 secondi e 31,1 secondi.
  3. Errori del server: L’endpoint Markdown a volte restituiva una pagina di errore “Oops”. I log di Discourse mostravano anche avvisi di timeout dei worker Pitchfork durante la conversione Markdown.
  4. Possibile esaurimento delle risorse: Poiché i motori di ricerca e i crawler AI richiedono frequentemente gli endpoint .md, un post profondamente annidato potrebbe ripetutamente attivare elaborazioni costose e consumare risorse del server.

Dopo la rimozione del post problematico, l’endpoint Markdown ha restituito HTTP 200 e ha risposto in circa 1,7 secondi.

Il topic interessato era:

https://meta.appinn.net/t/topic/87672

(La risposta problematica è stata già rimossa.)

Miglioramento suggerito

Credo sarebbe utile:

  • Limitare l’annidamento di [details] a una profondità ragionevole, come 2 o 3 livelli.
  • Aggiungere un’impostazione del sito, come details_max_nesting_depth, che consenta agli amministratori di configurare la profondità massima di annidamento.

Per la compatibilità retroattiva, l’impostazione potrebbe essere illimitata per impostazione predefinita, consentendo agli amministratori di applicare un limite quando necessario.

Se gli utenti superano il limite configurato, Discourse potrebbe rifiutare il post con un chiaro messaggio di validazione.

Soluzione temporanea: un plugin

Ho creato un piccolo plugin che limita l’annidamento di [details] a un massimo di 2 livelli:

GitHub - scavin/discourse-details-depth-limit · GitHub

Il plugin valida i post lato server e rifiuta i post contenenti più di due livelli di sezioni richiudibili annidate.

L’ho testato con successo nel mio ambiente di sviluppo Discourse locale.

Per gli amministratori che riscontrano problemi simili, questo plugin può servire come soluzione temporanea fino a quando non sarà disponibile una soluzione ufficiale.

Credo che un limite configurabile nel plugin Details integrato sarebbe una salvaguardia utile contro l’annidamento accidentale o eccessivo.

2 Mi Piace