以下のソースコードは,echo関数でクライアントからのリクエストを読み込んでいます.
HTTPのヘッダまでは読み込むことができるのですが,メッセージボディを読み込むことができません.
# read-charで処理が止まっているようです.

これは,私のソースコードを書き換えることで解決できる問題なのでしょうか?
もしそうでしたら,理由を教えて頂けないでしょうか.

よろしくお願いいたします.

クライアントの表示結果

$ curl http://localhost:8080/test -X POST -d "Message Body"
POST /test HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.43.0
Accept: */*
Content-Length: 12
Content-Type: application/x-www-form-urlencoded

ソースコード

#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 "$@"
|#

(ql:quickload :usocket)


(defun echo (stream)
  (loop for input = (read-char stream nil nil)
        while input do
        (progn
          (format t "~a" input)
          (write-char input stream)
          (force-output stream))))

(defun make-server-socket (port address)
  (usocket:socket-listen address port :reuseaddress t))

(defun handler (client)
  (with-open-stream (stream (usocket:socket-stream client))
                    (echo stream)))

(defun accept (server)
  (usocket:socket-accept server))

(defun dispose (server)
  (format t "dispose server~%")
  (usocket:socket-close server))

(defun start (&key (port 8080) (address "localhost"))
  (format t "start server~%")
  (let ((server-sock (make-server-socket port address)))
    (unwind-protect
        (loop (handler (accept server-sock)))
      (dispose server-sock))))

(defun main (&rest argv)
  (declare (ignorable argv))
  (start))

https://gist.github.com/mocchit/2035d034931721798182