HTTP Request Reader
Clozure CL で、
- HTTP のリクエストを読み込む
- それを画面に表示
- 簡単な応答を返す
という、いわば http echo server 的なものを書いてみた。
(defun open-socket-server () (let ((args *unprocessed-command-line-arguments*) (host nil) (port nil)) (cond ((equal 2 (length args)) (setf host (first args)) (setf port (parse-integer (cdr args)))) ((equal 1 (length args)) (setf host "localhost") (setf port (parse-integer (first args)))) (t (setf host "localhost") (setf port 8080))) (make-socket :type :stream :connect :passive :local-host host :local-port port :reuse-address t))) (defun open-echo-server () (let ((server (open-socket-server))) (unwind-protect (let ((client (accept-connection server))) (format t "> Server received a message: ~%") (do ((line (read-line client nil nil) (read-line client nil nil))) ((string-equal line (string '#\Return))) (dolist (i (coerce line 'list)) (format t "~:c" i)) (format t "~%")) (format t "> Received Complete...~%") (close client)) (close server))))
たとえば、このファイルを echo-http-server.lisp で保存して、
ccl64 --load echo-http-server.lisp
で実行、ブラウザで http://localhost:8080/ にアクセスすればリクエストの内容がターミナルに表示される。ループしていないから一回で終わってしまうが。一応、Clozure CL に Argument(コマンドライン引数、パラメータ)を渡してやれば Listen port も変更できる。