(defun string-split (x) (setq x (string-left-trim " " x)) (let ((cur "")) (loop until (or (equal x "") (equal (char x 0) #\space) ) do (setq cur (concatenate 'string cur (string (char x 0)))) (setq x (subseq x 1))) (if (equal x "") (cons cur nil) (cons cur (string-split x))))) (defun server (port) (let ( (bound-fd (create-inet-listener port)) (fd nil) (stream nil) (line nil) (file nil) ) (loop (setq fd (accept-tcp-connection bound-fd)) (setq stream (system:make-fd-stream fd :input t :output t :element-type 'character)) (setq line (string-split (read-line stream nil nil))) (if (and (second line) (string= (string-upcase (first line)) "GET")) (progn (when (equal (second line) "/") (setf (second line) "/index.html")) (setf (second line) (concatenate 'string "." (second line))) (if (open (second line) :direction :probe) (progn (setq file (open (second line))) (loop while (write-line (read-line file nil) stream)) (close file)) (write-line "404 / File not found" stream))) (write-line "501 / I don't know how to do what you're asking!" stream)) (close stream) (unix:unix-close fd)))) (server 8080)