Function: PARSE-REQUEST-PARAMETERS

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