kibi-swipl-linux-x64-gnu 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/README.md +29 -0
  2. package/bin/swipl +0 -0
  3. package/bin/swipl-win +0 -0
  4. package/build-manifest.json +70 -0
  5. package/lib/cmake/swipl/SWIPLConfig.cmake +21 -0
  6. package/lib/cmake/swipl/SWIPLConfigVersion.cmake +65 -0
  7. package/lib/cmake/swipl/SWIPLTargets-release.cmake +28 -0
  8. package/lib/cmake/swipl/SWIPLTargets.cmake +109 -0
  9. package/lib/swipl/ABI +1 -0
  10. package/lib/swipl/LICENSE +41 -0
  11. package/lib/swipl/README.md +116 -0
  12. package/lib/swipl/app/README.md +25 -0
  13. package/lib/swipl/app/app.pl +87 -0
  14. package/lib/swipl/app/pack.pl +350 -0
  15. package/lib/swipl/app/qlf.pl +521 -0
  16. package/lib/swipl/app/splfr.pl +177 -0
  17. package/lib/swipl/app/sys.pl +310 -0
  18. package/lib/swipl/bin/swipl.home +1 -0
  19. package/lib/swipl/boot/apply.pl +73 -0
  20. package/lib/swipl/boot/attvar.pl +344 -0
  21. package/lib/swipl/boot/autoload.pl +1226 -0
  22. package/lib/swipl/boot/bags.pl +283 -0
  23. package/lib/swipl/boot/dcg.pl +388 -0
  24. package/lib/swipl/boot/dicts.pl +193 -0
  25. package/lib/swipl/boot/dwim.pl +485 -0
  26. package/lib/swipl/boot/engines.pl +152 -0
  27. package/lib/swipl/boot/expand.pl +1628 -0
  28. package/lib/swipl/boot/gc.pl +65 -0
  29. package/lib/swipl/boot/history.pl +304 -0
  30. package/lib/swipl/boot/init.pl +4682 -0
  31. package/lib/swipl/boot/iri.pl +64 -0
  32. package/lib/swipl/boot/license.pl +390 -0
  33. package/lib/swipl/boot/load.pl +81 -0
  34. package/lib/swipl/boot/messages.pl +2521 -0
  35. package/lib/swipl/boot/packs.pl +306 -0
  36. package/lib/swipl/boot/predopts.pl +154 -0
  37. package/lib/swipl/boot/qlf.pl +141 -0
  38. package/lib/swipl/boot/rc.pl +263 -0
  39. package/lib/swipl/boot/syspred.pl +1634 -0
  40. package/lib/swipl/boot/tabling.pl +2321 -0
  41. package/lib/swipl/boot/threads.pl +42 -0
  42. package/lib/swipl/boot/toplevel.pl +2248 -0
  43. package/lib/swipl/boot/topvars.pl +261 -0
  44. package/lib/swipl/boot.prc +0 -0
  45. package/lib/swipl/cmake/swipl.cmake +131 -0
  46. package/lib/swipl/customize/README.md +23 -0
  47. package/lib/swipl/customize/edit +101 -0
  48. package/lib/swipl/customize/init.pl +164 -0
  49. package/lib/swipl/demo/README.md +33 -0
  50. package/lib/swipl/demo/likes.pl +44 -0
  51. package/lib/swipl/doc/packages/examples/chr/bool.chr +281 -0
  52. package/lib/swipl/doc/packages/examples/chr/chrdif.chr +87 -0
  53. package/lib/swipl/doc/packages/examples/chr/chrfreeze.chr +6 -0
  54. package/lib/swipl/doc/packages/examples/chr/family.chr +116 -0
  55. package/lib/swipl/doc/packages/examples/chr/fib.chr +24 -0
  56. package/lib/swipl/doc/packages/examples/chr/fibonacci.chr +31 -0
  57. package/lib/swipl/doc/packages/examples/chr/gcd.chr +28 -0
  58. package/lib/swipl/doc/packages/examples/chr/leq.chr +34 -0
  59. package/lib/swipl/doc/packages/examples/chr/listdom.chr +138 -0
  60. package/lib/swipl/doc/packages/examples/chr/primes.chr +29 -0
  61. package/lib/swipl/doc/packages/examples/http/README.md +98 -0
  62. package/lib/swipl/doc/packages/examples/http/calc.pl +92 -0
  63. package/lib/swipl/doc/packages/examples/http/demo_body.pl +232 -0
  64. package/lib/swipl/doc/packages/examples/http/demo_client.pl +165 -0
  65. package/lib/swipl/doc/packages/examples/http/demo_daemon.pl +38 -0
  66. package/lib/swipl/doc/packages/examples/http/demo_files.pl +50 -0
  67. package/lib/swipl/doc/packages/examples/http/demo_hello.pl +15 -0
  68. package/lib/swipl/doc/packages/examples/http/demo_login.pl +280 -0
  69. package/lib/swipl/doc/packages/examples/http/demo_openid.pl +177 -0
  70. package/lib/swipl/doc/packages/examples/http/demo_pwp.pl +20 -0
  71. package/lib/swipl/doc/packages/examples/http/demo_rest.pl +56 -0
  72. package/lib/swipl/doc/packages/examples/http/demo_threads.pl +52 -0
  73. package/lib/swipl/doc/packages/examples/http/linux-init-script +126 -0
  74. package/lib/swipl/doc/packages/examples/http/pwp/context.pwp +23 -0
  75. package/lib/swipl/doc/packages/examples/http/pwp/index.pwp +25 -0
  76. package/lib/swipl/doc/packages/examples/http/pwp/pwp1.pwp +12 -0
  77. package/lib/swipl/doc/packages/examples/http/pwp/pwp2.pwp +10 -0
  78. package/lib/swipl/doc/packages/examples/http/pwp/pwp3.pwp +25 -0
  79. package/lib/swipl/doc/packages/examples/http/pwp/pwp4.pwp +23 -0
  80. package/lib/swipl/doc/packages/examples/http/pwp/pwp5.pwp +11 -0
  81. package/lib/swipl/doc/packages/examples/http/pwp/pwp6.pwp +3 -0
  82. package/lib/swipl/doc/packages/examples/http/pwp/pwp7.pwp +3 -0
  83. package/lib/swipl/doc/packages/examples/http/pwp/pwp8.pwp +3 -0
  84. package/lib/swipl/doc/packages/examples/http/pwp/pwpdb.pl +12 -0
  85. package/lib/swipl/doc/packages/examples/http/systemd-script.service +18 -0
  86. package/lib/swipl/doc/packages/examples/http/upstart-script.conf +20 -0
  87. package/lib/swipl/doc/packages/examples/plunit/read.pl +17 -0
  88. package/lib/swipl/doc/packages/examples/plunit/simple.pl +33 -0
  89. package/lib/swipl/doc/packages/examples/ssl/client.pl +83 -0
  90. package/lib/swipl/doc/packages/examples/ssl/etc/README +52 -0
  91. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-cert.p12 +0 -0
  92. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-cert.pem +85 -0
  93. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-key.pem +30 -0
  94. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/cacert.pem +82 -0
  95. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/careq.pem +18 -0
  96. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/crlnumber +1 -0
  97. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/index.txt +3 -0
  98. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/index.txt.attr +1 -0
  99. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/newcerts/9DC08797A0F63F7C.pem +85 -0
  100. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/newcerts/9DC08797A0F63F7D.pem +85 -0
  101. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/private/cakey.pem +30 -0
  102. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/serial +1 -0
  103. package/lib/swipl/doc/packages/examples/ssl/etc/server/server-cert.pem +85 -0
  104. package/lib/swipl/doc/packages/examples/ssl/etc/server/server-key.pem +30 -0
  105. package/lib/swipl/doc/packages/examples/ssl/https.pl +267 -0
  106. package/lib/swipl/doc/packages/examples/ssl/server.pl +106 -0
  107. package/lib/swipl/include/SWI-Prolog.h +1544 -0
  108. package/lib/swipl/include/SWI-Stream.h +537 -0
  109. package/lib/swipl/include/Yap/YapInterface.h +283 -0
  110. package/lib/swipl/include/sicstus/sicstus.h +452 -0
  111. package/lib/swipl/lib/x86_64-linux/cgi.so +0 -0
  112. package/lib/swipl/lib/x86_64-linux/crypt.so +0 -0
  113. package/lib/swipl/lib/x86_64-linux/crypto4pl.so +0 -0
  114. package/lib/swipl/lib/x86_64-linux/double_metaphone.so +0 -0
  115. package/lib/swipl/lib/x86_64-linux/files.so +0 -0
  116. package/lib/swipl/lib/x86_64-linux/hashstream.so +0 -0
  117. package/lib/swipl/lib/x86_64-linux/http_stream.so +0 -0
  118. package/lib/swipl/lib/x86_64-linux/isub.so +0 -0
  119. package/lib/swipl/lib/x86_64-linux/json.so +0 -0
  120. package/lib/swipl/lib/x86_64-linux/libswipl.so.10 +0 -0
  121. package/lib/swipl/lib/x86_64-linux/mallocinfo.so +0 -0
  122. package/lib/swipl/lib/x86_64-linux/md54pl.so +0 -0
  123. package/lib/swipl/lib/x86_64-linux/memfile.so +0 -0
  124. package/lib/swipl/lib/x86_64-linux/ntriples.so +0 -0
  125. package/lib/swipl/lib/x86_64-linux/pcre4pl.so +0 -0
  126. package/lib/swipl/lib/x86_64-linux/porter_stem.so +0 -0
  127. package/lib/swipl/lib/x86_64-linux/process.so +0 -0
  128. package/lib/swipl/lib/x86_64-linux/prolog_stream.so +0 -0
  129. package/lib/swipl/lib/x86_64-linux/rdf_db.so +0 -0
  130. package/lib/swipl/lib/x86_64-linux/readutil.so +0 -0
  131. package/lib/swipl/lib/x86_64-linux/rlimit.so +0 -0
  132. package/lib/swipl/lib/x86_64-linux/sched.so +0 -0
  133. package/lib/swipl/lib/x86_64-linux/sgml2pl.so +0 -0
  134. package/lib/swipl/lib/x86_64-linux/sha4pl.so +0 -0
  135. package/lib/swipl/lib/x86_64-linux/snowball.so +0 -0
  136. package/lib/swipl/lib/x86_64-linux/socket.so +0 -0
  137. package/lib/swipl/lib/x86_64-linux/ssl4pl.so +0 -0
  138. package/lib/swipl/lib/x86_64-linux/streaminfo.so +0 -0
  139. package/lib/swipl/lib/x86_64-linux/syslog.so +0 -0
  140. package/lib/swipl/lib/x86_64-linux/time.so +0 -0
  141. package/lib/swipl/lib/x86_64-linux/turtle.so +0 -0
  142. package/lib/swipl/lib/x86_64-linux/uid.so +0 -0
  143. package/lib/swipl/lib/x86_64-linux/unix.so +0 -0
  144. package/lib/swipl/lib/x86_64-linux/uri.so +0 -0
  145. package/lib/swipl/lib/x86_64-linux/websocket.so +0 -0
  146. package/lib/swipl/lib/x86_64-linux/zlib4pl.so +0 -0
  147. package/lib/swipl/library/INDEX.pl +1020 -0
  148. package/lib/swipl/library/aggregate.pl +755 -0
  149. package/lib/swipl/library/ansi_term.pl +653 -0
  150. package/lib/swipl/library/apply.pl +426 -0
  151. package/lib/swipl/library/apply_macros.pl +497 -0
  152. package/lib/swipl/library/arithmetic.pl +320 -0
  153. package/lib/swipl/library/assoc.pl +522 -0
  154. package/lib/swipl/library/atom.pl +169 -0
  155. package/lib/swipl/library/backcomp.pl +688 -0
  156. package/lib/swipl/library/base32.pl +291 -0
  157. package/lib/swipl/library/base64.pl +441 -0
  158. package/lib/swipl/library/broadcast.pl +161 -0
  159. package/lib/swipl/library/build/cmake.pl +137 -0
  160. package/lib/swipl/library/build/conan.pl +232 -0
  161. package/lib/swipl/library/build/make.pl +168 -0
  162. package/lib/swipl/library/build/tools.pl +825 -0
  163. package/lib/swipl/library/charsio.pl +195 -0
  164. package/lib/swipl/library/check.pl +1097 -0
  165. package/lib/swipl/library/check_installation.pl +912 -0
  166. package/lib/swipl/library/clp/INDEX.pl +157 -0
  167. package/lib/swipl/library/clp/bounds.pl +2036 -0
  168. package/lib/swipl/library/clp/clp_distinct.pl +263 -0
  169. package/lib/swipl/library/clp/clp_events.pl +92 -0
  170. package/lib/swipl/library/clp/clpb.pl +1896 -0
  171. package/lib/swipl/library/clp/clpfd.pl +7906 -0
  172. package/lib/swipl/library/clp/simplex.pl +1580 -0
  173. package/lib/swipl/library/codesio.pl +182 -0
  174. package/lib/swipl/library/coinduction.pl +183 -0
  175. package/lib/swipl/library/console_input.pl +289 -0
  176. package/lib/swipl/library/csv.pl +611 -0
  177. package/lib/swipl/library/ctypes.pl +161 -0
  178. package/lib/swipl/library/date.pl +370 -0
  179. package/lib/swipl/library/dcg/INDEX.pl +35 -0
  180. package/lib/swipl/library/dcg/basics.pl +514 -0
  181. package/lib/swipl/library/dcg/high_order.pl +227 -0
  182. package/lib/swipl/library/debug.pl +499 -0
  183. package/lib/swipl/library/dialect/bim.pl +186 -0
  184. package/lib/swipl/library/dialect/commons.pl +77 -0
  185. package/lib/swipl/library/dialect/eclipse/test_util_iso.pl +355 -0
  186. package/lib/swipl/library/dialect/hprolog/format.pl +44 -0
  187. package/lib/swipl/library/dialect/hprolog.pl +314 -0
  188. package/lib/swipl/library/dialect/ifprolog.pl +1317 -0
  189. package/lib/swipl/library/dialect/iso/iso_predicates.pl +277 -0
  190. package/lib/swipl/library/dialect/sicstus/README.TXT +1 -0
  191. package/lib/swipl/library/dialect/sicstus/arrays.pl +121 -0
  192. package/lib/swipl/library/dialect/sicstus/block.pl +278 -0
  193. package/lib/swipl/library/dialect/sicstus/lists.pl +167 -0
  194. package/lib/swipl/library/dialect/sicstus/ordsets.pl +52 -0
  195. package/lib/swipl/library/dialect/sicstus/sockets.pl +174 -0
  196. package/lib/swipl/library/dialect/sicstus/system.pl +262 -0
  197. package/lib/swipl/library/dialect/sicstus/terms.pl +57 -0
  198. package/lib/swipl/library/dialect/sicstus/timeout.pl +92 -0
  199. package/lib/swipl/library/dialect/sicstus.pl +582 -0
  200. package/lib/swipl/library/dialect/sicstus4/aggregate.pl +60 -0
  201. package/lib/swipl/library/dialect/sicstus4/between.pl +62 -0
  202. package/lib/swipl/library/dialect/sicstus4/clpfd.pl +75 -0
  203. package/lib/swipl/library/dialect/sicstus4/file_systems.pl +413 -0
  204. package/lib/swipl/library/dialect/sicstus4/lists.pl +274 -0
  205. package/lib/swipl/library/dialect/sicstus4/ordsets.pl +54 -0
  206. package/lib/swipl/library/dialect/sicstus4/samsort.pl +86 -0
  207. package/lib/swipl/library/dialect/sicstus4/sets.pl +124 -0
  208. package/lib/swipl/library/dialect/sicstus4/sockets.pl +164 -0
  209. package/lib/swipl/library/dialect/sicstus4/system.pl +80 -0
  210. package/lib/swipl/library/dialect/sicstus4/terms.pl +89 -0
  211. package/lib/swipl/library/dialect/sicstus4/timeout.pl +43 -0
  212. package/lib/swipl/library/dialect/sicstus4/types.pl +103 -0
  213. package/lib/swipl/library/dialect/sicstus4.pl +200 -0
  214. package/lib/swipl/library/dialect/swi/syspred_options.pl +250 -0
  215. package/lib/swipl/library/dialect/xsb/README.md +20 -0
  216. package/lib/swipl/library/dialect/xsb/basics.pl +318 -0
  217. package/lib/swipl/library/dialect/xsb/consult.pl +87 -0
  218. package/lib/swipl/library/dialect/xsb/curr_sym.pl +57 -0
  219. package/lib/swipl/library/dialect/xsb/error_handler.pl +111 -0
  220. package/lib/swipl/library/dialect/xsb/gensym.pl +53 -0
  221. package/lib/swipl/library/dialect/xsb/gpp.pl +138 -0
  222. package/lib/swipl/library/dialect/xsb/intern.pl +48 -0
  223. package/lib/swipl/library/dialect/xsb/lists.pl +47 -0
  224. package/lib/swipl/library/dialect/xsb/machine.pl +295 -0
  225. package/lib/swipl/library/dialect/xsb/ordsets.pl +53 -0
  226. package/lib/swipl/library/dialect/xsb/setof.pl +54 -0
  227. package/lib/swipl/library/dialect/xsb/source.pl +308 -0
  228. package/lib/swipl/library/dialect/xsb/standard.pl +169 -0
  229. package/lib/swipl/library/dialect/xsb/storage.pl +70 -0
  230. package/lib/swipl/library/dialect/xsb/string.pl +76 -0
  231. package/lib/swipl/library/dialect/xsb/thread.pl +62 -0
  232. package/lib/swipl/library/dialect/xsb/timed_call.pl +158 -0
  233. package/lib/swipl/library/dialect/xsb.pl +688 -0
  234. package/lib/swipl/library/dialect/yap/README.TXT +8 -0
  235. package/lib/swipl/library/dialect/yap.pl +283 -0
  236. package/lib/swipl/library/dialect.pl +123 -0
  237. package/lib/swipl/library/dicts.pl +399 -0
  238. package/lib/swipl/library/dif.pl +426 -0
  239. package/lib/swipl/library/edinburgh.pl +138 -0
  240. package/lib/swipl/library/edit.pl +783 -0
  241. package/lib/swipl/library/error.pl +495 -0
  242. package/lib/swipl/library/exceptions.pl +231 -0
  243. package/lib/swipl/library/explain.pl +543 -0
  244. package/lib/swipl/library/ext/RDF/INDEX.pl +25 -0
  245. package/lib/swipl/library/ext/RDF/rdf.pl +450 -0
  246. package/lib/swipl/library/ext/RDF/rdf_parser.pl +649 -0
  247. package/lib/swipl/library/ext/RDF/rdf_triple.pl +448 -0
  248. package/lib/swipl/library/ext/RDF/rdf_write.pl +701 -0
  249. package/lib/swipl/library/ext/RDF/rewrite_term.pl +177 -0
  250. package/lib/swipl/library/ext/chr/chr/a_star.pl +80 -0
  251. package/lib/swipl/library/ext/chr/chr/binomialheap.pl +142 -0
  252. package/lib/swipl/library/ext/chr/chr/builtins.pl +629 -0
  253. package/lib/swipl/library/ext/chr/chr/chr_compiler_errors.pl +179 -0
  254. package/lib/swipl/library/ext/chr/chr/chr_compiler_options.pl +382 -0
  255. package/lib/swipl/library/ext/chr/chr/chr_compiler_utility.pl +338 -0
  256. package/lib/swipl/library/ext/chr/chr/chr_debug.pl +59 -0
  257. package/lib/swipl/library/ext/chr/chr/chr_hashtable_store.pl +425 -0
  258. package/lib/swipl/library/ext/chr/chr/chr_integertable_store.pl +139 -0
  259. package/lib/swipl/library/ext/chr/chr/chr_messages.pl +176 -0
  260. package/lib/swipl/library/ext/chr/chr/chr_op.pl +53 -0
  261. package/lib/swipl/library/ext/chr/chr/chr_runtime.pl +1016 -0
  262. package/lib/swipl/library/ext/chr/chr/chr_translate.pl +25424 -0
  263. package/lib/swipl/library/ext/chr/chr/clean_code.pl +252 -0
  264. package/lib/swipl/library/ext/chr/chr/find.pl +78 -0
  265. package/lib/swipl/library/ext/chr/chr/guard_entailment.pl +19432 -0
  266. package/lib/swipl/library/ext/chr/chr/listmap.pl +108 -0
  267. package/lib/swipl/library/ext/chr/chr/pairlist.pl +78 -0
  268. package/lib/swipl/library/ext/chr/chr.pl +686 -0
  269. package/lib/swipl/library/ext/clib/INDEX.pl +158 -0
  270. package/lib/swipl/library/ext/clib/cgi.pl +86 -0
  271. package/lib/swipl/library/ext/clib/crypt.pl +44 -0
  272. package/lib/swipl/library/ext/clib/filesex.pl +644 -0
  273. package/lib/swipl/library/ext/clib/hash_stream.pl +119 -0
  274. package/lib/swipl/library/ext/clib/mallocinfo.pl +138 -0
  275. package/lib/swipl/library/ext/clib/md5.pl +68 -0
  276. package/lib/swipl/library/ext/clib/memfile.pl +61 -0
  277. package/lib/swipl/library/ext/clib/process.pl +573 -0
  278. package/lib/swipl/library/ext/clib/prolog_server.pl +157 -0
  279. package/lib/swipl/library/ext/clib/prolog_stream.pl +80 -0
  280. package/lib/swipl/library/ext/clib/rlimit.pl +54 -0
  281. package/lib/swipl/library/ext/clib/sched.pl +85 -0
  282. package/lib/swipl/library/ext/clib/sha.pl +162 -0
  283. package/lib/swipl/library/ext/clib/socket.pl +1102 -0
  284. package/lib/swipl/library/ext/clib/streaminfo.pl +103 -0
  285. package/lib/swipl/library/ext/clib/streampool.pl +136 -0
  286. package/lib/swipl/library/ext/clib/syslog.pl +180 -0
  287. package/lib/swipl/library/ext/clib/time.pl +194 -0
  288. package/lib/swipl/library/ext/clib/udp_broadcast.pl +975 -0
  289. package/lib/swipl/library/ext/clib/uid.pl +220 -0
  290. package/lib/swipl/library/ext/clib/unix.pl +317 -0
  291. package/lib/swipl/library/ext/clib/uri.pl +530 -0
  292. package/lib/swipl/library/ext/clib/uuid.pl +207 -0
  293. package/lib/swipl/library/ext/http/http/INDEX.pl +266 -0
  294. package/lib/swipl/library/ext/http/http/README.md +34 -0
  295. package/lib/swipl/library/ext/http/http/ax.pl +189 -0
  296. package/lib/swipl/library/ext/http/http/dcg_basics.pl +49 -0
  297. package/lib/swipl/library/ext/http/http/graphql.pl +1367 -0
  298. package/lib/swipl/library/ext/http/http/html_decl.pl +416 -0
  299. package/lib/swipl/library/ext/http/http/html_head.pl +654 -0
  300. package/lib/swipl/library/ext/http/http/html_quasiquotations.pl +120 -0
  301. package/lib/swipl/library/ext/http/http/html_write.pl +1425 -0
  302. package/lib/swipl/library/ext/http/http/htmx.pl +139 -0
  303. package/lib/swipl/library/ext/http/http/http_authenticate.pl +364 -0
  304. package/lib/swipl/library/ext/http/http/http_client.pl +412 -0
  305. package/lib/swipl/library/ext/http/http/http_cookie.pl +245 -0
  306. package/lib/swipl/library/ext/http/http/http_cors.pl +176 -0
  307. package/lib/swipl/library/ext/http/http/http_digest.pl +820 -0
  308. package/lib/swipl/library/ext/http/http/http_dirindex.pl +296 -0
  309. package/lib/swipl/library/ext/http/http/http_dispatch.pl +1552 -0
  310. package/lib/swipl/library/ext/http/http/http_dyn_workers.pl +214 -0
  311. package/lib/swipl/library/ext/http/http/http_error.pl +126 -0
  312. package/lib/swipl/library/ext/http/http/http_exception.pl +225 -0
  313. package/lib/swipl/library/ext/http/http/http_files.pl +163 -0
  314. package/lib/swipl/library/ext/http/http/http_header.pl +2820 -0
  315. package/lib/swipl/library/ext/http/http/http_hook.pl +106 -0
  316. package/lib/swipl/library/ext/http/http/http_host.pl +204 -0
  317. package/lib/swipl/library/ext/http/http/http_load.pl +113 -0
  318. package/lib/swipl/library/ext/http/http/http_log.pl +738 -0
  319. package/lib/swipl/library/ext/http/http/http_multipart_plugin.pl +232 -0
  320. package/lib/swipl/library/ext/http/http/http_open.pl +1821 -0
  321. package/lib/swipl/library/ext/http/http/http_openid.pl +1561 -0
  322. package/lib/swipl/library/ext/http/http/http_parameters.pl +504 -0
  323. package/lib/swipl/library/ext/http/http/http_path.pl +380 -0
  324. package/lib/swipl/library/ext/http/http/http_proxy.pl +80 -0
  325. package/lib/swipl/library/ext/http/http/http_pwp.pl +351 -0
  326. package/lib/swipl/library/ext/http/http/http_redis_plugin.pl +332 -0
  327. package/lib/swipl/library/ext/http/http/http_server.pl +105 -0
  328. package/lib/swipl/library/ext/http/http/http_server_files.pl +126 -0
  329. package/lib/swipl/library/ext/http/http/http_server_health.pl +186 -0
  330. package/lib/swipl/library/ext/http/http/http_session.pl +1040 -0
  331. package/lib/swipl/library/ext/http/http/http_sgml_plugin.pl +137 -0
  332. package/lib/swipl/library/ext/http/http/http_stream.pl +376 -0
  333. package/lib/swipl/library/ext/http/http/http_unix_daemon.pl +989 -0
  334. package/lib/swipl/library/ext/http/http/http_wrapper.pl +559 -0
  335. package/lib/swipl/library/ext/http/http/hub.pl +600 -0
  336. package/lib/swipl/library/ext/http/http/js_write.pl +461 -0
  337. package/lib/swipl/library/ext/http/http/mimepack.pl +224 -0
  338. package/lib/swipl/library/ext/http/http/mimetype.pl +276 -0
  339. package/lib/swipl/library/ext/http/http/term_html.pl +797 -0
  340. package/lib/swipl/library/ext/http/http/thread_httpd.pl +1181 -0
  341. package/lib/swipl/library/ext/http/http/web/css/dirindex.css +24 -0
  342. package/lib/swipl/library/ext/http/http/web/css/openid.css +57 -0
  343. package/lib/swipl/library/ext/http/http/web/icons/back.png +0 -0
  344. package/lib/swipl/library/ext/http/http/web/icons/c.png +0 -0
  345. package/lib/swipl/library/ext/http/http/web/icons/compressed.png +0 -0
  346. package/lib/swipl/library/ext/http/http/web/icons/folder.png +0 -0
  347. package/lib/swipl/library/ext/http/http/web/icons/generic.png +0 -0
  348. package/lib/swipl/library/ext/http/http/web/icons/layout.png +0 -0
  349. package/lib/swipl/library/ext/http/http/web/icons/openid-logo-square.png +0 -0
  350. package/lib/swipl/library/ext/http/http/web/icons/openid-logo-tiny.png +0 -0
  351. package/lib/swipl/library/ext/http/http/websocket.pl +729 -0
  352. package/lib/swipl/library/ext/http/http/yadis.pl +205 -0
  353. package/lib/swipl/library/ext/json/INDEX.pl +36 -0
  354. package/lib/swipl/library/ext/json/http/INDEX.pl +16 -0
  355. package/lib/swipl/library/ext/json/http/http_json.pl +490 -0
  356. package/lib/swipl/library/ext/json/http/js_grammar.pl +53 -0
  357. package/lib/swipl/library/ext/json/http/json.pl +48 -0
  358. package/lib/swipl/library/ext/json/http/json_convert.pl +48 -0
  359. package/lib/swipl/library/ext/json/json.pl +1215 -0
  360. package/lib/swipl/library/ext/json/json_convert.pl +681 -0
  361. package/lib/swipl/library/ext/json/json_grammar.pl +349 -0
  362. package/lib/swipl/library/ext/json/json_rpc_client.pl +423 -0
  363. package/lib/swipl/library/ext/json/json_rpc_common.pl +104 -0
  364. package/lib/swipl/library/ext/json/json_rpc_server.pl +489 -0
  365. package/lib/swipl/library/ext/json/json_schema.pl +2111 -0
  366. package/lib/swipl/library/ext/nlp/INDEX.pl +15 -0
  367. package/lib/swipl/library/ext/nlp/double_metaphone.pl +86 -0
  368. package/lib/swipl/library/ext/nlp/isub.pl +162 -0
  369. package/lib/swipl/library/ext/nlp/porter_stem.pl +50 -0
  370. package/lib/swipl/library/ext/nlp/snowball.pl +97 -0
  371. package/lib/swipl/library/ext/pcre/INDEX.pl +17 -0
  372. package/lib/swipl/library/ext/pcre/pcre.pl +974 -0
  373. package/lib/swipl/library/ext/plunit/INDEX.pl +20 -0
  374. package/lib/swipl/library/ext/plunit/plunit.pl +2631 -0
  375. package/lib/swipl/library/ext/plunit/test_wizard.pl +249 -0
  376. package/lib/swipl/library/ext/semweb/semweb/INDEX.pl +288 -0
  377. package/lib/swipl/library/ext/semweb/semweb/rdf11.pl +2106 -0
  378. package/lib/swipl/library/ext/semweb/semweb/rdf11_containers.pl +299 -0
  379. package/lib/swipl/library/ext/semweb/semweb/rdf_cache.pl +278 -0
  380. package/lib/swipl/library/ext/semweb/semweb/rdf_compare.pl +132 -0
  381. package/lib/swipl/library/ext/semweb/semweb/rdf_db.pl +3468 -0
  382. package/lib/swipl/library/ext/semweb/semweb/rdf_edit.pl +1145 -0
  383. package/lib/swipl/library/ext/semweb/semweb/rdf_http_plugin.pl +274 -0
  384. package/lib/swipl/library/ext/semweb/semweb/rdf_library.pl +1021 -0
  385. package/lib/swipl/library/ext/semweb/semweb/rdf_litindex.pl +1035 -0
  386. package/lib/swipl/library/ext/semweb/semweb/rdf_ntriples.pl +422 -0
  387. package/lib/swipl/library/ext/semweb/semweb/rdf_persistency.pl +1576 -0
  388. package/lib/swipl/library/ext/semweb/semweb/rdf_portray.pl +182 -0
  389. package/lib/swipl/library/ext/semweb/semweb/rdf_prefixes.pl +681 -0
  390. package/lib/swipl/library/ext/semweb/semweb/rdf_sandbox.pl +153 -0
  391. package/lib/swipl/library/ext/semweb/semweb/rdf_turtle.pl +54 -0
  392. package/lib/swipl/library/ext/semweb/semweb/rdf_turtle_write.pl +1587 -0
  393. package/lib/swipl/library/ext/semweb/semweb/rdf_zlib_plugin.pl +52 -0
  394. package/lib/swipl/library/ext/semweb/semweb/rdfa.pl +1510 -0
  395. package/lib/swipl/library/ext/semweb/semweb/rdfs.pl +475 -0
  396. package/lib/swipl/library/ext/semweb/semweb/sparql_client.pl +643 -0
  397. package/lib/swipl/library/ext/semweb/semweb/turtle.pl +455 -0
  398. package/lib/swipl/library/ext/sgml/DTD/HTML4.dcl +88 -0
  399. package/lib/swipl/library/ext/sgml/DTD/HTML4.dtd +1092 -0
  400. package/lib/swipl/library/ext/sgml/DTD/HTML4.soc +6 -0
  401. package/lib/swipl/library/ext/sgml/DTD/HTML5.dtd +906 -0
  402. package/lib/swipl/library/ext/sgml/DTD/HTMLlat1.ent +195 -0
  403. package/lib/swipl/library/ext/sgml/DTD/HTMLspec.ent +77 -0
  404. package/lib/swipl/library/ext/sgml/DTD/HTMLsym.ent +241 -0
  405. package/lib/swipl/library/ext/sgml/INDEX.pl +64 -0
  406. package/lib/swipl/library/ext/sgml/c14n2.pl +203 -0
  407. package/lib/swipl/library/ext/sgml/iso_639.pl +631 -0
  408. package/lib/swipl/library/ext/sgml/pwp.pl +705 -0
  409. package/lib/swipl/library/ext/sgml/sgml.pl +815 -0
  410. package/lib/swipl/library/ext/sgml/sgml_write.pl +1003 -0
  411. package/lib/swipl/library/ext/sgml/xpath.pl +620 -0
  412. package/lib/swipl/library/ext/sgml/xsdp_types.pl +232 -0
  413. package/lib/swipl/library/ext/ssl/INDEX.pl +60 -0
  414. package/lib/swipl/library/ext/ssl/crypto.pl +1015 -0
  415. package/lib/swipl/library/ext/ssl/http/INDEX.pl +5 -0
  416. package/lib/swipl/library/ext/ssl/http/http_ssl_plugin.pl +296 -0
  417. package/lib/swipl/library/ext/ssl/saml.pl +609 -0
  418. package/lib/swipl/library/ext/ssl/ssl.pl +647 -0
  419. package/lib/swipl/library/ext/ssl/xmldsig.pl +391 -0
  420. package/lib/swipl/library/ext/ssl/xmlenc.pl +354 -0
  421. package/lib/swipl/library/ext/zlib/INDEX.pl +8 -0
  422. package/lib/swipl/library/ext/zlib/zlib.pl +112 -0
  423. package/lib/swipl/library/fastrw.pl +105 -0
  424. package/lib/swipl/library/files.pl +80 -0
  425. package/lib/swipl/library/gensym.pl +111 -0
  426. package/lib/swipl/library/git.pl +1027 -0
  427. package/lib/swipl/library/hashtable.pl +365 -0
  428. package/lib/swipl/library/heaps.pl +252 -0
  429. package/lib/swipl/library/hotfix.pl +239 -0
  430. package/lib/swipl/library/http/jquery.pl +103 -0
  431. package/lib/swipl/library/http/web/js/jquery-3.6.0.min.js +2 -0
  432. package/lib/swipl/library/increval.pl +217 -0
  433. package/lib/swipl/library/intercept.pl +263 -0
  434. package/lib/swipl/library/iostream.pl +237 -0
  435. package/lib/swipl/library/iri_scheme/file.pl +70 -0
  436. package/lib/swipl/library/lazy_lists.pl +481 -0
  437. package/lib/swipl/library/listing.pl +1362 -0
  438. package/lib/swipl/library/lists.pl +860 -0
  439. package/lib/swipl/library/lynx/INDEX.pl +14 -0
  440. package/lib/swipl/library/lynx/format.pl +380 -0
  441. package/lib/swipl/library/lynx/html_style.pl +129 -0
  442. package/lib/swipl/library/lynx/html_text.pl +865 -0
  443. package/lib/swipl/library/lynx/pldoc_style.pl +87 -0
  444. package/lib/swipl/library/macros.pl +451 -0
  445. package/lib/swipl/library/main.pl +1200 -0
  446. package/lib/swipl/library/make.pl +197 -0
  447. package/lib/swipl/library/modules.pl +129 -0
  448. package/lib/swipl/library/nb_rbtrees.pl +267 -0
  449. package/lib/swipl/library/nb_set.pl +203 -0
  450. package/lib/swipl/library/obfuscate.pl +115 -0
  451. package/lib/swipl/library/occurs.pl +241 -0
  452. package/lib/swipl/library/operators.pl +182 -0
  453. package/lib/swipl/library/option.pl +388 -0
  454. package/lib/swipl/library/optparse.pl +966 -0
  455. package/lib/swipl/library/ordsets.pl +518 -0
  456. package/lib/swipl/library/oset.pl +160 -0
  457. package/lib/swipl/library/pairs.pl +187 -0
  458. package/lib/swipl/library/persistency.pl +713 -0
  459. package/lib/swipl/library/pio.pl +47 -0
  460. package/lib/swipl/library/portray_text.pl +277 -0
  461. package/lib/swipl/library/pprint.pl +940 -0
  462. package/lib/swipl/library/predicate_options.pl +975 -0
  463. package/lib/swipl/library/prolog_autoload.pl +233 -0
  464. package/lib/swipl/library/prolog_breakpoints.pl +396 -0
  465. package/lib/swipl/library/prolog_clause.pl +1104 -0
  466. package/lib/swipl/library/prolog_code.pl +416 -0
  467. package/lib/swipl/library/prolog_codewalk.pl +1248 -0
  468. package/lib/swipl/library/prolog_colour.pl +3301 -0
  469. package/lib/swipl/library/prolog_colour.qlf +0 -0
  470. package/lib/swipl/library/prolog_config.pl +154 -0
  471. package/lib/swipl/library/prolog_coverage.pl +1333 -0
  472. package/lib/swipl/library/prolog_debug.pl +404 -0
  473. package/lib/swipl/library/prolog_deps.pl +675 -0
  474. package/lib/swipl/library/prolog_evaluable.pl +234 -0
  475. package/lib/swipl/library/prolog_format.pl +219 -0
  476. package/lib/swipl/library/prolog_history.pl +161 -0
  477. package/lib/swipl/library/prolog_jiti.pl +333 -0
  478. package/lib/swipl/library/prolog_locale.pl +61 -0
  479. package/lib/swipl/library/prolog_metainference.pl +307 -0
  480. package/lib/swipl/library/prolog_pack.pl +3906 -0
  481. package/lib/swipl/library/prolog_profile.pl +346 -0
  482. package/lib/swipl/library/prolog_qlfmake.pl +533 -0
  483. package/lib/swipl/library/prolog_source.pl +1188 -0
  484. package/lib/swipl/library/prolog_stack.pl +794 -0
  485. package/lib/swipl/library/prolog_trace.pl +365 -0
  486. package/lib/swipl/library/prolog_versions.pl +347 -0
  487. package/lib/swipl/library/prolog_wrap.pl +164 -0
  488. package/lib/swipl/library/prolog_xref.pl +3090 -0
  489. package/lib/swipl/library/prolog_xref.qlf +0 -0
  490. package/lib/swipl/library/pure_input.pl +266 -0
  491. package/lib/swipl/library/qpforeign.pl +695 -0
  492. package/lib/swipl/library/qsave.pl +1516 -0
  493. package/lib/swipl/library/quasi_quotations.pl +300 -0
  494. package/lib/swipl/library/quintus.pl +437 -0
  495. package/lib/swipl/library/random.pl +459 -0
  496. package/lib/swipl/library/rbtrees.pl +1153 -0
  497. package/lib/swipl/library/readln.pl +256 -0
  498. package/lib/swipl/library/readutil.pl +304 -0
  499. package/lib/swipl/library/record.pl +544 -0
  500. package/lib/swipl/library/rwlocks.pl +172 -0
  501. package/lib/swipl/library/sandbox.pl +1384 -0
  502. package/lib/swipl/library/semweb/dc.rdfs +198 -0
  503. package/lib/swipl/library/semweb/eor.rdfs +95 -0
  504. package/lib/swipl/library/semweb/owl.owl +287 -0
  505. package/lib/swipl/library/semweb/rdf_library.ttl +90 -0
  506. package/lib/swipl/library/semweb/rdfs.rdfs +251 -0
  507. package/lib/swipl/library/settings.pl +755 -0
  508. package/lib/swipl/library/shell.pl +462 -0
  509. package/lib/swipl/library/shlib.pl +670 -0
  510. package/lib/swipl/library/solution_sequences.pl +439 -0
  511. package/lib/swipl/library/sort.pl +119 -0
  512. package/lib/swipl/library/statistics.pl +541 -0
  513. package/lib/swipl/library/streams.pl +118 -0
  514. package/lib/swipl/library/strings.pl +469 -0
  515. package/lib/swipl/library/system.pl +95 -0
  516. package/lib/swipl/library/tables.pl +381 -0
  517. package/lib/swipl/library/tableutil.pl +771 -0
  518. package/lib/swipl/library/tabling.pl +42 -0
  519. package/lib/swipl/library/terms.pl +457 -0
  520. package/lib/swipl/library/theme/auto.pl +61 -0
  521. package/lib/swipl/library/theme/dark.pl +455 -0
  522. package/lib/swipl/library/theme/light.pl +45 -0
  523. package/lib/swipl/library/thread.pl +810 -0
  524. package/lib/swipl/library/thread_pool.pl +508 -0
  525. package/lib/swipl/library/threadutil.pl +574 -0
  526. package/lib/swipl/library/tty.pl +316 -0
  527. package/lib/swipl/library/ugraphs.pl +644 -0
  528. package/lib/swipl/library/unicode/INDEX.pl +6 -0
  529. package/lib/swipl/library/unicode/blocks.pl +414 -0
  530. package/lib/swipl/library/url.pl +1129 -0
  531. package/lib/swipl/library/utf8.pl +145 -0
  532. package/lib/swipl/library/varnumbers.pl +221 -0
  533. package/lib/swipl/library/vm.pl +251 -0
  534. package/lib/swipl/library/wfs.pl +205 -0
  535. package/lib/swipl/library/when.pl +263 -0
  536. package/lib/swipl/library/writef.pl +278 -0
  537. package/lib/swipl/library/www_browser.pl +251 -0
  538. package/lib/swipl/library/yall.pl +574 -0
  539. package/lib/swipl/library/zip.pl +211 -0
  540. package/lib/swipl/swipl.home +1 -0
  541. package/lib/vendor/libcrypto.so.3 +0 -0
  542. package/lib/vendor/libpcre2-8.so.0 +0 -0
  543. package/lib/vendor/libssl.so.3 +0 -0
  544. package/lib/vendor/libz.so.1 +0 -0
  545. package/licenses/OpenSSL-LICENSE.txt +177 -0
  546. package/licenses/PCRE2-COPYING +5 -0
  547. package/licenses/README.md +12 -0
  548. package/licenses/SWI-Prolog-LICENSE +41 -0
  549. package/licenses/zlib-LICENSE +22 -0
  550. package/package.json +27 -0
