Update of /project/lisppaste/cvsroot/lisppaste2 In directory common-lisp.net:/tmp/cvs-serv5661
Modified Files: web-server.lisp Log Message: updating for araneida 0.80.
Date: Mon Nov 10 11:18:23 2003 Author: eenge
Index: lisppaste2/web-server.lisp diff -u lisppaste2/web-server.lisp:1.1.1.1 lisppaste2/web-server.lisp:1.2 --- lisppaste2/web-server.lisp:1.1.1.1 Mon Nov 3 12:17:53 2003 +++ lisppaste2/web-server.lisp Mon Nov 10 11:18:23 2003 @@ -1,4 +1,4 @@ -;;;; $Id: web-server.lisp,v 1.1.1.1 2003/11/03 17:17:53 eenge Exp $ +;;;; $Id: web-server.lisp,v 1.2 2003/11/10 16:18:23 eenge Exp $ ;;;; $Source: /project/lisppaste/cvsroot/lisppaste2/web-server.lisp,v $
;;;; See the LICENSE file for licensing information. @@ -12,122 +12,130 @@ (contents nil :type string) (universal-time nil :type integer))
-(defun say-handler (request rest) - (araneida:request-send-headers request) - (irc:send-irc-message *connection* :privmsg rest (channel *connection*)) - (princ - (html - `(html - (head - (title "Sent!")) - (body - ,(format nil "Your text was sent to ~A!" (channel *connection*))))))) +(defclass new-paste-handler (araneida:handler) ()) + +(defclass submit-paste-handler (araneida:handler) + ((username + :accessor username + :initform "") + (title + :accessor title + :initform "") + (text + :accessor text + :initform "")))
-(defun display-handler (request rest) +(defclass display-paste-handler (araneida:handler) ()) + +(defmethod araneida:handle-request-response ((handler new-paste-handler) method request) (araneida:request-send-headers request :expires 0) - (write-sequence - (let ((pnumber (parse-integer rest :junk-allowed t))) - (if (not pnumber) - (html - `(html (head (title "Invalid paste number!")) - (body (h1 ,(format nil "The supplied paste number is not an integer."))))) - (let ((thepaste (some #'(lambda (e) (and (eql pnumber (paste-number e)) e)) *pastes*))) - (if (not thepaste) - (html - `(html (head (title "Invalid paste number!")) - (body (h1 ,(format nil "No paste numbered ~A could be found." pnumber))))) - (html - `(html (head (title ,(format nil "Paste number ~A" pnumber))) - (body (h3 ,(format nil "Paste number ~A: ~A" pnumber (encode-for-pre (paste-title thepaste)))) - ,(format nil "Pasted by ~A" (encode-for-pre (paste-user thepaste))) - (hr) - ((pre) ,(encode-for-pre (paste-contents thepaste)))))))))) - (araneida:request-stream request))) - -(defun new-paste-form () - `((form :method post :action ,(araneida:urlstring *new-paste-url*)) - "Enter a username, title, and paste contents into the fields below. If you choose a unique username for your pastes then other users will be able to search for your pastes (not now)." - (hr) - "Enter your username: " ((input :type text :name username)) (br) - "Enter a title: " ((input :type text :name title)) (br) - "Enter your paste: " (br) ((textarea :rows 24 :cols 80 :name text)) - (br) - ((input :type submit)) - ((input :type reset)))) - -#|(defun search-paste-handler (request rest) - (request-send-headers request :expires 0) - (write-sequence - (html - `(html - (head (title "Search Pastes")) - (body - ,@(let ((username-param (body-param "USERNAME" (request-body request))) - (title-param (body-param "TITLE" (request-body request))) - (text-param (body-param "TEXT" (request-body request)))) - (if (not (or username-param title-param text-param)) - `((h1 "Search for pastes") - `((form :method post :action ,(urlstring *search-paste-url*)) - "Enter one or more of a username, title, or paste contents to search for. The searches are exact substring searches." - (hr) - "Search for a username: " ((input :type text :name username)) (br) - "Search for a title: " ((input :type text :name title)) (br) - "Search for a paste: " ((input :type text :name text)) (br) - ((input :type submit)) - ((input :type reset)))))))))))|# + (new-paste-form request))
-(defun new-paste-handler (request rest) +(defun new-paste-form (request &optional (message "")) + (araneida:html-stream + (araneida:request-stream request) + `(html + (head (title "Paste")) + (body + (h1 "Enter your paste") + ((font :color red) (h2 ,message)) + ((form :method post :action ,(araneida:urlstring *submit-paste-url*)) + (p "Enter a username, title, and paste contents into the fields below. The +paste will appear on " ,*channel* " @ " ,(irc:server-name *connection*) ".") + (hr) + (table + (tr + (th "Enter your username:") + (td ((input :type text :name username)))) + (tr + (th "Enter a title:") + (td ((input :type text :name title)))) + (tr + ((th :valign top) "Enter your paste:") + (td ((textarea :rows 24 :cols 80 :name text)))) + (tr + ((td :colspan 2) ((input :type submit)))) + (tr + ((td :colspan 2) ((input :type reset)))))))))) + +(defmethod araneida:handle-request-response ((handler submit-paste-handler) method request) + (setf (username handler) (araneida:body-param "USERNAME" (araneida:request-body request))) + (setf (title handler) (araneida:body-param "TITLE" (araneida:request-body request))) + (setf (text handler) (araneida:body-param "TEXT" (araneida:request-body request))) + (araneida:request-send-headers request) + + (let ((username (username handler)) + (title (title handler)) + (text (text handler))) + (cond + ((zerop (length username)) + (new-paste-form request "Please enter your username.")) + ((zerop (length title)) + (new-paste-form request "Please enter a title.")) + ((zerop (length text)) + (new-paste-form request "Please enter your paste.")) + (t + (progn + (incf *paste-counter*) + (let ((url (araneida:urlstring (araneida:merge-url *display-url* + (prin1-to-string *paste-counter*)))) + (paste (make-paste :number *paste-counter* + :user username + :title title + :contents text + :universal-time (get-universal-time)))) + (irc:privmsg *connection* *channel* + (format nil "~A pasted ~A at ~A" username title url)) + (push paste *pastes*) + (araneida:html-stream + (araneida:request-stream request) + `(html + (head (title "Paste number " ,*paste-counter*)) + (body + (h1 "Pasted!") + (p "Your paste should be available at " ((a :href ,url) ,url) ", and +was also sent to " ,*channel* " @ " ,(irc:server-name *connection*))))))))))) + +(defmethod araneida:handle-request-response ((handler display-paste-handler) method request) (araneida:request-send-headers request :expires 0) - (write-sequence - (html - `(html - (head (title "Paste")) - (body - ,@(let ((username-param (body-param "USERNAME" (araneida:request-body request))) - (title-param (body-param "TITLE" (araneida:request-body request))) - (text-param (body-param "TEXT" (araneida:request-body request)))) - (print 'hi) - (if (not username-param) ;;; We weren't supplied a paste - `((h1 "Enter your paste") - ,(new-paste-form)) - (if (string= username-param "") - `(((font :color red) "Please enter a valid username!") - (br) - (h1 "Enter your paste") - ,(new-paste-form)) - (if (or (not title-param) (string= title-param "")) - `(((font :color red) "Please enter a valid title!") - (h1 "Enter your paste") - ,(new-paste-form)) - (if (or (not text-param) (string= text-param "")) - `(((font :color red) "Please enter some text for your paste!") - (h1 "Enter your paste") - ,(new-paste-form)) - (progn - (incf *paste-counter*) - (push (make-paste :number *paste-counter* - :user username-param - :title title-param - :contents text-param - :universal-time (get-universal-time)) *pastes*) - (let ((theurl (urlstring (merge-url *display-paste-url* (prin1-to-string *paste-counter*))))) - (irc:send-irc-message connection - :privmsg (format nil "~A pasted ~A at ~A" username-param title-param theurl) - (channel connection)) - `((h1 "Pasted!") - "Your paste should be available at " ((a :href ,theurl) ,theurl)))))))))))) - (araneida:request-stream request))) - -(araneida:export-server *paste-server*) - -(araneida:export-handler *new-paste-url* - #'new-paste-handler - :method t :stage :response) - -(araneida:export-handler *say-url* - #'say-handler - :match :prefix :method t :stage :response) - -(araneida:export-handler *display-paste-url* - #'display-handler - :match :prefix :method t :stage :response) + ; XXX request-unhandled-part will be exported in 0.81 + (let* ((paste-number (parse-integer + (araneida::request-unhandled-part request) + :junk-allowed t)) + (paste (some #'(lambda (element) + (and (eql paste-number (paste-number element)) + element)) *pastes*))) + (if paste + (araneida:html-stream + (araneida:request-stream request) + `(html + (head + (title "Paste number " ,paste-number)) + (body + (h2 "Paste number " ,paste-number ,(encode-for-pre (paste-title paste))) + (p "Pasted by " ,(encode-for-pre (paste-user paste))) + (hr) + (pre ,(encode-for-pre (paste-contents paste)))))) + (araneida:html-stream + (araneida:request-stream request) + `(html + (head + (title "Invalid paste number" ,paste-number)) + (body + (h1 "No paste numberd " ,paste-number "could be found."))))))) + +(araneida:install-handler + (araneida:http-listener-handler *paste-listener*) + (make-instance 'new-paste-handler) + (araneida:urlstring *new-paste-url*) t) + +(araneida:install-handler + (araneida:http-listener-handler *paste-listener*) + (make-instance 'submit-paste-handler) + (araneida:urlstring *submit-paste-url*) t) + +(araneida:install-handler + (araneida:http-listener-handler *paste-listener*) + (make-instance 'display-paste-handler) + (araneida:urlstring *display-paste-url*) nil) +