SWI-Prolog http_post и http_delete необъяснимо зависают

Когда я пытаюсь использовать http_post/4 SWI-Prolog, следующим образом:

:- use_module(library(http/http_client).

update(URL, Arg) :-
    http_post(URL, form([update = Arg), _, [status_code(204)]).

Когда я запрашиваю это правило и наблюдаю за трафиком TCP, я вижу, что запрос HTTP POST и ответ с ожидаемым кодом состояния 204 происходят немедленно. Однако Prolog зависает на срок до 30 секунд, прежде чем вернуть «истину». Что происходит, что препятствует немедленному возврату правила?

Я тоже пробовал этот вариант, но он тоже зависает:

:- use_module(library(http/http_client).

update(URL, Arg) :-
    http_post(URL, form([update = Arg), Reply, [status_code(204)]),
    close(Reply).

У меня похожая проблема с http_delete/3, но нет с http_get/3.


person sdesciencelover    schedule 19.06.2012    source источник
comment
Спасибо, Дмитрий (кириллица у меня заржавела, так что простите, если не так перевела). Я не знал о форматировании с обратными кавычками.   -  person sdesciencelover    schedule 20.06.2012


Ответы (1)


библиотечные документы утверждают, что http_post

Он эквивалентен http_get/3, за исключением предоставления входного документа, который публикуется с использованием http_post_data/3.

http_get имеет таймаут (+Timeout) в своих опциях. Это может помочь снизить задержку, но, поскольку по умолчанию установлено значение +infinite, я боюсь, что это не решит проблему. Похоже, служба, которую вы вызываете, поддерживает соединение до некоторого тайм-аута.

Лично мне пришлось использовать http_open вместо http_post при вызове сервисов API Google на https...

person CapelliC    schedule 20.06.2012
comment
Добавление connection(close) к параметру Options помогло! - person sdesciencelover; 20.06.2012