[bknr-cvs] edi changed trunk/thirdparty/hunchentoot/server.lisp
BKNR Commits
bknr at bknr.net
Wed Jul 9 07:30:39 UTC 2008
Revision: 3419
Author: edi
URL: http://bknr.net/trac/changeset/3419
Fix handling of chunked requests (bug caught by Cyrus Harmon)
U trunk/thirdparty/hunchentoot/server.lisp
Modified: trunk/thirdparty/hunchentoot/server.lisp
===================================================================
--- trunk/thirdparty/hunchentoot/server.lisp 2008-07-09 05:55:22 UTC (rev 3418)
+++ trunk/thirdparty/hunchentoot/server.lisp 2008-07-09 07:30:39 UTC (rev 3419)
@@ -462,6 +462,15 @@
;; request - note that *SERVER* was bound above already
(let ((*reply* (make-instance 'reply))
(*session* nil))
+ (when (server-input-chunking-p *server*)
+ (let ((transfer-encodings (cdr (assoc* :transfer-encoding headers-in))))
+ (when transfer-encodings
+ (setq transfer-encodings
+ (split "\\s*,\\*" transfer-encodings)))
+ (when (member "chunked" transfer-encodings :test #'equalp)
+ ;; turn chunking on before we read the request body
+ (setf *hunchentoot-stream* (make-chunked-stream *hunchentoot-stream*)
+ (chunked-stream-input-chunking-p *hunchentoot-stream*) t))))
(multiple-value-bind (remote-addr remote-port)
(get-peer-address-and-port socket)
(process-request (make-instance (server-request-class *server*)
@@ -491,66 +500,56 @@
using START-OUTPUT. If all goes as planned, the function returns T."
(let (*tmp-files* *headers-sent*)
(unwind-protect
- (progn
- (when (server-input-chunking-p *server*)
- (let ((transfer-encodings (header-in :transfer-encoding request)))
- (when transfer-encodings
- (setq transfer-encodings
- (split "\\s*,\\*" transfer-encodings)))
- (when (member "chunked" transfer-encodings :test #'equalp)
- ;; turn chunking on before we read the request body
- (setf *hunchentoot-stream* (make-chunked-stream *hunchentoot-stream*)
- (chunked-stream-input-chunking-p *hunchentoot-stream*) t))))
- (let* ((*request* request)
- backtrace)
- (multiple-value-bind (body error)
- (catch 'handler-done
- (handler-bind ((error
- (lambda (cond)
- ;; only generate backtrace if needed
- (setq backtrace
- (and (or (and *show-lisp-errors-p*
- *show-lisp-backtraces-p*)
- (and *log-lisp-errors-p*
- *log-lisp-backtraces-p*))
- (get-backtrace cond)))
- (when *log-lisp-errors-p*
- (log-message* *lisp-errors-log-level*
- "~A~:[~*~;~%~A~]"
- cond
- *log-lisp-backtraces-p*
- backtrace))
- ;; if the headers were already sent
- ;; the error happens within the body
- ;; and we have to close the stream
- (when *headers-sent*
- (setq *close-hunchentoot-stream* t))
- (throw 'handler-done
- (values nil cond))))
- (warning
- (lambda (cond)
- (when *log-lisp-warnings-p*
- (log-message* *lisp-warnings-log-level*
- "~A~:[~*~;~%~A~]"
- cond
- *log-lisp-backtraces-p*
- backtrace)))))
- ;; skip dispatch if bad request
- (when (eql (return-code) +http-ok+)
- ;; now do the work
- (dispatch-request *server* *request* *reply*))))
- (when error
- (setf (return-code *reply*)
- +http-internal-server-error+))
- (start-output :content (cond ((and error *show-lisp-errors-p*)
- (format nil "<pre>~A~:[~*~;~%~%~A~]</pre>"
- (escape-for-html (format nil "~A" error))
- *show-lisp-backtraces-p*
- (escape-for-html (format nil "~A" backtrace))))
- (error
- "An error has occured.")
- (t body))))
- t))
+ (let* ((*request* request)
+ backtrace)
+ (multiple-value-bind (body error)
+ (catch 'handler-done
+ (handler-bind ((error
+ (lambda (cond)
+ ;; only generate backtrace if needed
+ (setq backtrace
+ (and (or (and *show-lisp-errors-p*
+ *show-lisp-backtraces-p*)
+ (and *log-lisp-errors-p*
+ *log-lisp-backtraces-p*))
+ (get-backtrace cond)))
+ (when *log-lisp-errors-p*
+ (log-message* *lisp-errors-log-level*
+ "~A~:[~*~;~%~A~]"
+ cond
+ *log-lisp-backtraces-p*
+ backtrace))
+ ;; if the headers were already sent
+ ;; the error happens within the body
+ ;; and we have to close the stream
+ (when *headers-sent*
+ (setq *close-hunchentoot-stream* t))
+ (throw 'handler-done
+ (values nil cond))))
+ (warning
+ (lambda (cond)
+ (when *log-lisp-warnings-p*
+ (log-message* *lisp-warnings-log-level*
+ "~A~:[~*~;~%~A~]"
+ cond
+ *log-lisp-backtraces-p*
+ backtrace)))))
+ ;; skip dispatch if bad request
+ (when (eql (return-code) +http-ok+)
+ ;; now do the work
+ (dispatch-request *server* *request* *reply*))))
+ (when error
+ (setf (return-code *reply*)
+ +http-internal-server-error+))
+ (start-output :content (cond ((and error *show-lisp-errors-p*)
+ (format nil "<pre>~A~:[~*~;~%~%~A~]</pre>"
+ (escape-for-html (format nil "~A" error))
+ *show-lisp-backtraces-p*
+ (escape-for-html (format nil "~A" backtrace))))
+ (error
+ "An error has occured.")
+ (t body))))
+ t)
(dolist (path *tmp-files*)
(when (and (pathnamep path) (probe-file path))
;; the handler may have chosen to (re)move the uploaded
More information about the Bknr-cvs
mailing list