usocketのストリームから読み込むことができない
以下のソースコードは,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))