[hunchentoot-devel] Is there a better way?
Hans Hübner
hans at huebner.org
Wed Aug 6 08:50:06 UTC 2008
Kevin,
why do you feel that you need to set the content length explictly? By
default, SEND-HEADERS returns a chunked stream, so setting the content
length is not required. My suggestion is to keep using SEND-HEADERS
and let the base64 decoder write to the stream. There is nothing
wrong with your approach, except for the content length setting, which
seems wasteful.
-Hans
On Tue, Aug 5, 2008 at 22:25, Kevin Raison <raison at chatsubo.net> wrote:
> I am trying to determine the best way to accomplish the following task and
> could use some help. I am writing a web-based (using hunchentoot, of
> course) application for managing voicemail that is stored in Cisco's Unity
> system. I can access the voicemail box of a given use via IMAP. The mel
> project has helped make that part easy. However, I am not sure the best way
> to send the audio stream to the user's browser. The method below
> illustrates (inefficiently) what I need to do. Can anyone suggest a more
> efficient method that does not use (send-headers)? The hunchentoot docs
> say, "If your handlers return the full body as a string or as an array of
> octets, you should not call this function." However, I cannot find an
> alternative way to do what I need to do. I must fetch the voicemail as an
> email via IMAP and then decode the base64-encoded body, which contains the
> voicemail as a wav file. Writing out a wav file and pointing the user's
> browser to it would introduce security issues, so I must do this entire
> process in memory. Any help is appreciated.
>
> (defmethod send-audio-stream ((user user) msg-id)
> "Convert the message body and send the wav content to the user."
> (handler-case
> (let ((msg (mel:find-message (mbox user) msg-id)))
> (setf (content-type) "audio/x-wav")
> (setf (header-out "Content-Disposition")
> (format t "inline; filename=~a.wav" msg-id))
> (setf (content-length) ;; FIXME! Why do this twice?
> (length (base64-decode-msg-body-to-array msg)))
> (let ((stream (send-headers)))
> (base64-decode-msg-body-to-stream msg :stream stream)))
> (error (condition)
> (format nil "Unable to play message: ~a" condition))))
>
> Cheers.
> Kevin Raison
> _______________________________________________
> tbnl-devel site list
> tbnl-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/tbnl-devel
>
More information about the Tbnl-devel
mailing list