Recoding von Daten konzeptuell getrennt.
authorSven Schöling <s.schoeling@linet-services.de>
Wed, 28 Dec 2011 19:24:53 +0000 (20:24 +0100)
committerSven Schöling <s.schoeling@linet-services.de>
Wed, 28 Dec 2011 19:43:30 +0000 (20:43 +0100)
commit6056e1d7ff9b26df2aa3a07ab0c615af1a9bbef4
tree4f0eeb52378f883e413fc03cf2e5c3af20c5d391
parent0ab929155ed24fd4f79dcc27fde61ec91723851a
Recoding von Daten konzeptuell getrennt.

Es gibt 4 Pfade um Daten in einen Request zu kriegen:

  - Kommandozeile
  - Datenbank (für gespeicherte Forms)
  - QUERY_STRING (http get)
  - STDIN (http post)

Der letzte Teil teilt sich noch einmal in

  - x-uri-encoded query string (normales http post)
  - multipart/form-data container (u.a. dateiuploads)

Alle Daten in LxOffice können über INPUT_ENCODING das encoding des Formulars
überschreiben, das ist nötig weil Javascript da sein eigenes Ding dreht.

Das führt dazu, dass alle http Quellen:

  1. Normal dekodiert werden müssen
  2. Später noch einmal recoded werden müssen, falls ein anderes encoding
     angegeben ist.

Uploads, die mit dem encoding binary geschickt werden, dürfen dagegen garnicht
recoded werden. Deshalb wurden bisher alle multipart/form-data Daten davon
ausgenommen, was aber zu Fehlern führt, wenn ein Formular gemischte Werte über
multipart/form-data sendet. Am einfachsten zu demonstrieren im CsvImport, wenn
man 'ä' als sep_char angibt.

Dieser Patch ändert das in zwei Container, in die einsortiert wird:

  - Bekanntes Encoding (wird sofort nach $::form decoded)
  - Eventuell unbekanntes Encoding (wird decoded, aber in einen
    Zwischencontainer sortiert, und später recoded, falls nötig)

Dadurch muss das recoding nicht mehr in-place gemacht werden.

Alles in multipart/form-data wird jetzt decodiert, ausser Dateiuploads
(erkennbar am filename Attribut) und explizit binary geflaggtes
content-transfer-encoding.

Bei kollidierendem INPUT_ENCODING und "content-type; charset" wird erst das
content-type charset dekodiert, und dann ein recode aus internem coding in das
angefragte INPUT_ENCODING gemacht.
SL/Request.pm