在OS X上使用clisp在Lisp领域中使用Web服务器代码获取ERR_INVALID_HTTP_RESPONSE

时间:2019-04-04 22:54:43

标签: common-lisp clisp land-of-lisp

我正在阅读《 Lisp之地》(它已有10年历史了,但是也是如此,所以它看起来足够新了)。我在第13章,您在其中编写Web服务器。它只是以 standard-output 的形式打开客户端套接字,然后使用princformat t向客户端写出。 Web服务器的完整源代码位于http://landoflisp.com/webserver.lisp

我在键入代码并从网站下载webserver.lisp并运行它时遇到了同样的问题。当我在Chrome中访问该网站时,我得到ERR_INVALID_HTTP_RESPONSE。在Safari中,我无法打开页面。当我尝试在Firefox中访问该站点时,我得到了预期的页面,但是所有的html标签都只是呈现为文本。当我尝试在curl中与网站进行交互时,我在输出中获得接近的百分比,但不确定该来源。

> curl http://localhost:8080/greeting
<html><form>What is your name?<input name='name' /></form></html>%

我知道这不是最好的HTML,但是如果我添加body标签并在开始时也声明doctype html,它也会起到同样的作用。 curl响应中的%在princ中不存在,当我尝试转到服务器的其他URL(如localhost:8080或localhost:8080 / greeting?name = Lewis)时,会得到%。

我实际上并不打算将Web服务器用于任何用途,但是本书的其余部分似乎涉及到开发使用该服务器的应用程序,而且我想完成这本书,所以这很好如果我至少可以使Web服务器与至少一个浏览器一起使用。

1 个答案:

答案 0 :(得分:1)

按照上面指向论坛的讨论,看起来像这样修复了它。我们需要一个“ HTTP 1.1 200 OK”,后跟一个\ r \ n,然后是一个\ r \ n在换行符上,然后是页面。这使其在Firefox和Chrome中都可以正常工作。我刚刚将其添加到请求处理程序中:

(format t "HTTP/1.1 200 OK~C~C" #\return #\linefeed)
(format t "~C~C" #\return #\linefeed)

感谢讨论中的所有帮助,让我得到了这个答案!