Hello folks,
OT1H, the charset and external format of a request are extracted from the
Content-Type header and used to percent-decode post parameters in the
function maybe-read-post-parameters.
OTOH, get parameters are always
1) initialized in the method #<initialize-instance :after (request) >,
2) percent-decoded using *hunchentoot-default-external-format*.
That works fine when all pages of the site use a the same external format -
just setting *hunchentoot-default-external-format* globally is enough.
But if one wanted various pages to be in different formats, that could be
inappropriate. For now, it is even buggy because within the current
flexi-streams version, the decode error is not suppressed by following code:
(let ((*substitution-char* #\?))
(form-url-encoded-list-to-alist (split "&" query-string)))
I have bumped into all this while trying to process forms in the
:windows-1251 external format.
AFAIK, user agents percent-encode get parameters using in the charset
specified in the previous server response. Without post parameters, user
agents do not supply the charset in Content-Type as a rule. Thus only a
Hunchentoot request handler can definitely know what the charset is
actually.
All that means that we should postpone retrieval of get parameters as far as
possible. Maybe it is worth not to specify the :initform for the
get-parameters slot and leave it unbound? Then we could initialize this slot
with the following:
(defmethod slot-unbound (class (request request) (slot-name (eql
'get-parameters)))
(setf (slot-value request 'get-parameters)
(form-url-encoded-list-to-alist (split "&" (query-string request))
(request-external-format request))))
The only question is how to compute such a request-external-format.
Any takers?
--
Sincerely,
Dmitriy Ivanov
lisp.ystok.ru