Name: sage 2012-12-29 5:13
Implement https://dis.4chan.org/read/prog/1356634826/25 more elegantly.
(defun 3ml-cgi-decode ()
(let ((stream (if (string-equal "get" request-method)
(make-string-input-stream query-string)
*standard-input*))
(symbols ()))
(with-open-stream (output (make-string-output-stream))
(loop for char = (read-char stream nil nil)
do (case char
(#\= (push (intern (string-upcase (get-output-stream-string output)))
symbols))
((nil #\&) (when symbols
(setf (symbol-value (first symbols)) (get-output-stream-string output))))
(#\+ (write-char #\space output))
(#\% (let* ((nib1 (read-char stream nil nil))
(nib2 (read-char stream nil nil))
(code (+ (* 16 (digit-char-p nib1 16))
(digit-char-p nib2 16))))
(write-char (code-char code) output)))
(t (write-char char output)))
while char))
(setf *cgi-variables* symbols)))