Получение ERR_INVALID_HTTP_RESPONSE с использованием кода веб-сервера в Land of Lisp с помощью clisp в OS X

Я читаю Land of Lisp (ему 10 лет, но и clisp тоже, так что он кажется достаточно современным). Я на главе 13, где вы пишете веб-сервер. Он просто открывает клиентский сокет как стандартный вывод, а затем использует princ и format t для записи клиенту. Полный исходный код веб-сервера находится по адресу 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.

На самом деле я не планирую использовать этот веб-сервер для чего-либо, но остальная часть книги, похоже, посвящена созданию приложения, которое его использует, и я хотел бы закончить книгу, поэтому было бы неплохо, если бы я мог по крайней мере, заставить веб-сервер работать хотя бы с одним браузером.


person Lewis Cawthorne    schedule 04.04.2019    source источник
comment
О, обычные веб-страницы, такие как www.google.com, также имеют % в конце вывода, когда я делаю curl из командной строки в OS X, поэтому я думаю, что этот факт не имеет значения. Ну, у google есть, а у microsoft.com нет. Не знаю, откуда это взялось.   -  person Lewis Cawthorne    schedule 05.04.2019
comment
Я думаю, что это связано с вашей проблемой groups.google.com/ форум/#!topic/land-of-lisp/afwjs0eic94   -  person Martin Buchmann    schedule 05.04.2019
comment
@MartinBuchmann: для большего соответствия напишите CR LF в конце строки. В целях безопасности: никогда не вызывайте чтение из строки, если *read-eval* не равно нулю.   -  person Rainer Joswig    schedule 06.04.2019
comment
Хм... Я пытался добавить (формат t HTTP/1.1 200 OK~%) перед другим выводом в блоке программы, но это ничего не исправило.   -  person Lewis Cawthorne    schedule 06.04.2019
comment
Если вы работаете в UNIX, ~% напишет перевод строки. Концом строки HTTP является cr, а затем lf. Не только в одиночестве. Напишите символ возврата, а затем символ перевода строки.   -  person Rainer Joswig    schedule 06.04.2019


Ответы (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)

Спасибо за всю помощь в обсуждении, которая привела меня к этому ответу!

person Lewis Cawthorne    schedule 06.04.2019