Я создаю приложение, используя Scryer Prolog, в котором есть компонент HTTP Client.
Было бы неплохо использовать потоковую передачу DCG для анализа данных, но фраза_from_stream/2 не завершается при использовании созданного потока из http_open/3.
Я ценю советы по отладке (как/где это не заканчивается?).
Шаги для воспроизведения в scryer-прологе верхнего уровня:
(Запустил простой локальный HTTP-сервер, используя python -m http.server 8000).
?- use_module(library(charsio)).
true.
?- use_module(library(dcgs)).
true.
?- use_module(library(http/http_open)).
true.
% reading the entire stream before parsing works as expected:
?- http_open("http://127.0.0.1:8000", Stream, []), get_n_chars(Stream, N, Chars), phrase(seq(Data), Chars).
Stream = '$stream'(0x600000636908), N = 726, Chars = "<!DOCTYPE HTML>\n<ht ...", Data = "<!DOCTYPE HTML>\n<ht ...".
?- use_module(library(pio)).
true.
% phrase_from_stream/2 does not terminate in this case:
?- http_open("http://127.0.0.1:8000", Stream, []), phrase_from_stream(seq(Data), Stream).
% nontermination
Кажется, это происходит и с другими грамматическими правилами (изначально я пытаюсь проанализировать данные JSON), но я могу воспроизвести это с любым правилом. Я также безуспешно пытался унифицировать размер контента и установить заголовок Connection: close (используя параметры).
Аналогичный код с использованием SWI-Prolog работает как положено:
?- use_module(library(http/http_open)).
true.
?- use_module(library(dcg/basics)).
true.
?- use_module(library(pio)).
true.
?- http_open("http://127.0.0.1:8000", Stream, []), phrase_from_stream(string(Data), Stream).
Stream = <stream>(0x600002954400,0x600002974b00),
Data = [60, 33, 68, 79, 67, 84, 89, 80, 69|...] ;
false.
Советы по отладке рекламы: уменьшите размер http-документа, в который выполняется выборка, сначала на 0 байт, затем на 1 байт и т. д.





Это была ошибка в Scryer Prolog, поскольку код потоковой передачи был неполным и всегда выдавал ответ, что входящих байтов больше, даже если это было не так.
Полезное обсуждение этого вопроса на github.com/mthom/scryer-prolog/discussions/2437