Shammer's Philosophy

My private adversaria

HTTP Request Reader

Clozure CL で、

  1. HTTP のリクエストを読み込む
  2. それを画面に表示
  3. 簡単な応答を返す

という、いわば 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 も変更できる。