[web] feedback: texto pegado se pierde con 400 si lleva caracteres multibyte (limit de bytes vs chars) #4

Closed
opened 2026-11-05 18:27:27 +01:00 by monyi · 1 comment
Owner

JJ intento pegar feedback de carbon-copy el 2026-11-05 18:17 y no llego: POST /feedback respondio 400 "Text too long" (nginx: 14 bytes == Text too long\n). Nada se guardo.

Causa: el formulario limita a 500 unidades de codigo JS (maxlength en astro/src/pages/feedback.astro:52) pero el servidor rechaza si len(text) > 500 con len() en BYTES (feedback-svc/main.go:406). Texto con un solo caracter multibyte (ñ, á, …, →) pasa el filtro del cliente y muere en el servidor: se pierde el envio.

Evidencia en la DB: 6 filas quedaron en exactamente 500 bytes (11, 12, 22, 23, 24, 28) — dumps de consola cortados a la mitad por el propio maxlength.

Estado: parche listo en feedback-svc/main.go (sin commit): contar runes (utf8.RuneCountInString) y no bytes. Probado en el puerto 8099 con copia de la DB sin tocar produccion:

  • 499 runes / 1060 bytes -> 200 ok (antes 400)
  • 501 y 600 bytes ASCII -> 400 Text too long (correcto)

Pasos pendientes (decidir con JJ):

  1. Deploy del binario nuevo + systemctl restart gs-feedback (necesita OK de JJ; backup listo en /tmp/gs-feedback.bak-2026-11-05).
  2. Decidir si se sube el tope (6 dumps ya cortados a 500) — requires maxlength del form + rebuild del sitio.
  3. Bonus: GS_DISCORD_WEBHOOK=__DISCORD_WEBHOOK_URL__ es un placeholder — las notificaciones nunca funcionaron.
JJ intento pegar feedback de carbon-copy el 2026-11-05 18:17 y **no llego**: `POST /feedback` respondio **400 "Text too long"** (nginx: 14 bytes == `Text too long\n`). Nada se guardo. **Causa:** el formulario limita a 500 unidades de codigo JS (`maxlength` en `astro/src/pages/feedback.astro:52`) pero el servidor rechaza si `len(text) > 500` con **len() en BYTES** (`feedback-svc/main.go:406`). Texto con un solo caracter multibyte (ñ, á, …, →) pasa el filtro del cliente y muere en el servidor: se pierde el envio. Evidencia en la DB: 6 filas quedaron en exactamente 500 bytes (11, 12, 22, 23, 24, 28) — dumps de consola cortados a la mitad por el propio maxlength. **Estado:** parche listo en `feedback-svc/main.go` (sin commit): contar runes (`utf8.RuneCountInString`) y no bytes. Probado en el puerto 8099 con copia de la DB sin tocar produccion: - 499 runes / 1060 bytes -> 200 ok (antes 400) - 501 y 600 bytes ASCII -> 400 Text too long (correcto) Pasos pendientes (decidir con JJ): 1. Deploy del binario nuevo + `systemctl restart gs-feedback` (necesita OK de JJ; backup listo en `/tmp/gs-feedback.bak-2026-11-05`). 2. Decidir si se sube el tope (6 dumps ya cortados a 500) — requires maxlength del form + rebuild del sitio. 3. Bonus: `GS_DISCORD_WEBHOOK=__DISCORD_WEBHOOK_URL__` es un placeholder — las notificaciones nunca funcionaron.
Author
Owner

Fix desplegado y verificado en produccion (2026-11-05 18:35, OK de JJ):

  • Binario nuevo (rune count, tope 2000): 499 runes/1068 byes -> 200; 2000 -> 200; 2001 -> 400 Text too long; /updates/focuspet.xml -> 200 tras el restart.
  • Commit 7358720 en main (form maxlength=2000 + server 2000 runes).
  • astro build (80 paginas) + rsync a /var/www; https://greasysprocket.com/feedback sirve maxlength="2000", home 200.
  • Backup de rollback: /tmp/gs-feedback.bak-2026-11-05 (paso la linea del unit del webhook a un issue propio).
Fix desplegado y verificado en produccion (2026-11-05 18:35, OK de JJ): - Binario nuevo (rune count, tope 2000): `499 runes/1068 byes -> 200`; `2000 -> 200`; `2001 -> 400 Text too long`; `/updates/focuspet.xml -> 200` tras el restart. - Commit `7358720` en main (form `maxlength=2000` + server 2000 runes). - `astro build` (80 paginas) + rsync a /var/www; `https://greasysprocket.com/feedback` sirve `maxlength="2000"`, home 200. - Backup de rollback: `/tmp/gs-feedback.bak-2026-11-05` (paso la linea del unit del webhook a un issue propio).
monyi closed this issue 2026-11-05 18:37:13 +01:00
Sign in to join this conversation.
No labels
bug
feedback
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
monyi/greasysprocket-website#4
No description provided.