From bknr at bknr.net Fri Oct 1 00:03:55 2010 From: bknr at bknr.net (BKNR Commits) Date: Fri, 01 Oct 2010 02:03:55 +0200 Subject: [bknr-cvs] edi changed trunk/thirdparty/hunchentoot/CHANGELOG Message-ID: Revision: 4616 Author: edi URL: http://bknr.net/trac/changeset/4616 Update ChangeLog U trunk/thirdparty/hunchentoot/CHANGELOG Modified: trunk/thirdparty/hunchentoot/CHANGELOG =================================================================== --- trunk/thirdparty/hunchentoot/CHANGELOG 2010-09-30 23:59:11 UTC (rev 4615) +++ trunk/thirdparty/hunchentoot/CHANGELOG 2010-10-01 00:03:54 UTC (rev 4616) @@ -1,3 +1,4 @@ +Revived *SHOW-LISP-BACKTRACES-P* Made sure "100 Continue" is returned even if the client sends "Expect: 100-continue" twice (reported by Gordon Sims) Fixed typo in code which interprets transfer encodings From bknr at bknr.net Tue Oct 12 21:40:54 2010 From: bknr at bknr.net (BKNR Commits) Date: Tue, 12 Oct 2010 23:40:54 +0200 Subject: [bknr-cvs] edi changed trunk/thirdparty/hunchentoot/request.lisp Message-ID: Revision: 4617 Author: edi URL: http://bknr.net/trac/changeset/4617 Remove debugging code U trunk/thirdparty/hunchentoot/request.lisp Modified: trunk/thirdparty/hunchentoot/request.lisp =================================================================== --- trunk/thirdparty/hunchentoot/request.lisp 2010-10-01 00:03:54 UTC (rev 4616) +++ trunk/thirdparty/hunchentoot/request.lisp 2010-10-12 21:40:53 UTC (rev 4617) @@ -224,8 +224,6 @@ (when error (setf (return-code *reply*) +http-internal-server-error+)) - (format t "show-error ~A show-backtrace ~A error ~A backtrace: ~A~%" - *show-lisp-errors-p* *show-lisp-backtraces-p* error backtrace) (start-output :content (cond ((and error *show-lisp-errors-p*) (format nil "
~A~@[~%~%Backtrace:~A~]
" (escape-for-html (format nil "~A" error)) From bknr at bknr.net Tue Oct 12 21:43:51 2010 From: bknr at bknr.net (BKNR Commits) Date: Tue, 12 Oct 2010 23:43:51 +0200 Subject: [bknr-cvs] edi changed trunk/thirdparty/cl-who/ Message-ID: Revision: 4618 Author: edi URL: http://bknr.net/trac/changeset/4618 HTML5 support U trunk/thirdparty/cl-who/CHANGELOG U trunk/thirdparty/cl-who/doc/index.html U trunk/thirdparty/cl-who/specials.lisp U trunk/thirdparty/cl-who/who.lisp Modified: trunk/thirdparty/cl-who/CHANGELOG =================================================================== --- trunk/thirdparty/cl-who/CHANGELOG 2010-10-12 21:40:53 UTC (rev 4617) +++ trunk/thirdparty/cl-who/CHANGELOG 2010-10-12 21:43:51 UTC (rev 4618) @@ -1,11 +1,12 @@ Version 1.0.0 -2009-0x-xx +2010-0x-xx Refactored internals and made STR etc. local macros Added test suite todo: repla s-h-texp with walk in docs Removed deprecated ESCAPE-STRING-ISO-8859 function Removed SHOW-HTML-EXPANSION -Bugfixes (thanks to Slawek Zak) +Bugfixes (thanks to Slawek Zak) +Added support for HTML5 (Chaitanya Gupta) Version 0.11.1 2008-03-28 Modified: trunk/thirdparty/cl-who/doc/index.html =================================================================== --- trunk/thirdparty/cl-who/doc/index.html 2010-10-12 21:40:53 UTC (rev 4617) +++ trunk/thirdparty/cl-who/doc/index.html 2010-10-12 21:43:51 UTC (rev 4618) @@ -61,7 +61,7 @@ code inserted by the user of the macro. CL-WHO will make sure that there aren't two adjacent WRITE-STRING forms with constant strings. CL-WHO's output is -either XHTML (default) or 'plain' (SGML) HTML — depending on +either XHTML (default), 'plain' (SGML) HTML or HTML5 (using HTML syntax) — depending on what you've set HTML-MODE to.

