Support for html file upload

This commit is contained in:
David Botton 2022-02-09 17:35:03 -05:00
parent cc710218f9
commit 4a2e941a1c
4 changed files with 51 additions and 14 deletions

View file

@ -11,7 +11,8 @@
:pathname "source/" :pathname "source/"
:depends-on (#:clack #:websocket-driver #:alexandria #:hunchentoot #:cl-ppcre :depends-on (#:clack #:websocket-driver #:alexandria #:hunchentoot #:cl-ppcre
#:bordeaux-threads #:trivial-open-browser #:parse-float #:quri #:bordeaux-threads #:trivial-open-browser #:parse-float #:quri
#:sqlite #:lack-middleware-static #:mgl-pax #:cl-template) #:sqlite #:lack-middleware-static #:lack-request
#:mgl-pax #:cl-template)
:components ((:file "clog-connection") :components ((:file "clog-connection")
(:file "clog") (:file "clog")
(:file "clog-utilities") (:file "clog-utilities")

View file

@ -40,6 +40,7 @@ script."
(set-on-connect function) (set-on-connect function)
(set-clog-path function) (set-clog-path function)
(get-connection-data function) (get-connection-data function)
(delete-connection-data function)
"CLOG system utilities" "CLOG system utilities"
@ -114,6 +115,15 @@ script."
hash test: #'equal." hash test: #'equal."
(gethash connection-id *connection-data*)) (gethash connection-id *connection-data*))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; delete-connection-data ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun delete-connection-data (connection-id)
"Delete CONNECTION-ID's data. (private)"
(bordeaux-threads:with-lock-held (*connection-lock*)
(remhash connection-id *connection-data*)))
;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;
;; prep-query ;; ;; prep-query ;;
;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;
@ -311,7 +321,14 @@ instead of the compiled version."
(let ((page-data (make-string (file-length stream))) (let ((page-data (make-string (file-length stream)))
(post-data)) (post-data))
(read-sequence page-data stream) (read-sequence page-data stream)
;; Check if post method response (when (search "multipart/form-data;"
(getf env :content-type))
(let ((id (get-universal-time))
(req (lack.request:make-request env)))
(bordeaux-threads:with-lock-held (*connection-lock*)
(setf (gethash id *connection-data*)
(lack.request:request-body-parameters req)))
(setf post-data id)))
(when (equal (getf env :content-type) (when (equal (getf env :content-type)
"application/x-www-form-urlencoded") "application/x-www-form-urlencoded")
(setf post-data (make-string (getf env :content-length))) (setf post-data (make-string (getf env :content-length)))

View file

@ -15,16 +15,33 @@
(defgeneric form-get-data (clog-obj) (defgeneric form-get-data (clog-obj)
(:documentation "Get the form data as an a-list sent by the get method")) (:documentation "Get the form data as an a-list sent by the get method"))
(defmethod form-get-data (clog-obj) (defmethod form-get-data ((obj clog-obj))
(quri:uri-query-params (quri:uri-query-params
(quri:uri (clog-connection:query (connection-id clog-obj) "location.href")))) (quri:uri (clog-connection:query (connection-id obj) "location.href"))))
(defgeneric form-post-data (clog-obj) (defgeneric form-post-data (clog-obj)
(:documentation "Get the form data as an a-list sent by post method")) (:documentation "Get the form data as an a-list sent by post method"))
(defmethod form-post-data (clog-obj) (defmethod form-post-data ((obj clog-obj))
(quri:url-decode-params (quri:url-decode-params
(clog-connection:query (connection-id clog-obj) "clog['post-data']"))) (clog-connection:query (connection-id obj) "clog['post-data']")))
(defgeneric form-multipart-data (clog-obj)
(:documentation "Get the form data as an a-list sent with the multipart
method used in file uploads. DELETE-MULTIPART-DATA must be called or will
never be GC'd. File upload items will be a four part list
(name stream file-name content-type)."))
(defmethod form-multipart-data ((obj clog-obj))
(clog-connection:get-connection-data
(parse-integer (caar (form-post-data obj)) :junk-allowed t)))
(defgeneric delete-multipart-data (clog-obj)
(:documentation "Delete the multipart data upload"))
(defmethod delete-multipart-data ((obj clog-obj))
(let* ((id (parse-integer (caar (form-post-data obj))))
(clog-connection:delete-connection-data id))))
(defun form-data-item (form-data item) (defun form-data-item (form-data item)
"Return value for ITEM from FROM-DATA a-list" "Return value for ITEM from FROM-DATA a-list"

View file

@ -517,6 +517,8 @@ embedded in a native template application.)"
"CLOG-Form-Data" "CLOG-Form-Data"
(form-get-data generic-function) (form-get-data generic-function)
(form-post-data generic-function) (form-post-data generic-function)
(form-multipart-data generic-function)
(delete-multipart-data generic-function)
(form-data-item function) (form-data-item function)
"CLOG-Form - Class for organizing Form Elements in to a From" "CLOG-Form - Class for organizing Form Elements in to a From"