Shammer's Philosophy

My private adversaria

HTTP Request Reader - with-open-socket version

make-socket を使用していた実装から、with-open-socket へ書き換えたもの。

(defun open-echo-server ()
  (format t "> Start OpenEchoServer...~%")
  (with-open-socket (server :type :stream
			    :connect :passive
			    :local-host "localhost"
			    :local-port 8080
			    :reuse-address t)
		    (let ((client (accept-connection server)))
		      (format t "> Server received a message: ~%")
		      (do ((line (read-line client nil nil)
				 (read-line client nil nil)))
			  ((or (string-equal line (string '#\Return));;; HTTP Request の終わり
			        (eql line nil)));;; クライアントが Close したとき
			(dolist (i (coerce line 'list))
			  (format t "~:c" i))
			(format t "~%"))
		      (format t "> Received Complete...~%")
		      (close client))))

リクエスト一発で終わってしまう点は相変わらずだが、Lisp で IO を扱う際には with-open-XXX を使用するのがよい。XXX に入るのはおそらく file か socket だと思うが。with-open-XXX マクロだと、自分で開いたストリームのクローズとか例外処理とかを勝手に補ってくれる。・・・はず。いずれにせよ、ネットワークサーバー系の処理を書く場合には基本となる実装だと思うので残しておくことにする。