CL-WHO is intended to be portable and should work with all @@ -541,7 +541,7 @@


Set this to NIL to if you want to use CL-WHO as a strict XML generator. Otherwise, CL-WHO will only write empty tags listed in -*HTML-EMPTY-TAGS* as <tag/> (XHTML mode) or <tag> (SGML mode). For +*HTML-EMPTY-TAGS* as <tag/> (XHTML mode) or <tag> (SGML mode or HTML mode). For all other tags, it will always generate <tag></tag>. The initial value of this variable is T.
@@ -553,9 +553,9 @@ *HTML-EMPTY-TAG-AWARE-P*. The initial value is the list
-(:area :atop :audioscope :base :basefont :br :choose :col :frame
- :hr :img :input :isindex :keygen :left :limittext :link :meta
- :nextid :of :over :param :range :right :spacer :spot :tab :wbr)
+(:area :atop :audioscope :base :basefont :br :choose :col :command :embed
+ :frame :hr :img :input :isindex :keygen :left :limittext :link :meta :nextid
+ :of :over :param :range :right :source :spacer :spot :tab :track :wbr)
 
@@ -585,11 +585,14 @@
html-mode => mode
(setf (html-mode) mode)

-The function HTML-MODE returns the current mode for generating HTML. The default is :XML for XHTML. You can change this by setting it with (SETF (HTML-MODE) :SGML) to pre-XML HTML mode. +The function HTML-MODE returns the current mode for generating HTML. The default is :XML for XHTML. You can change this by setting it with (SETF (HTML-MODE) :SGML) to pre-XML HTML mode or (SETF (HTML-MODE) :HTML5) to HTML5 mode (using HTML syntax).

Setting it to SGML HTML sets the *prologue* to the doctype string for HTML 4.01 transitional:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Code generation in SGML HTML is slightly different from XHTML - there's no need to end empty elements with /> and empty attributes are allowed. +

+Setting it to HTML5 sets the *prologue* to the following doctype string: +

<!DOCTYPE html>


