I am using Clozure CL 1.2 rc1.2 with Hunchentoot. The hunchentoot-test pages that come with the install are not working completely. I had the to modify the test code in test.lisp to get a backtrace of what was happening. stream-direct-utf-8 is throwing an error and no content is coming back.
(defvar *htest-debug-stream* nil)
(defun stream-direct-utf-8 () (handler-bind ((error (lambda (c) (describe c *htest-debug-stream*) (format *htest-debug-stream* "~A" (hunchentoot:get-backtrace c))))) (setf (content-type) "text/html; charset=utf-8") (let ((stream (send-headers))) (setf (flex:flexi-stream-external-format stream) *utf-8*) (with-open-file (in (merge-pathnames "UTF-8-demo.html" *this-file*) :element-type 'flex:octet) (setq in (flex:make-flexi-stream in :external-format *utf-8*)) (loop for line = (read-line in nil nil) while line do (write-line line stream))))))
and modifying chunga::write-chunk to..
(defmethod write-chunk ((stream chunked-output-stream) sequence &key (start 0) (end (length sequence))) "Writes the contents of SEQUENCE from START to END to the underlying stream of STREAM as one chunk." (let ((output-stream (chunked-stream-output-stream stream))) (describe output-stream hunchentoot-test::*htest-debug-stream*) ;; chunk size (format output-stream "~X" (- end start)) ;; CRLF (write-string #.(format nil "~C~C" #\Return #\Linefeed) output-stream) ;; data #+:clisp (setf (flexi-stream-element-type output-stream) 'octet) (write-sequence sequence output-stream :start start :end end) #+:clisp (setf (flexi-stream-element-type output-stream) 'character) ;; CRLF (write-string #.(format nil "~C~C" #\Return #\Linefeed) output-stream)))
Visting the page /hunchentoot/test/utf8-character.txt produces the output below. As far as I can tell from looking at the code there should be no instance of EXTERNAL-FORMAT since there is no method FLEXI-STREAMS::ENCODING-FACTOR for it (only subclasses of EXTERNAL-FORMAT). I have pretty well banged my head looking at the code in flexi-streams and chunga trying to determine the problem. This works fine for SBCL, and I see no conditional code for CCL that might explain the problem.
Wade
CL-USER> (hunchentoot:start-server :port 4242) #<HUNCHENTOOT::SERVER #x3000426BF81D> CL-USER> (setf hunchentoot-test::*htest-debug-stream* *standard-output*) #<SWANK-BACKEND::SLIME-OUTPUT-STREAM #x300040E2FC1D> #<SIMPLE-ERROR #x30004274A50D> Class: #<STANDARD-CLASS SIMPLE-ERROR> Wrapper: #<CLASS-WRAPPER #x3000404AC86D> Instance slots CCL::FORMAT-CONTROL: "No applicable method for args:~% ~s~% to ~s" CCL::FORMAT-ARGUMENTS: ((#<EXTERNAL-FORMAT (:ISO-8859-1 :EOL-STYLE :LF) #x30004122DA1D>) #<STANDARD-GENERIC-FUNCTION FLEXI-STREAMS::ENCODING-FACTOR #x300040FACA3F>)
BACKTRACE--->>>>>>
(7FC8F700D0B8) : 0 (GET-BACKTRACE #<SIMPLE-ERROR #x30004274A50D>) 285 (7FC8F700D120) : 1 (FUNCALL #'#<(:INTERNAL HUNCHENTOOT-TEST::STREAM-DIRECT-UTF-8)> #<SIMPLE-ERROR #x30004274A50D>) 173 (7FC8F700D140) : 2 (SIGNAL #<SIMPLE-ERROR #x30004274A50D> [...]) 997 (7FC8F700D198) : 3 (%ERROR #<SIMPLE-ERROR #x30004274A50D> NIL 17562639276619) 117 (7FC8F700D1C0) : 4 (CERROR "Try calling it again" "No applicable method for args:~% ~s~% to ~s" [...]) 933 (7FC8F700D258) : 5 (FUNCALL #'#<#<CCL::STANDARD-KERNEL-METHOD NO-APPLICABLE-METHOD (T)>> #<STANDARD-GENERIC-FUNCTION FLEXI-STREAMS::ENCODING-FACTOR #x300040FACA3F> [...]) 117 (7FC8F700D298) : 7 (FUNCALL #'#<#<STANDARD-METHOD TRIVIAL-GRAY-STREAMS:STREAM-WRITE-SEQUENCE (FLEXI-STREAMS:FLEXI-OUTPUT-STREAM T T T)>> #<FLEXI-STREAMS:FLEXI-IO-STREAM #x30004272511D> ".... (7FC8F700D300) : 8 (%%STANDARD-COMBINED-METHOD-DCODE '(# NIL #<#>) 17562639276650) 269 (7FC8F700D378) : 10 (WRITE-STRING "... (7FC8F700D3D8) : 11 (%PR-INTEGER 0 [...]) 965 (7FC8F700D478) : 12 (FORMAT-PRINT-NUMBER #<FLEXI-STREAMS:FLEXI-IO-STREAM #x30004272511D> 8187 16 NIL NIL NIL) 1829 (7FC8F700D4F8) : 13 (FUNCALL #'#<Anonymous Function #x3000409324EF> #<FLEXI-STREAMS:FLEXI-IO-STREAM #x30004272511D> NIL NIL [...]) 165 (7FC8F700D530) : 14 (SUB-FORMAT #FLEXI-STREAMS:FLEXI-IO-STREAM #x30004272511D 1 2) 2469 (7FC8F700D5E8) : 15 (DO-SUB-FORMAT #FLEXI-STREAMS:FLEXI-IO-STREAM #x30004272511D) 157 (7FC8F700D608) : 16 (FORMAT #FLEXI-STREAMS:FLEXI-IO-STREAM #x30004272511D "~X" [...]) 1725 (7FC8F700D728) : 17 (FUNCALL #'#<#<STANDARD-METHOD CHUNGA::WRITE-CHUNK (CHUNGA:CHUNKED-OUTPUT-STREAM T)>> #<CHUNGA:CHUNKED-IO-STREAM #x30004273F56D> #(60 33 68 79 67 ...) [...]) 237 (7FC8F700D770) : 18 (%%CHECK-KEYWORDS #(2 #(:END :START) #<METHOD-FUNCTION CHUNGA::WRITE-CHUNK #>) 17562639276793) 245 (7FC8F700D7F0) : 20 (FUNCALL #'#<#<STANDARD-METHOD CHUNGA::FLUSH-BUFFER (CHUNGA:CHUNKED-OUTPUT-STREAM)>> #<CHUNGA:CHUNKED-IO-STREAM #x30004273F56D>) 213 (7FC8F700D810) : 21 (FUNCALL #'#<#<STANDARD-METHOD TRIVIAL-GRAY-STREAMS:STREAM-WRITE-SEQUENCE (CHUNGA:CHUNKED-OUTPUT-STREAM T T T)>> #CHUNGA:CHUNKED-IO-STREAM #x30004273F56D #(184 177 224 184 162 ...) 0 63 [...]) 709 (7FC8F700D868) : 22 (WRITE-SEQUENCE #(184 177 224 184 162 ...) #<CHUNGA:CHUNKED-IO-STREAM #x30004273F56D> [...]) 765 (7FC8F700D8D8) : 23 (FUNCALL #'#<(:INTERNAL FLEXI-STREAMS::FLUSH-BUFFER (TRIVIAL-GRAY-STREAMS:STREAM-WRITE-SEQUENCE (FLEXI-STREAMS:FLEXI-OUTPUT-STREAM T T T)))>) 85 (7FC8F700D900) : 24 (FUNCALL #'#<(:INTERNAL FLEXI-STREAMS::WRITE-OCTET (TRIVIAL-GRAY-STREAMS:STREAM-WRITE-SEQUENCE (FLEXI-STREAMS:FLEXI-OUTPUT-STREAM T T T)))> 154) 69 (7FC8F700D938) : 25 (FUNCALL #'#<#<STANDARD-METHOD FLEXI-STREAMS::CHAR-TO-OCTETS (FLEXI-STREAMS::FLEXI-UTF-8-FORMAT T T)>> #<FLEXI-UTF-8-FORMAT (:UTF-8 :EOL-STYLE :LF) #x300042642DBD> #\U+0E1A #<COMPILED-LEXICAL-CLOSURE (:INTERNAL FLEXI-STREAMS::WRITE-OCTET #) #x30004274A8CF>) 1629 (7FC8F700D970) : 26 (FUNCALL #'#<#<STANDARD-METHOD TRIVIAL-GRAY-STREAMS:STREAM-WRITE-SEQUENCE (FLEXI-STREAMS:FLEXI-OUTPUT-STREAM T T T)>> #<FLEXI-STREAMS:FLEXI-IO-STREAM #x30004273CBCD> " (7FC8F700D9F8) : 27 (%%STANDARD-COMBINED-METHOD-DCODE '(# NIL #<#>) 17562639276873) 269 (7FC8F700DA70) : 29 (WRITE-STRING "... (7FC8F700DAD0) : 30 (WRITE-LINE " (7FC8F700DB20) : 31 (STREAM-DIRECT-UTF-8) 805 (7FC8F700DBB0) : 32 (PROCESS-REQUEST '(# # # # # ...) #<FLEXI-STREAMS:FLEXI-IO-STREAM #x30004273CBCD> :GET "/hunchentoot/test/utf8-character.txt" :HTTP/1.1) 3045 (7FC8F700DD18) : 33 (PROCESS-CONNECTION #HUNCHENTOOT::SERVER #x3000426BF81D #<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/6) #x30004271F65D>) 5429 (7FC8F700DEB8) : 34 (RUN-PROCESS-INITIAL-FORM #<PROCESS hunchentoot-worker-1(13) [Active] #x30004271E9BD> '(#)) 717 (7FC8F700DF48) : 35 (FUNCALL #'#<(:INTERNAL CCL::%PROCESS-PRESET-INTERNAL)> #<PROCESS hunchentoot-worker-1(13) [Active] #x30004271E9BD> '(#)) 397 (7FC8F700DF98) : 36 (FUNCALL #'#<(:INTERNAL CCL::THREAD-MAKE-STARTUP-FUNCTION)>) 293
CHUNGA INFO--->>>>>>>>>
Class: #<STANDARD-CLASS FLEXI-STREAMS:FLEXI-IO-STREAM> Wrapper: #<CLASS-WRAPPER #x300040FCCC3D> Instance slots CCL::SHARED-RESOURCE: NIL STREAM: #<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/6) #x3000426A322D> FLEXI-STREAMS::EXTERNAL-FORMAT: #<EXTERNAL-FORMAT (:ISO-8859-1 :EOL-STYLE :LF) #x30004122DA1D> FLEXI-STREAMS::ELEMENT-TYPE: FLEXI-STREAMS::CHAR* FLEXI-STREAMS::COLUMN: 0 FLEXI-STREAMS::LAST-CHAR-CODE: NIL FLEXI-STREAMS::LAST-OCTET: NIL FLEXI-STREAMS::OCTET-STACK: NIL POSITION: 0 FLEXI-STREAMS::BOUND: NIL #<FLEXI-STREAMS:FLEXI-IO-STREAM #x3000426A36BD> Class: #<STANDARD-CLASS FLEXI-STREAMS:FLEXI-IO-STREAM> Wrapper: #<CLASS-WRAPPER #x300040FCCC3D> Instance slots CCL::SHARED-RESOURCE: NIL STREAM: #<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/6) #x3000426A322D> FLEXI-STREAMS::EXTERNAL-FORMAT: #<EXTERNAL-FORMAT (:ISO-8859-1 :EOL-STYLE :LF) #x30004122DA1D> FLEXI-STREAMS::ELEMENT-TYPE: FLEXI-STREAMS::CHAR* FLEXI-STREAMS::COLUMN: 0 FLEXI-STREAMS::LAST-CHAR-CODE: NIL FLEXI-STREAMS::LAST-OCTET: NIL FLEXI-STREAMS::OCTET-STACK: NIL POSITION: 0 FLEXI-STREAMS::BOUND: NIL