构建 Web 服务器与探索函数式编程
1. 构建 Web 服务器
1.1 URL 提取
在处理 HTTP 请求时,首先要提取请求中的 URL。若没有请求参数,直接返回 URL。以下是一个简单的 URL 提取示例:
> (parse-url "GET /lolcats.html HTTP/1.1")
("lolcats.html")
> (parse-url "GET /lolcats.html?extra-funny=yes HTTP/1.1")
("lolcats.html" (EXTRA-FUNNY . "yes"))
这个 parse-url
函数会跳过请求方法(通常是 GET 或 POST),只提取 URL 部分。
1.2 处理请求头
接下来要处理请求的其余部分,将请求的剩余行转换为键值对的关联列表(alist)。 get-header
函数可以完成这个任务:
(defun get-header (stream)
(let* ((s (read-line stream))
(h (let ((i (position #\: s)))
(when i
(cons (intern (string-upcase (subseq s 0 i)))