【问题标题】:Getting ERR_INVALID_HTTP_RESPONSE using web server code in Land of Lisp with clisp on OS X使用Land of Lisp中的Web服务器代码和OS X上的clisp获取ERR_INVALID_HTTP_RESPONSE
【发布时间】:2019-08-26 19:19:31
【问题描述】:

我正在阅读《Land of Lisp》(已有 10 年历史,但 clisp 也是如此,所以它似乎已经足够最新了)。我在第 13 章,您将在其中编写 Web 服务器。它只是将客户端套接字打开为标准输出,然后使用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)时,我得到一个 %。

我实际上并不打算将这个网络服务器用于任何事情,但本书的其余部分似乎涉及制作一个使用它的应用程序,我想完成这本书,所以它会很好如果我至少能让网络服务器与至少一个浏览器一起工作的话。

【问题讨论】:

  • 哦,当我执行命令行 curl 时,像 www.google.com 这样的普通网页在输出末尾也有一个 % 是 OS X,所以我想这个事实不相关。好吧,谷歌有,但 microsoft.com 没有。不知道它来自哪里。
  • @MartinBuchmann:为获得更高的一致性,请在行尾写入 CR LF。为了安全起见:永远不要在 *read-eval* 为 nil 的情况下调用 read-from-string。
  • 嗯.. 我尝试在 progn 块中的其他输出之前添加 (format t "HTTP/1.1 200 OK~%"),但它没有解决任何问题。
  • 如果你在 UNIX 上 ~% 会写一个换行符。 HTTP 行的结尾是 cr,然后是 lf。不只是一个人。写一个返回字符,然后写一个换行符。

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


【解决方案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)

感谢在讨论中为我提供这个答案的所有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-19
    • 2011-11-18
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多