[Function] Modified: trunk/thirdparty/cl-who/specials.lisp =================================================================== --- trunk/thirdparty/cl-who/specials.lisp 2010-10-12 21:40:53 UTC (rev 4617) +++ trunk/thirdparty/cl-who/specials.lisp 2010-10-12 21:43:51 UTC (rev 4618) @@ -51,7 +51,7 @@ indentation dynamically.") (defvar *html-mode* :xml - ":SGML for \(SGML-)HTML, :XML \(default) for XHTML.") + ":SGML for \(SGML-)HTML, :XML \(default) for XHTML, :HTML5 for HTML5.") (defvar *downcase-tokens-p* t "If NIL, a keyword symbol representing a tag or attribute name will @@ -73,6 +73,8 @@ :br :choose :col + :command + :embed :frame :hr :img @@ -89,9 +91,11 @@ :param :range :right + :source :spacer :spot :tab + :track :wbr) "The list of HTML tags that should be output as empty tags. See *HTML-EMPTY-TAG-AWARE-P*.") @@ -100,7 +104,7 @@ "Set this to NIL to if you want to use CL-WHO as a strict XML generator. Otherwise, CL-WHO will only write empty tags listed in *HTML-EMPTY-TAGS* as \(XHTML mode) or \(SGML -mode). For all other tags, it will always generate +mode and HTML5 mode). For all other tags, it will always generate .") (defconstant +newline+ (make-string 1 :initial-element #\Newline) Modified: trunk/thirdparty/cl-who/who.lisp =================================================================== --- trunk/thirdparty/cl-who/who.lisp 2010-10-12 21:40:53 UTC (rev 4617) +++ trunk/thirdparty/cl-who/who.lisp 2010-10-12 21:43:51 UTC (rev 4618) @@ -30,13 +30,13 @@ (in-package :cl-who) (defun html-mode () - "Returns the current HTML mode. :SGML for \(SGML-)HTML and -:XML for XHTML." + "Returns the current HTML mode. :SGML for \(SGML-)HTML, :XML for +XHTML and :HTML5 for HTML5 (HTML syntax)." *html-mode*) (defun (setf html-mode) (mode) "Sets the output mode to XHTML or \(SGML-)HTML. MODE can be -:SGML for HTML or :XML for XHTML." +:SGML for HTML, :XML for XHTML or :HTML5 for HTML5 (HTML syntax)." (ecase mode ((:sgml) (setf *html-mode* :sgml @@ -45,7 +45,11 @@ ((:xml) (setf *html-mode* :xml *empty-tag-end* " />" - *prologue* "")))) + *prologue* "")) + ((:html5) + (setf *html-mode* :html5 + *empty-tag-end* ">" + *prologue* "")))) (defun process-tag (sexp body-fn) (declare (optimize speed space)) From bknr at bknr.net Tue Oct 12 21:48:22 2010 From: bknr at bknr.net (BKNR Commits) Date: Tue, 12 Oct 2010 23:48:22 +0200 Subject: [bknr-cvs] edi changed trunk/thirdparty/drakma/ Message-ID: Revision: 4619 Author: edi URL: http://bknr.net/trac/changeset/4619 :drakma-no-ssl U trunk/thirdparty/drakma/CHANGELOG.txt U trunk/thirdparty/drakma/doc/index.html U trunk/thirdparty/drakma/drakma.asd U trunk/thirdparty/drakma/util.lisp Modified: trunk/thirdparty/drakma/CHANGELOG.txt =================================================================== --- trunk/thirdparty/drakma/CHANGELOG.txt 2010-10-12 21:43:51 UTC (rev 4618) +++ trunk/thirdparty/drakma/CHANGELOG.txt 2010-10-12 21:48:22 UTC (rev 4619) @@ -1,4 +1,5 @@ Don't funcall symbols that aren't FBOUNDP (Far? Rideau) +Allowed disabling of SSL when building (Marko Kocic) Version 1.2.3 2010-08-05 Modified: trunk/thirdparty/drakma/doc/index.html =================================================================== --- trunk/thirdparty/drakma/doc/index.html 2010-10-12 21:43:51 UTC (rev 4618) +++ trunk/thirdparty/drakma/doc/index.html 2010-10-12 21:48:22 UTC (rev 4619) @@ -680,7 +680,8 @@ have the corresponding C libraries as well. You'll usually have them -already unless you're on Windows. +already unless you're on Windows. If you don't have required C libraries you can add :drakma-no-ssl +to *features* to avoid using CL+SSL for https support.

The current development version of Drakma can be found at http://bknr.net/trac/browser/trunk/thirdparty. Modified: trunk/thirdparty/drakma/drakma.asd =================================================================== --- trunk/thirdparty/drakma/drakma.asd 2010-10-12 21:43:51 UTC (rev 4618) +++ trunk/thirdparty/drakma/drakma.asd 2010-10-12 21:48:22 UTC (rev 4619) @@ -59,4 +59,4 @@ :chunga :flexi-streams #-:lispworks :usocket - #-(or :lispworks :allegro) :cl+ssl)) + #-(or :lispworks :allegro :drakma-no-ssl) :cl+ssl)) Modified: trunk/thirdparty/drakma/util.lisp =================================================================== --- trunk/thirdparty/drakma/util.lisp 2010-10-12 21:43:51 UTC (rev 4618) +++ trunk/thirdparty/drakma/util.lisp 2010-10-12 21:48:22 UTC (rev 4619) @@ -330,10 +330,12 @@ (defun make-ssl-stream (http-stream) "Attaches SSL to the stream HTTP-STREAM and returns the SSL stream \(which will not be equal to HTTP-STREAM)." - #+:allegro + #+(and :allegro (not :drakma-no-ssl)) (socket:make-ssl-client-stream http-stream) - #-:allegro + #+(and (not :allegro) (not :drakma-no-ssl)) (let ((s http-stream)) (cl+ssl:make-ssl-client-stream (cl+ssl:stream-fd s) - :close-callback (lambda () (close s))))) \ No newline at end of file + :close-callback (lambda () (close s)))) + #+:drakma-no-ssl + (error "SSL not supported. Remove :drakma-no-ssl from *features* to enable SSL")) From bknr at bknr.net Wed Oct 20 12:05:41 2010 From: bknr at bknr.net (BKNR Commits) Date: Wed, 20 Oct 2010 14:05:41 +0200 Subject: [bknr-cvs] edi changed trunk/thirdparty/cl-ppcre/ Message-ID: Revision: 4620 Author: edi URL: http://bknr.net/trac/changeset/4620 Typo U trunk/thirdparty/cl-ppcre/api.lisp U trunk/thirdparty/cl-ppcre/doc/index.html Modified: trunk/thirdparty/cl-ppcre/api.lisp =================================================================== --- trunk/thirdparty/cl-ppcre/api.lisp 2010-10-12 21:48:22 UTC (rev 4619) +++ trunk/thirdparty/cl-ppcre/api.lisp 2010-10-20 12:05:40 UTC (rev 4620) @@ -1224,8 +1224,8 @@ (let* ((*use-bmh-matchers* nil) (comment-scanner (create-scanner "(?s)\\(\\?#.*?\\)")) (extended-comment-scanner (create-scanner "(?m:#.*?$)|(?s:\\(\\?#.*?\\))")) - (quote-token-scanner "\\\\[QE]") - (quote-token-replace-scanner "\\\\([QE])")) + (quote-token-scanner (create-scanner "\\\\[QE]")) + (quote-token-replace-scanner (create-scanner "\\\\([QE])"))) (defun clean-comments (string &optional extended-mode) "Clean \(?#...) comments within STRING for quoting, i.e. convert \\Q to Q and \\E to E. If EXTENDED-MODE is true, also clean Modified: trunk/thirdparty/cl-ppcre/doc/index.html =================================================================== --- trunk/thirdparty/cl-ppcre/doc/index.html 2010-10-12 21:48:22 UTC (rev 4619) +++ trunk/thirdparty/cl-ppcre/doc/index.html 2010-10-20 12:05:40 UTC (rev 4620) @@ -2052,7 +2052,7 @@

  • A lot of hackers (especially users of Perl and other scripting languages) think that regular expressions are the greatest thing - since slice bread and use it for almost everything. That is just + since sliced bread and use it for almost everything. That is just plain wrong. Other hackers (especially Lispers) tend to think that regular expressions are the work of the devil and try to avoid them at all cost. That's also wrong. Regular expressions are a handy From bknr at bknr.net Sat Oct 23 10:59:19 2010 From: bknr at bknr.net (BKNR Commits) Date: Sat, 23 Oct 2010 12:59:19 +0200 Subject: [bknr-cvs] hans changed deployed/quickhoney/thirdparty/cl-smtp/ Message-ID: Revision: 4621 Author: hans URL: http://bknr.net/trac/changeset/4621 fix automatic lf->crlf conversion in smtp-output-stream. some issues may remain. U deployed/quickhoney/thirdparty/cl-smtp/cl-smtp.lisp U deployed/quickhoney/thirdparty/cl-smtp/smtp-output-stream.lisp Modified: deployed/quickhoney/thirdparty/cl-smtp/cl-smtp.lisp =================================================================== --- deployed/quickhoney/thirdparty/cl-smtp/cl-smtp.lisp 2010-10-20 12:05:40 UTC (rev 4620) +++ deployed/quickhoney/thirdparty/cl-smtp/cl-smtp.lisp 2010-10-23 10:59:18 UTC (rev 4621) @@ -110,7 +110,7 @@ :ssl ssl :local-hostname local-hostname))) (initiate-smtp-mail stream from to) - (funcall thunk (make-instance 'smtp-output-stream :encapsulated-stream stream)) + (funcall thunk (make-instance 'smtp-header-output-stream :encapsulated-stream stream)) (finish-smtp-mail stream)))) (defmacro with-smtp-mail ((stream-var host from to &key ssl (port (if (eq :tls ssl) 465 25)) authentication local-hostname) @@ -376,7 +376,7 @@ (dolist (l extra-headers) (write-to-smtp stream (format nil "~A: ~{~a~^,~}" (car l) (rest l))))) - (write-to-smtp stream "Mime-Version: 1.0")) + (write-to-smtp stream "MIME-Version: 1.0")) (defun send-multipart-headers (stream &key attachment-boundary html-boundary) (cond (attachment-boundary Modified: deployed/quickhoney/thirdparty/cl-smtp/smtp-output-stream.lisp =================================================================== --- deployed/quickhoney/thirdparty/cl-smtp/smtp-output-stream.lisp 2010-10-20 12:05:40 UTC (rev 4620) +++ deployed/quickhoney/thirdparty/cl-smtp/smtp-output-stream.lisp 2010-10-23 10:59:18 UTC (rev 4621) @@ -19,13 +19,16 @@ (defclass smtp-output-stream (trivial-gray-stream-mixin fundamental-character-output-stream) ((encapsulated-stream :initarg :encapsulated-stream - :reader encapsulated-stream) - (in-header - :initform t - :accessor in-header - :documentation - "Currently emitting the header of the message") - (line-has-non-ascii + :reader encapsulated-stream))) + +(defmethod stream-element-type ((stream smtp-output-stream)) + (stream-element-type (encapsulated-stream stream))) + +(defmethod close ((stream smtp-output-stream) &key abort) + (close (encapsulated-stream stream) :abort abort)) + +(defclass smtp-header-output-stream (smtp-output-stream) + ((line-has-non-ascii :initform nil :accessor line-has-non-ascii :documentation @@ -40,48 +43,73 @@ :initarg :external-format :reader external-format))) -(defmethod stream-element-type ((stream smtp-output-stream)) - (stream-element-type (stream stream))) - -(defmethod close ((stream smtp-output-stream) &key abort) - (close (encapsulated-stream stream) :abort abort)) - (defmethod stream-write-char ((stream smtp-output-stream) char) - (with-accessors ((in-header in-header) - (line-has-non-ascii line-has-non-ascii) + (with-accessors ((line-has-non-ascii line-has-non-ascii) (previous-char previous-char) (external-format external-format) (encapsulated-stream encapsulated-stream)) stream - (when in-header - (cond - ;; Newline processing - ((eql char #\Newline) - ;; Finish quoting - (when line-has-non-ascii - (format encapsulated-stream "?=") - (setf line-has-non-ascii nil)) - ;; Test for end of header - (when (eql previous-char #\Newline) - (setf in-header nil))) - ((eql char #\Return) - ;; CR is suppressed here and added before each #\Newline - ) - ;; Handle non-ASCII characters - ((< 127 (char-code char)) - (unless line-has-non-ascii - (format encapsulated-stream "=?~A?Q?" (flex:external-format-name external-format)) - (setf line-has-non-ascii t)) - (loop for byte across (flex:string-to-octets (make-string 1 :initial-element char) - :external-format external-format) - do (format encapsulated-stream "=~2,'0X" byte)))) - (setf previous-char char)) - #+nil(when (eql char #\Newline) - (write-char #\Return encapsulated-stream)) + (cond + ;; Newline processing + ((eql char #\Newline) + ;; Finish quoting + (when line-has-non-ascii + (format encapsulated-stream "?=") + (setf line-has-non-ascii nil)) + ;; Print CR + (write-char #\Return encapsulated-stream) + ;; Test for end of header + (when (eql previous-char #\Newline) + (write-char #\Newline encapsulated-stream) + (change-class stream 'smtp-body-output-stream) + (return-from stream-write-char nil))) + ((eql char #\Return) + ;; CR is suppressed here and added before each #\Newline + ) + ;; Handle non-ASCII characters + ((< 127 (char-code char)) + (unless line-has-non-ascii + (format encapsulated-stream "=?~A?Q?" (flex:external-format-name external-format)) + (setf line-has-non-ascii t)) + (loop for byte across (flex:string-to-octets (make-string 1 :initial-element char) + :external-format external-format) + do (format encapsulated-stream "=~2,'0X" byte)))) + + (unless (eql #\Return char) + (setf previous-char char)) (unless (< 127 (char-code char)) (write-char char encapsulated-stream)))) -(defmethod stream-write-sequence ((stream smtp-output-stream) sequence start end &key) - (if (in-header stream) - (loop for i from start below end - do (stream-write-char stream (elt sequence i))) - (write-sequence sequence (encapsulated-stream stream) :start start :end end))) +(defmethod stream-write-sequence ((stream smtp-header-output-stream) sequence start end &key) + (loop for i from start below end + do (stream-write-char stream (elt sequence i)))) + +(defclass smtp-body-output-stream (smtp-output-stream) + ()) + +(defmethod stream-write-char ((stream smtp-body-output-stream) char) + (case char + (#\Return) + (#\Linefeed + (write-char #\Return (encapsulated-stream stream)) + (write-char #\Linefeed (encapsulated-stream stream))) + (otherwise + (write-char char (encapsulated-stream stream))))) + +(defmethod stream-write-sequence ((stream smtp-body-output-stream) sequence start end &key) + (loop + (let ((linefeed-position (position #\Linefeed sequence :start start :end end))) + (cond + ((>= start end) + (return)) + (linefeed-position + (write-sequence sequence (encapsulated-stream stream) + :start start + :end linefeed-position) + (write-char #\Return (encapsulated-stream stream)) + (write-char #\Linefeed (encapsulated-stream stream)) + (setf start (1+ linefeed-position))) + (t + (write-sequence sequence (encapsulated-stream stream) + :start start + :end end) + (return)))))) \ No newline at end of file From bknr at bknr.net Sat Oct 23 11:04:20 2010 From: bknr at bknr.net (BKNR Commits) Date: Sat, 23 Oct 2010 13:04:20 +0200 Subject: [bknr-cvs] hans changed trunk/thirdparty/cl-smtp/ Message-ID: Revision: 4622 Author: hans URL: http://bknr.net/trac/changeset/4622 fix automatic lf->crlf conversion in smtp-output-stream. some issues may remain. U trunk/thirdparty/cl-smtp/cl-smtp.lisp U trunk/thirdparty/cl-smtp/smtp-output-stream.lisp Modified: trunk/thirdparty/cl-smtp/cl-smtp.lisp =================================================================== --- trunk/thirdparty/cl-smtp/cl-smtp.lisp 2010-10-23 10:59:18 UTC (rev 4621) +++ trunk/thirdparty/cl-smtp/cl-smtp.lisp 2010-10-23 11:04:20 UTC (rev 4622) @@ -110,7 +110,7 @@ :ssl ssl :local-hostname local-hostname))) (initiate-smtp-mail stream from to) - (funcall thunk (make-instance 'smtp-output-stream :encapsulated-stream stream)) + (funcall thunk (make-instance 'smtp-header-output-stream :encapsulated-stream stream)) (finish-smtp-mail stream)))) (defmacro with-smtp-mail ((stream-var host from to &key ssl (port (if (eq :tls ssl) 465 25)) authentication local-hostname) @@ -376,7 +376,7 @@ (dolist (l extra-headers) (write-to-smtp stream (format nil "~A: ~{~a~^,~}" (car l) (rest l))))) - (write-to-smtp stream "Mime-Version: 1.0")) + (write-to-smtp stream "MIME-Version: 1.0")) (defun send-multipart-headers (stream &key attachment-boundary html-boundary) (cond (attachment-boundary Modified: trunk/thirdparty/cl-smtp/smtp-output-stream.lisp =================================================================== --- trunk/thirdparty/cl-smtp/smtp-output-stream.lisp 2010-10-23 10:59:18 UTC (rev 4621) +++ trunk/thirdparty/cl-smtp/smtp-output-stream.lisp 2010-10-23 11:04:20 UTC (rev 4622) @@ -19,13 +19,16 @@ (defclass smtp-output-stream (trivial-gray-stream-mixin fundamental-character-output-stream) ((encapsulated-stream :initarg :encapsulated-stream - :reader encapsulated-stream) - (in-header - :initform t - :accessor in-header - :documentation - "Currently emitting the header of the message") - (line-has-non-ascii + :reader encapsulated-stream))) + +(defmethod stream-element-type ((stream smtp-output-stream)) + (stream-element-type (encapsulated-stream stream))) + +(defmethod close ((stream smtp-output-stream) &key abort) + (close (encapsulated-stream stream) :abort abort)) + +(defclass smtp-header-output-stream (smtp-output-stream) + ((line-has-non-ascii :initform nil :accessor line-has-non-ascii :documentation @@ -40,48 +43,73 @@ :initarg :external-format :reader external-format))) -(defmethod stream-element-type ((stream smtp-output-stream)) - (stream-element-type (stream stream))) - -(defmethod close ((stream smtp-output-stream) &key abort) - (close (encapsulated-stream stream) :abort abort)) - (defmethod stream-write-char ((stream smtp-output-stream) char) - (with-accessors ((in-header in-header) - (line-has-non-ascii line-has-non-ascii) + (with-accessors ((line-has-non-ascii line-has-non-ascii) (previous-char previous-char) (external-format external-format) (encapsulated-stream encapsulated-stream)) stream - (when in-header - (cond - ;; Newline processing - ((eql char #\Newline) - ;; Finish quoting - (when line-has-non-ascii - (format encapsulated-stream "?=") - (setf line-has-non-ascii nil)) - ;; Test for end of header - (when (eql previous-char #\Newline) - (setf in-header nil))) - ((eql char #\Return) - ;; CR is suppressed here and added before each #\Newline - ) - ;; Handle non-ASCII characters - ((< 127 (char-code char)) - (unless line-has-non-ascii - (format encapsulated-stream "=?~A?Q?" (flex:external-format-name external-format)) - (setf line-has-non-ascii t)) - (loop for byte across (flex:string-to-octets (make-string 1 :initial-element char) - :external-format external-format) - do (format encapsulated-stream "=~2,'0X" byte)))) - (setf previous-char char)) - #+nil(when (eql char #\Newline) - (write-char #\Return encapsulated-stream)) + (cond + ;; Newline processing + ((eql char #\Newline) + ;; Finish quoting + (when line-has-non-ascii + (format encapsulated-stream "?=") + (setf line-has-non-ascii nil)) + ;; Print CR + (write-char #\Return encapsulated-stream) + ;; Test for end of header + (when (eql previous-char #\Newline) + (write-char #\Newline encapsulated-stream) + (change-class stream 'smtp-body-output-stream) + (return-from stream-write-char nil))) + ((eql char #\Return) + ;; CR is suppressed here and added before each #\Newline + ) + ;; Handle non-ASCII characters + ((< 127 (char-code char)) + (unless line-has-non-ascii + (format encapsulated-stream "=?~A?Q?" (flex:external-format-name external-format)) + (setf line-has-non-ascii t)) + (loop for byte across (flex:string-to-octets (make-string 1 :initial-element char) + :external-format external-format) + do (format encapsulated-stream "=~2,'0X" byte)))) + + (unless (eql #\Return char) + (setf previous-char char)) (unless (< 127 (char-code char)) (write-char char encapsulated-stream)))) -(defmethod stream-write-sequence ((stream smtp-output-stream) sequence start end &key) - (if (in-header stream) - (loop for i from start below end - do (stream-write-char stream (elt sequence i))) - (write-sequence sequence (encapsulated-stream stream) :start start :end end))) +(defmethod stream-write-sequence ((stream smtp-header-output-stream) sequence start end &key) + (loop for i from start below end + do (stream-write-char stream (elt sequence i)))) + +(defclass smtp-body-output-stream (smtp-output-stream) + ()) + +(defmethod stream-write-char ((stream smtp-body-output-stream) char) + (case char + (#\Return) + (#\Linefeed + (write-char #\Return (encapsulated-stream stream)) + (write-char #\Linefeed (encapsulated-stream stream))) + (otherwise + (write-char char (encapsulated-stream stream))))) + +(defmethod stream-write-sequence ((stream smtp-body-output-stream) sequence start end &key) + (loop + (let ((linefeed-position (position #\Linefeed sequence :start start :end end))) + (cond + ((>= start end) + (return)) + (linefeed-position + (write-sequence sequence (encapsulated-stream stream) + :start start + :end linefeed-position) + (write-char #\Return (encapsulated-stream stream)) + (write-char #\Linefeed (encapsulated-stream stream)) + (setf start (1+ linefeed-position))) + (t + (write-sequence sequence (encapsulated-stream stream) + :start start + :end end) + (return)))))) \ No newline at end of file From bknr at bknr.net Sun Oct 31 20:23:48 2010 From: bknr at bknr.net (BKNR Commits) Date: Sun, 31 Oct 2010 21:23:48 +0100 Subject: [bknr-cvs] edi changed trunk/thirdparty/hunchentoot/doc/index.xml Message-ID: Revision: 4623 Author: edi URL: http://bknr.net/trac/changeset/4623 is or was U trunk/thirdparty/hunchentoot/doc/index.xml Modified: trunk/thirdparty/hunchentoot/doc/index.xml =================================================================== --- trunk/thirdparty/hunchentoot/doc/index.xml 2010-10-23 11:04:20 UTC (rev 4622) +++ trunk/thirdparty/hunchentoot/doc/index.xml 2010-10-31 20:23:47 UTC (rev 4623) @@ -57,7 +57,7 @@ license so you can basically do with it whatever you want.

    - Hunchentoot is for example used by + Hunchentoot is (or was) for example used by Postabon, City Farming, Trip Planner,