diff --git a/examples/X-extras/server-request.lisp b/examples/X-extras/server-request.lisp new file mode 100644 index 0000000..4f9ffc4 --- /dev/null +++ b/examples/X-extras/server-request.lisp @@ -0,0 +1,50 @@ +;;; this is just a snippet to show how to use Qt for POST requests to +;;; a cgi script (using e.g. python for cgi) +;;; +;;; this is here to have an alternative to Lisp solutions, which don't +;;; work well in ECL on some platforms (namely Windows) +;;; +;;; example usage: +;;; +;;; (server-request "booking.py" +;;; (list (cons "from" "2020-08-01") +;;; (cons "to "2020-08-08"))) + +(qrequire :network) + +;; for testing, using e.g. python3 -m http.server 8080 --cgi +(defparameter *server* "http://localhost:8080/cgi-bin/") + +(defun http-part (parameter) + (let ((part (qnew "QHttpPart"))) + (qlet ((name "QVariant(QString)" + (format nil "form-data; name=~S" (car parameter)))) + (|setHeader| part |QNetworkRequest.ContentDispositionHeader| name) + (|setBody| part (x:string-to-bytes (cdr parameter)))) + part)) + +(defun server-request (script &optional parameters) + "Make a http POST request to a cgi script, forcing synchronous behaviour, + which simplifies things and is preferable in many cases." + (start-busy-animation) ; pseudo code + (let (response) + (qlet ((ev-loop "QEventLoop") + (manager "QNetworkAccessManager")) + (qconnect manager "finished(QNetworkReply*)" + (lambda (reply) + (|deleteLater| reply) + (let ((err (|error| reply))) + (when (= |QNetworkReply.NoError| err) + (setf response (qfrom-utf8 (|readAll| reply))))) + (|exit| ev-loop))) + (qlet ((multi "QHttpMultiPart") + (qurl "QUrl(QString)" (x:cc *server* script)) + (request "QNetworkRequest(QUrl)" qurl)) + (dolist (param parameters) + (qlet ((part (http-part param))) + (|append| multi part))) + (|post| manager request multi) + (|exec| ev-loop |QEventLoop.ExcludeUserInputEvents|) + (stop-busy-animation) ; pseudo code + response)))) +