swi prolog 8.0.2:gziped http

时间:2019-03-10 23:23:29

标签: http prolog gzip swi-prolog logtalk

我试图使工作成为打开ht​​tp连接的一段代码。 但是,网页可能会以纯文本格式或gzip格式传输。 结果,具有实用性的代码会尝试以纯文本格式打开,如果失败并接收到异常,则会尝试使用gzip编码。

URL是唯一的基础变量。 尝试使用URL ='http://releases.llvm.org/6.0.0/tools/clang/docs/ClangCommandLineReference.html'。

                user::catch(
                (
                 user::http_open(URL, DataStream, []),                            
                 user::load_html(stream(DataStream), Terms, []),
                 user::close(DataStream)
                ),
                _
                ,
                (
                 user::open_any(URL, read, GZipDataStream, CloseIt, [encoding(gzip), string(atom)]),
                 /*user::http:encoding_filter(gzip, DataStream, GZipDataStream),*/
                 user::load_html(stream(GZipDataStream), Terms, []),
                 user::close_any(CloseIt)
                )
                )

很遗憾,渔获物的恢复部分不起作用。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

目标中的sudo前缀表明您发布的代码是Logtalk的一部分。如果是这样,那就是在滥用Logtalk源代码并在SWI-Prolog自动加载机制上创建依赖项。可以重写代码,以确保代码的清晰性和灵活性。这样做并修复其中的错误(必须加载user::过滤器才能使library(zlib)过滤器可用)导致以下解决方案:

http:encoding_filter/3

:- use_module(library(http/http_open), []). :- use_module(library(sgml), []). :- use_module(library(iostream), []). :- use_module(library(zlib), []). :- object(html). :- public(get_url/2). % override ambiguous meta-predicate template :- meta_predicate(sgml:load_html(*,*,*)). get_url(URL, Terms) :- catch( setup_call_cleanup( http:http_open(URL, DataStream, []), sgml:load_html(stream(DataStream), Terms, []), close(DataStream) ), _, setup_call_cleanup( iostream:open_any(URL, read, DataStream, CloseIt, [string(atom)]), sgml:load_html(stream(DataStream), Terms, []), iostream:close_any(CloseIt) ) ). :- end_object. 调用可确保在发生错误的情况下关闭打开的流。

假设上面的对象保存在setup_call_cleanup/3文件中,以下示例调用显示该对象适用于您发布的URL:

html.lgt