common-lisp - 使用Land of Lisp中的Web服务器代码和OS X上的clisp获取ERR_INVALID_HTTP_RESPONSE
问题描述
我正在阅读 Lisp 的土地(它已有 10 年历史,但 clisp 也是如此,所以它似乎已经足够最新了)。我在第 13 章,您将在其中编写 Web 服务器。它只是将客户端套接字作为标准输出打开,然后使用princ
和format 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,但如果我添加正文标签并在开始时声明 doctype html,它也会一样。curl 响应中的 % 不在 中princ
,当我尝试访问服务器的其他 URL(如 localhost:8080 或 localhost:8080/greeting?name=Lewis)时,我得到一个 %。
我实际上并不打算将这个网络服务器用于任何事情,但本书的其余部分似乎涉及制作一个使用它的应用程序,我想完成这本书,所以如果我能做到就好了至少让网络服务器与至少一个浏览器一起工作。
解决方案
根据上面指向论坛的讨论,看起来这已修复它。我们需要一个“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)
感谢讨论中的所有帮助让我得到这个答案!
推荐阅读
- flutter - 有问题 w/flutter mobx RadioListTile
- java - Apacher Hadoop , Apacher Hive on Apache Spark JAVA_9 common-lang 版本
- c++ - 如何在for循环c ++中调用变量
- python - 使用输出的一部分作为输入
- python - 我想访问 int64 数组列表中的元素
- ios - Ionic 5 带电容器“plugin_not_installed”
- ios - 比最大压缩进一步压缩 UIImage
- android - Android Studio 生成的 apk 安装但未打开
- dart - 为什么我不能在 Dart 中使用作为函数参数接收的原始值来初始化“const”变量?
- r - 如何使用 ggplot 绘制分类 0-1 变量的频率