@@ -0,0 +1,738 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Jan Wielemaker
4
+ E-mail: J.Wielemaker@vu.nl
5
+ WWW: http://www.swi-prolog.org
6
+ Copyright (c) 2008-2025, University of Amsterdam
7
+ VU University Amsterdam
8
+ CWI, Amsterdam
9
+ SWI-Prolog Solutions b.v.
10
+ All rights reserved.
11
+
12
+ Redistribution and use in source and binary forms, with or without
13
+ modification, are permitted provided that the following conditions
14
+ are met:
15
+
16
+ 1. Redistributions of source code must retain the above copyright
17
+ notice, this list of conditions and the following disclaimer.
18
+
19
+ 2. Redistributions in binary form must reproduce the above copyright
20
+ notice, this list of conditions and the following disclaimer in
21
+ the documentation and/or other materials provided with the
22
+ distribution.
23
+
24
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
+ POSSIBILITY OF SUCH DAMAGE.
36
+ */
37
+
38
+ :- module(http_log,
39
+ [ http_log_stream/1, % -Stream
40
+ http_log/2, % +Format, +Args
41
+ http_log_close/1, % +Reason
42
+ post_data_encoded/2, % ?Bytes, ?Encoded
43
+ http_logrotate/1, % +Options
44
+ http_schedule_logrotate/2 % +When, +Options
45
+ ]).
46
+ :- use_module(library(http/http_header)).
47
+ :- use_module(library(settings)).
48
+ :- use_module(library(option)).
49
+ :- use_module(library(error)).
50
+ :- use_module(library(debug)).
51
+ :- use_module(library(broadcast)).
52
+
53
+ :- setting(http:logfile, callable, 'httpd.log',
54
+ 'File in which to log HTTP requests').
55
+ :- setting(http:log_post_data, integer, 0,
56
+ 'Log POST data up to N bytes long').
57
+ :- setting(http:on_log_error, any, retry,
58
+ 'Action if logging fails').
59
+
60
+ /** <module> HTTP Logging module
61
+
62
+ Simple module for logging HTTP requests to a file. Logging is enabled by
63
+ loading this file and ensure the setting http:logfile is not the empty
64
+ atom. The default file for writing the log is =|httpd.log|=. See
65
+ library(settings) for details.
66
+
67
+ The level of logging can be modified using the multifile predicate
68
+ http_log:nolog/1 to hide HTTP request fields from the logfile and
69
+ http_log:password_field/1 to hide passwords from HTTP search
70
+ specifications (e.g. =|/topsecret?password=secret|=).
71
+ */
72
+
73
+ :- multifile
74
+ nolog/1,
75
+ password_field/1,
76
+ nolog_post_content_type/1.
77
+
78
+ % If the log settings change, simply close the log and it will be
79
+ % reopened with the new settings.
80
+
81
+ :- listen(settings(changed(http:logfile, _, New)),
82
+ http_log_close(changed(New))).
83
+ :- listen(http(Message),
84
+ http_message(Message)).
85
+ :- listen(logrotate,
86
+ http_log_close(logrotate)).
87
+
88
+ http_message(Message) :-
89
+ log_message(Message),
90
+ http_log_stream(Stream),
91
+ E = error(_,_),
92
+ catch(http_message(Message, Stream), E,
93
+ log_error(E)).
94
+
95
+ log_message(request_start(_Id, _Request)).
96
+ log_message(request_finished(_Id, _Code, _Status, _CPU, _Bytes)).
97
+
98
+ http_message(request_start(Id, Request), Stream) :-
99
+ log_started(Request, Id, Stream).
100
+ http_message(request_finished(Id, Code, Status, CPU, Bytes), Stream) :-
101
+ log_completed(Code, Status, Bytes, Id, CPU, Stream).
102
+
103
+ %! log_error(+Error)
104
+ %
105
+ % There was an error writing the log file. The message is printed
106
+ % using print_message/2 and execution continues according to the
107
+ % setting `http:on_log_error`, which is one of:
108
+ %
109
+ % - retry
110
+ % Close the log file. The system will try to reopen it on the
111
+ % next log event, recovering from the error. Note that the
112
+ % most common case for this is probably running out of disc space.
113
+ % - exit
114
+ % - exit(Code)
115
+ % Stop the server using halt(Code). The `exit` variant is
116
+ % equivalent to exit(1).
117
+ %
118
+ % The best choice depends on your priorities. Using `retry` gives
119
+ % priority to keep the server running. Using `exit` guarantees proper
120
+ % log files and thus the ability to examine these for security
121
+ % reasons. An attacker may try to flood the disc, causing a successful
122
+ % DoS attack if `exit` is used and the ability to interact without
123
+ % being logged if `retry` is used.
124
+
125
+ log_error(E) :-
126
+ print_message(warning, E),
127
+ log_error_continue.
128
+
129
+ log_error_continue :-
130
+ setting(http:on_log_error, Action),
131
+ log_error_continue(Action).
132
+
133
+ log_error_continue(retry) :-
134
+ http_log_close(error).
135
+ log_error_continue(exit) :-
136
+ log_error_continue(exit(1)).
137
+ log_error_continue(exit(Code)) :-
138
+ halt(Code).
139
+
140
+
141
+
142
+ /*******************************
143
+ * LOG ACTIVITY *
144
+ *******************************/
145
+
146
+ :- dynamic
147
+ log_stream/2, % Stream, TimeTried
148
+ halt_registered/0.
149
+
150
+ %! http_log_stream(-Stream) is semidet.
151
+ %
152
+ % True when Stream is a stream to the opened HTTP log file. Opens the
153
+ % log file in `append` mode if the file is not yet open. The log file
154
+ % is determined from the setting ``http:logfile``. If this setting is
155
+ % set to the empty atom (''), this predicate fails.
156
+ %
157
+ % If a file error is encountered, this is reported using
158
+ % print_message/2, after which this predicate silently fails. Opening
159
+ % is retried every minute when a new message arrives.
160
+ %
161
+ % Before opening the log file, the message http_log_open(Term) is
162
+ % broadcasted. This message allows for creating the directory,
163
+ % renaming, deleting or truncating an existing log file.
164
+
165
+ http_log_stream(Stream) :-
166
+ log_stream(Stream, _Opened),
167
+ !,
168
+ Stream \== [].
169
+ http_log_stream([]) :-
170
+ setting(http:logfile, ''),
171
+ !,
172
+ get_time(Now),
173
+ assert(log_stream([], Now)),
174
+ fail.
175
+ http_log_stream(Stream) :-
176
+ setting(http:logfile, Term),
177
+ broadcast(http_log_open(Term)),
178
+ catch(absolute_file_name(Term, File,
179
+ [ access(append)
180
+ ]),
181
+ E, open_error(E)),
182
+ with_mutex(http_log, open_log(File, Stream0)),
183
+ Stream = Stream0.
184
+
185
+ open_log(_File, Stream) :-
186
+ log_stream(Stream, Opened),
187
+ ( Stream == []
188
+ -> ( get_time(Now),
189
+ Now - Opened > 60
190
+ -> retractall(log_stream(_,_)),
191
+ fail
192
+ ; !, fail
193
+ )
194
+ ; true
195
+ ), !.
196
+ open_log(File, Stream) :-
197
+ catch(open(File, append, Stream,
198
+ [ close_on_abort(false),
199
+ encoding(utf8),
200
+ buffer(line)
201
+ ]), E, open_error(E)),
202
+ get_time(Time),
203
+ register_close_log,
204
+ Error = error(_,_),
205
+ catch(format(Stream,
206
+ 'server(started, ~0f).~n',
207
+ [ Time ]),
208
+ Error,
209
+ open_error(Stream, Error)),
210
+ assert(log_stream(Stream, Time)).
211
+
212
+ open_error(Stream, E) :-
213
+ close(Stream, [force(true)]),
214
+ open_error(E).
215
+
216
+ open_error(E) :-
217
+ print_message(error, E),
218
+ log_open_error_continue.
219
+
220
+ log_open_error_continue :-
221
+ setting(http:on_log_error, Action),
222
+ log_open_error_continue(Action).
223
+
224
+ log_open_error_continue(retry) :-
225
+ !,
226
+ get_time(Now),
227
+ assert(log_stream([], Now)),
228
+ fail.
229
+ log_open_error_continue(Action) :-
230
+ log_error_continue(Action).
231
+
232
+ register_close_log :-
233
+ halt_registered,
234
+ !.
235
+ register_close_log :-
236
+ at_halt(close_log(stopped)),
237
+ asserta(halt_registered).
238
+
239
+ %! http_log_close(+Reason) is det.
240
+ %
241
+ % If there is a currently open HTTP logfile, close it after adding
242
+ % a term server(Reason, Time). to the logfile. This call is
243
+ % intended for cooperation with the Unix logrotate facility
244
+ % using the following schema:
245
+ %
246
+ % * Move logfile (the HTTP server keeps writing to the moved
247
+ % file)
248
+ % * Inform the server using an HTTP request that calls
249
+ % http_log_close/1
250
+ % * Compress the moved logfile
251
+ %
252
+ % @author Suggested by Jacco van Ossenbruggen
253
+
254
+ http_log_close(Reason) :-
255
+ with_mutex(http_log, close_log(Reason)).
256
+
257
+ close_log(Reason) :-
258
+ retract(log_stream(Stream, _Opened)),
259
+ !,
260
+ ( is_stream(Stream)
261
+ -> get_time(Time),
262
+ catch(( format(Stream, 'server(~q, ~0f).~n', [ Reason, Time ]),
263
+ close(Stream)
264
+ ), E, print_message(warning, E))
265
+ ; true
266
+ ).
267
+ close_log(_).
268
+
269
+ %! http_log(+Format, +Args) is det.
270
+ %
271
+ % Write message from Format and Args to log-stream. See format/2
272
+ % for details. Succeed without side effects if logging is not
273
+ % enabled.
274
+
275
+ http_log(Format, Args) :-
276
+ ( http_log_stream(Stream)
277
+ -> Error = error(_,_),
278
+ catch(system:format(Stream, Format, Args), % use operators from `system`
279
+ Error,
280
+ log_error(Error))
281
+ ; true
282
+ ).
283
+
284
+
285
+ %! log_started(+Request, +Id, +Stream) is det.
286
+ %
287
+ % Write log message that Request was started to Stream.
288
+ %
289
+ % @arg Filled with sequence identifier for the request
290
+
291
+ log_started(Request, Id, Stream) :-
292
+ is_stream(Stream),
293
+ !,
294
+ get_time(Now),
295
+ add_post_data(Request, Request1),
296
+ log_request(Request1, LogRequest),
297
+ format_time(string(HDate), '%+', Now),
298
+ format(Stream,
299
+ '/*~s*/ request(~q, ~3f, ~q).~n',
300
+ [HDate, Id, Now, LogRequest]).
301
+ log_started(_, _, _).
302
+
303
+ %! log_request(+Request, -Log)
304
+ %
305
+ % Remove passwords from the request to avoid sending them to the
306
+ % logfiles.
307
+
308
+ log_request([], []).
309
+ log_request([search(Search0)|T0], [search(Search)|T]) :-
310
+ !,
311
+ mask_passwords(Search0, Search),
312
+ log_request(T0, T).
313
+ log_request([H|T0], T) :-
314
+ nolog(H),
315
+ !,
316
+ log_request(T0, T).
317
+ log_request([H|T0], [H|T]) :-
318
+ log_request(T0, T).
319
+
320
+ mask_passwords([], []).
321
+ mask_passwords([Name=_|T0], [Name=xxx|T]) :-
322
+ password_field(Name),
323
+ !,
324
+ mask_passwords(T0, T).
325
+ mask_passwords([H|T0], [H|T]) :-
326
+ mask_passwords(T0, T).
327
+
328
+ %! password_field(+Field) is semidet.
329
+ %
330
+ % Multifile predicate that can be defined to hide passwords from
331
+ % the logfile.
332
+
333
+ password_field(password).
334
+ password_field(pwd0).
335
+ password_field(pwd1).
336
+ password_field(pwd2).
337
+
338
+
339
+ %! nolog(+HTTPField)
340
+ %
341
+ % Multifile predicate that can be defined to hide request
342
+ % parameters from the request logfile.
343
+
344
+ nolog(input(_)).
345
+ nolog(accept(_)).
346
+ nolog(accept_language(_)).
347
+ nolog(accept_encoding(_)).
348
+ nolog(accept_charset(_)).
349
+ nolog(pool(_)).
350
+ nolog(protocol(_)).
351
+ nolog(referer(R)) :-
352
+ sub_atom(R, _, _, _, password),
353
+ !.
354
+
355
+ %! nolog_post_content_type(+Type) is semidet.
356
+ %
357
+ % Multifile hook called with the =|Content-type|= header. If the
358
+ % hook succeeds, the POST data is not logged. For example, to stop
359
+ % logging anything but application/json messages:
360
+ %
361
+ % ==
362
+ % :- multifile http_log:nolog_post_content_type/1.
363
+ %
364
+ % http_log:nolog_post_content_type(Type) :-
365
+ % Type \= (application/json).
366
+ % ==
367
+ %
368
+ % @arg Type is a term MainType/SubType
369
+
370
+ %! add_post_data(+Request0, -Request) is det.
371
+ %
372
+ % Add a request field post_data(Data) if the setting
373
+ % http:log_post_data is an integer > 0, the content length < this
374
+ % setting and nolog_post_content_type/1 does not succeed on the
375
+ % provided content type.
376
+
377
+ add_post_data(Request0, Request) :-
378
+ setting(http:log_post_data, MaxLen),
379
+ integer(MaxLen), MaxLen > 0,
380
+ memberchk(input(In), Request0),
381
+ memberchk(content_length(CLen), Request0),
382
+ CLen =< MaxLen,
383
+ memberchk(content_type(Type), Request0),
384
+ http_parse_header_value(content_type, Type, media(MType/MSubType, _)),
385
+ \+ nolog_post_content_type(MType/MSubType),
386
+ catch(peek_string(In, CLen, PostData), _, fail),
387
+ !,
388
+ post_data_encoded(PostData, Encoded),
389
+ Request = [post_data(Encoded)|Request0].
390
+ add_post_data(Request, Request).
391
+
392
+ %! post_data_encoded(?Bytes:string, ?Encoded:string) is det.
393
+ %
394
+ % Encode the POST body for inclusion into the HTTP log file. The
395
+ % POST data is (in/de)flated using zopen/3 and base64 encoded
396
+ % using base64//1. The encoding makes long text messages shorter
397
+ % and keeps readable logfiles if binary data is posted.
398
+
399
+ post_data_encoded(Bytes, Hex) :-
400
+ nonvar(Bytes),
401
+ !,
402
+ setup_call_cleanup(
403
+ new_memory_file(HMem),
404
+ ( setup_call_cleanup(
405
+ ( open_memory_file(HMem, write, Out, [encoding(octet)]),
406
+ zopen(Out, ZOut, [])
407
+ ),
408
+ format(ZOut, '~s', [Bytes]),
409
+ close(ZOut)),
410
+ memory_file_to_codes(HMem, Codes, octet)
411
+ ),
412
+ free_memory_file(HMem)),
413
+ phrase(base64(Codes), EncCodes),
414
+ string_codes(Hex, EncCodes).
415
+ post_data_encoded(Bytes, Hex) :-
416
+ string_codes(Hex, EncCodes),
417
+ phrase(base64(Codes), EncCodes),
418
+ string_codes(ZBytes, Codes),
419
+ setup_call_cleanup(
420
+ open_string(ZBytes, In),
421
+ zopen(In, Zin, []),
422
+ read_string(Zin, _, Bytes)).
423
+
424
+ %! log_completed(+Code, +Status, +Bytes, +Id, +CPU, +Stream) is det.
425
+ %
426
+ % Write log message to Stream from a call_cleanup/3 call.
427
+ %
428
+ % @param Status 2nd argument of call_cleanup/3
429
+ % @param Id Term identifying the completed request
430
+ % @param CPU0 CPU time at time of entrance
431
+ % @param Stream Stream to write to (normally from http_log_stream/1).
432
+
433
+ log_completed(Code, Status, Bytes, Id, CPU, Stream) :-
434
+ is_stream(Stream),
435
+ log_check_deleted(Stream),
436
+ !,
437
+ log(Code, Status, Bytes, Id, CPU, Stream).
438
+ log_completed(Code, Status, Bytes, Id, CPU0, _) :-
439
+ http_log_stream(Stream), % Logfile has changed!
440
+ !,
441
+ log_completed(Code, Status, Bytes, Id, CPU0, Stream).
442
+ log_completed(_,_,_,_,_,_).
443
+
444
+
445
+ log(Code, ok, Bytes, Id, CPU, Stream) :-
446
+ !,
447
+ format(Stream, 'completed(~q, ~q, ~q, ~q, ok).~n',
448
+ [ Id, CPU, Bytes, Code ]).
449
+ log(Code, Status, Bytes, Id, CPU, Stream) :-
450
+ ( map_exception(Status, Term)
451
+ -> true
452
+ ; message_to_string(Status, String),
453
+ Term = error(String)
454
+ ),
455
+ format(Stream, 'completed(~q, ~q, ~q, ~q, ~W).~n',
456
+ [ Id, CPU, Bytes, Code,
457
+ Term, [ quoted(true),
458
+ ignore_ops(true),
459
+ blobs(portray),
460
+ portray_goal(write_blob)
461
+ ]
462
+ ]).
463
+
464
+ :- public write_blob/2.
465
+ write_blob(Blob, _Options) :-
466
+ format(string(S), '~q', [Blob]),
467
+ writeq(blob(S)).
468
+
469
+ map_exception(http_reply(bytes(ContentType,Bytes),_), bytes(ContentType,L)) :-
470
+ string_length(Bytes, L). % also does lists
471
+ map_exception(http_reply(Reply), Reply).
472
+ map_exception(http_reply(Reply, _), Reply).
473
+ map_exception(error(existence_error(http_location, Location), _Stack),
474
+ error(404, Location)).
475
+
476
+
477
+ /*******************************
478
+ * LOGROTATE SUPPORT *
479
+ *******************************/
480
+
481
+ %! log_check_deleted(+Stream) is semidet.
482
+ %
483
+ % If the link-count of the stream has dropped to zero, the file
484
+ % has been deleted/moved. In this case the log file is closed and
485
+ % log_check_deleted/6 will open a new one. This provides some
486
+ % support for cleaning up the logfile without shutting down the
487
+ % server.
488
+ %
489
+ % @see logrotate(1) to manage logfiles on Unix systems.
490
+
491
+ log_check_deleted(Stream) :-
492
+ stream_property(Stream, nlink(Links)),
493
+ Links == 0,
494
+ !,
495
+ http_log_close(log_file_deleted),
496
+ fail.
497
+ log_check_deleted(_).
498
+
499
+ %! http_logrotate(+Options) is det.
500
+ %
501
+ % Rotate the available log files. Note that there are two ways to
502
+ % deal with the rotation of log files:
503
+ %
504
+ % 1. Use the OS log rotation facility. In that case the OS must
505
+ % (1) move the logfile and (2) have something calling
506
+ % http_log_close/1 to close the (moved) file and make this
507
+ % server create a new one on the next log message. If
508
+ % library(http/http_unix_daemon) is used, closing is
509
+ % achieved by sending SIGHUP or SIGUSR1 to the process.
510
+ %
511
+ % 2. Call this predicate at scheduled intervals. This can
512
+ % be achieved by calling http_schedule_logrotate/2 in the
513
+ % context of library(http/http_unix_daemon) which schedules
514
+ % the maintenance actions.
515
+ %
516
+ % Options:
517
+ %
518
+ % - min_size(+Bytes)
519
+ % Do not rotate if the log file is smaller than Bytes.
520
+ % The default is 1Mbytes.
521
+ % - keep_logs(+Count)
522
+ % Number of rotated log files to keep (default 10)
523
+ % - compress_logs(+Format)
524
+ % Compress the log files to the given format.
525
+ % - background(+Boolean)
526
+ % If `true`, rotate the log files in the background.
527
+
528
+ http_logrotate(Options) :-
529
+ select_option(background(true), Options, Options1),
530
+ !,
531
+ thread_create(http_logrotate(Options1), _,
532
+ [ alias('__logrotate'),
533
+ detached(true)
534
+ ]).
535
+ http_logrotate(Options) :-
536
+ option(keep_logs(Keep), Options, 10),
537
+ option(compress_logs(Format), Options, gzip),
538
+ compress_extension(Format, ZExt),
539
+ log_file_and_ext(Base, Ext),
540
+ ( log_too_small(Base, Ext, Options)
541
+ -> true
542
+ ; rotate_logs(Base, Ext, ZExt, Keep)
543
+ ).
544
+
545
+ rotate_logs(Base, Ext, ZExt, N1) :-
546
+ N1 > 0,
547
+ !,
548
+ N0 is N1 - 1,
549
+ old_log_file(Base, Ext, N0, ZO, Old),
550
+ ( exists_file(Old)
551
+ -> new_log_file(Base, Ext, N1, ZO, ZExt, ZN, New),
552
+ rename_log_file(ZO, Old, ZN, New)
553
+ ; true
554
+ ),
555
+ rotate_logs(Base, Ext, ZExt, N0).
556
+ rotate_logs(_, _, _, _).
557
+
558
+ rename_log_file(ZExt, Old, ZExt, New) :-
559
+ !,
560
+ debug(logrotate, 'Rename ~p --> ~p', [Old, New]),
561
+ rename_file(Old, New).
562
+ rename_log_file('', Old, ZExt, New) :-
563
+ file_name_extension(NoExt, ZExt, New),
564
+ debug(logrotate, 'Rename ~p --> ~p', [Old, NoExt]),
565
+ rename_file(Old, NoExt),
566
+ debug(logrotate, 'Closing log file', []),
567
+ http_log_close(logrotate),
568
+ compress_extension(Format, ZExt),
569
+ debug(logrotate, 'Compressing (~w) ~p', [Format, NoExt]),
570
+ compress_file(NoExt, Format).
571
+
572
+ old_log_file(Base, Ext, N, ZExt, File) :-
573
+ log_file(Base, Ext, N, File0),
574
+ ( compress_extension(_, ZExt),
575
+ file_name_extension(File0, ZExt, File1),
576
+ exists_file(File1)
577
+ -> File = File1
578
+ ; ZExt = '',
579
+ File = File0
580
+ ).
581
+
582
+ new_log_file(Base, Ext, N, '', '', '', File) :-
583
+ !,
584
+ log_file(Base, Ext, N, File).
585
+ new_log_file(Base, Ext, N, '', ZExt, ZExt, File) :-
586
+ !,
587
+ log_file(Base, Ext, N, File0),
588
+ file_name_extension(File0, ZExt, File).
589
+ new_log_file(Base, Ext, N, ZExt, _, ZExt, File) :-
590
+ log_file(Base, Ext, N, File0),
591
+ file_name_extension(File0, ZExt, File).
592
+
593
+ log_file(Base, Ext, 0, File) :-
594
+ !,
595
+ file_name_extension(Base, Ext, File).
596
+ log_file(Base, Ext, N, File) :-
597
+ atomic_list_concat([Base, -, N], Base1),
598
+ file_name_extension(Base1, Ext, File).
599
+
600
+ log_file_and_ext(Base, Ext) :-
601
+ setting(http:logfile, Term),
602
+ catch(absolute_file_name(Term, File,
603
+ [ access(exist)
604
+ ]), _, fail),
605
+ file_name_extension(Base, Ext, File).
606
+
607
+ log_too_small(Base, Ext, Options) :-
608
+ DefMin is 1024*1024,
609
+ option(min_size(MinBytes), Options, DefMin),
610
+ file_name_extension(Base, Ext, File),
611
+ ( exists_file(File)
612
+ -> size_file(File, Bytes),
613
+ Bytes < MinBytes,
614
+ debug(logrotate, '~w has ~D bytes; not rotating', [File, Bytes])
615
+ ; debug(logrotate, '~w does not exist; not rotating', [File])
616
+ ).
617
+
618
+ %! compress_file(+File, +Format)
619
+ %
620
+ % Compress a file according to Format. Currently only supports
621
+ % gzip.
622
+
623
+ compress_file(File, Format) :-
624
+ ( compress_extension(Format, Ext)
625
+ -> true
626
+ ; domain_error(compress_format, Format)
627
+ ),
628
+ file_name_extension(File, Ext, ZFile),
629
+ catch(setup_call_cleanup(
630
+ gzopen(ZFile, write, Out, [type(binary)]),
631
+ setup_call_cleanup(
632
+ open(File, read, In, [type(binary)]),
633
+ copy_stream_data(In, Out),
634
+ close(In)),
635
+ close(Out)),
636
+ Error,
637
+ ( print_message(error, Error),
638
+ catch(delete_file(Out), _, true),
639
+ throw(Error)
640
+ )),
641
+ delete_file(File).
642
+
643
+ compress_extension(gzip, gz).
644
+
645
+ :- dynamic
646
+ scheduled_logrotate/2. % Schedule, Options
647
+
648
+ %! http_schedule_logrotate(When, Options)
649
+ %
650
+ % Schedule log rotation based on maintenance broadcasts. When
651
+ % is one of:
652
+ %
653
+ % - daily(Hour:Min)
654
+ % Run each day at Hour:Min. Min is rounded to a multitude
655
+ % of 5.
656
+ % - weekly(Day, Hour:Min)
657
+ % Run at the given Day and Time each week. Day is either a
658
+ % number 1..7 (1 is Monday) or a weekday name or abbreviation.
659
+ % - monthly(DayOfTheMonth, Hour:Min)
660
+ % Run each month at the given Day (1..31). Note that not all
661
+ % months have all days.
662
+ %
663
+ % This must be used with a timer that broadcasts a
664
+ % maintenance(_,_) message (see broadcast/1). Such a timer is part
665
+ % of library(http/http_unix_daemon).
666
+
667
+ http_schedule_logrotate(When, Options) :-
668
+ listen(maintenance(_,_), http_consider_logrotate),
669
+ compile_schedule(When, Schedule),
670
+ retractall(scheduled_logrotate(_,_)),
671
+ asserta(scheduled_logrotate(Schedule, Options)).
672
+
673
+ compile_schedule(Var, _) :-
674
+ var(Var),
675
+ !,
676
+ instantiation_error(Var).
677
+ compile_schedule(daily(Time0), daily(Time)) :-
678
+ compile_time(Time0, Time).
679
+ compile_schedule(weekly(Day0, Time0), weekly(Day, Time)) :-
680
+ compile_weekday(Day0, Day),
681
+ compile_time(Time0, Time).
682
+ compile_schedule(monthly(Day, Time0), monthly(Day, Time)) :-
683
+ must_be(between(0, 31), Day),
684
+ compile_time(Time0, Time).
685
+
686
+ compile_time(HH:MM0, HH:MM) :-
687
+ must_be(between(0, 23), HH),
688
+ must_be(between(0, 59), MM0),
689
+ MM is ((MM0+4)//5)*5.
690
+
691
+ compile_weekday(N, _) :-
692
+ var(N),
693
+ !,
694
+ instantiation_error(N).
695
+ compile_weekday(N, N) :-
696
+ integer(N),
697
+ !,
698
+ must_be(between(1,7), N).
699
+ compile_weekday(Day, N) :-
700
+ downcase_atom(Day, Lwr),
701
+ ( sub_atom(Lwr, 0, 3, _, Abbr),
702
+ day(N, Abbr)
703
+ -> !
704
+ ; domain_error(day, Day)
705
+ ).
706
+
707
+ %! http_consider_logrotate
708
+ %
709
+ % Perform a log rotation if the schedule is met
710
+
711
+ http_consider_logrotate :-
712
+ scheduled_logrotate(Schedule, Options),
713
+ get_time(NowF),
714
+ Now is round(NowF/60.0)*60,
715
+ scheduled(Schedule, Now),
716
+ !,
717
+ http_logrotate([background(true)|Options]).
718
+
719
+ scheduled(daily(HH:MM), Now) :-
720
+ stamp_date_time(Now, DateTime, local),
721
+ date_time_value(time, DateTime, time(HH,MM,_)).
722
+ scheduled(weekly(Day, Time), Now) :-
723
+ stamp_date_time(Now, DateTime, local),
724
+ date_time_value(date, DateTime, Date),
725
+ day_of_the_week(Date, Day),
726
+ scheduled(daily(Time), Now).
727
+ scheduled(monthly(Day, Time), Now) :-
728
+ stamp_date_time(Now, DateTime, local),
729
+ date_time_value(day, DateTime, Day),
730
+ scheduled(daily(Time), Now).
731
+
732
+ day(1, mon).
733
+ day(2, tue).
734
+ day(3, wed).
735
+ day(4, thu).
736
+ day(5, fri).
737
+ day(6, sat).
738
+ day(7, sun).