Source
(defun parse-request-parameters (request)
(setf (parameters request) '())
(flet ((add-parameters (params)
(dolist (param-cons params)
(if-bind existing-param
(assoc (car param-cons) (parameters request) :test #'string=)
(if (consp (cdr existing-param))
(push (cdr param-cons) (cdr existing-param))
(setf (cdr existing-param) (list (cdr existing-param) (cdr param-cons))))
(push param-cons (parameters request))))))
;; get the parametetrs from the uri
(awhen (position #\? (raw-uri request))
(let ((query-param-string (make-array (- (length (raw-uri request)) it 1)
:element-type (array-element-type (raw-uri request))
:displaced-to (raw-uri request)
:displaced-index-offset (1+ it))))
(add-parameters (parse-urlencoded query-param-string))))
;; get any parameters from the body of the request
(when-bind body (raw-body request)
(when-bind content-type (get-header request "Content-Type")
(add-parameters (parse-body body content-type)))))
request)Source Context