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,989 @@
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) 2013-2023, 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_unix_daemon,
39
+ [ http_daemon/0,
40
+ http_daemon/1, % +Options
41
+ http_opt_type/3, % ?Flag, ?Option, ?Type
42
+ http_opt_help/2, % ?Option, ?Help
43
+ http_opt_meta/2 % ?Option, ?Meta
44
+ ]).
45
+ :- use_module(library(error)).
46
+ :- use_module(library(apply)).
47
+ :- use_module(library(lists)).
48
+ :- use_module(library(debug)).
49
+ :- use_module(library(broadcast)).
50
+ :- use_module(library(socket)).
51
+ :- use_module(library(option)).
52
+ :- use_module(library(uid)).
53
+ :- use_module(library(unix)).
54
+ :- use_module(library(syslog)).
55
+ :- use_module(library(http/thread_httpd)).
56
+ :- use_module(library(http/http_dispatch)).
57
+ :- use_module(library(http/http_host)).
58
+ :- use_module(library(main)).
59
+ :- use_module(library(readutil)).
60
+
61
+ :- if(( exists_source(library(http/http_ssl_plugin)),
62
+ \+ current_prolog_flag(pldoc_to_tex,true))).
63
+ :- use_module(library(ssl)).
64
+ :- use_module(library(http/http_ssl_plugin)).
65
+ :- endif.
66
+
67
+ :- multifile
68
+ http_server_hook/1, % +Options
69
+ http_certificate_hook/3, % +CertFile, +KeyFile, -Password
70
+ http:sni_options/2. % +HostName, +SSLOptions
71
+
72
+ :- initialization(http_daemon, main).
73
+
74
+ /** <module> Run SWI-Prolog HTTP server as a Unix system daemon
75
+
76
+ This module provides the logic that is needed to integrate a process
77
+ into the Unix service (daemon) architecture. It deals with the following
78
+ aspects, all of which may be used/ignored and configured using
79
+ commandline options:
80
+
81
+ - Select the port(s) to be used by the server
82
+ - Run the startup of the process as root to perform privileged
83
+ tasks and the server itself as unprivileged user, for example
84
+ to open ports below 1000.
85
+ - Fork and detach from the controlling terminal
86
+ - Handle console and debug output using a file and/or the syslog
87
+ daemon.
88
+ - Manage a _|pid file|_
89
+
90
+ The typical use scenario is to write a file that loads the following
91
+ components:
92
+
93
+ 1. The application code, including http handlers (see http_handler/3).
94
+ 2. This library
95
+
96
+ In the code below, =|?- [load].|= loads the remainder of the webserver
97
+ code. This is often a sequence of use_module/1 directives.
98
+
99
+ ==
100
+ :- use_module(library(http/http_unix_daemon)).
101
+
102
+ :- [load].
103
+ ==
104
+
105
+ The program entry point is http_daemon/0, declared using
106
+ initialization/2. This may be overruled using a new declaration after
107
+ loading this library. The new entry point will typically call
108
+ http_daemon/1 to start the server in a preconfigured way.
109
+
110
+ ==
111
+ :- use_module(library(http/http_unix_daemon)).
112
+ :- initialization(run, main).
113
+
114
+ run :-
115
+ ...
116
+ http_daemon(Options).
117
+ ==
118
+
119
+ Now, the server may be started using the command below. See
120
+ http_daemon/0 for supported options.
121
+
122
+ ==
123
+ % [sudo] swipl mainfile.pl [option ...]
124
+ ==
125
+
126
+ Below are some examples. Our first example is completely silent, running
127
+ on port 80 as user =www=.
128
+
129
+ ==
130
+ % swipl mainfile.pl --user=www --pidfile=/var/run/http.pid
131
+ ==
132
+
133
+ Our second example logs HTTP interaction with the syslog daemon for
134
+ debugging purposes. Note that the argument to =|--debug|== is a Prolog
135
+ term and must often be escaped to avoid misinterpretation by the Unix
136
+ shell. The debug option can be repeated to log multiple debug topics.
137
+
138
+ ==
139
+ % swipl mainfile.pl --user=www --pidfile=/var/run/http.pid \
140
+ --debug='http(request)' --syslog=http
141
+ ==
142
+
143
+ *Broadcasting* The library uses broadcast/1 to allow hooking certain
144
+ events:
145
+
146
+ - http(pre_server_start)
147
+ Run _after_ _fork_, just before starting the HTTP server. Can be used
148
+ to load additional files or perform additional initialisation, such as
149
+ starting additional threads. Recall that it is not possible to start
150
+ threads _before_ forking.
151
+
152
+ - http(post_server_start)
153
+ Run _after_ starting the HTTP server.
154
+
155
+ @tbd Cleanup issues wrt. loading and initialization of xpce.
156
+ @see The file <swi-home>/doc/packages/examples/http/linux-init-script
157
+ provides a /etc/init.d script for controlling a server as a normal
158
+ Unix service.
159
+ */
160
+
161
+ :- debug(daemon).
162
+
163
+ % Do not run xpce in a thread. This disables forking. The problem here
164
+ % is that loading library(pce) starts the event dispatching thread. This
165
+ % should be handled lazily.
166
+
167
+ :- set_prolog_flag(xpce_threaded, false).
168
+ :- set_prolog_flag(message_ide, false). % cause xpce to trap messages
169
+ :- set_prolog_flag(message_context, [thread,time('%F %T.%3f')]).
170
+ :- dynamic interactive/0.
171
+
172
+ %! http_daemon
173
+ %
174
+ % Start the HTTP server as a daemon process. This predicate
175
+ % processes the commandline arguments below. Commandline arguments
176
+ % that specify servers are processed in the order they appear
177
+ % using the following schema:
178
+ %
179
+ % 1. Arguments that act as default for all servers.
180
+ % 2. =|--http=Spec|= or =|--https=Spec|= is followed by
181
+ % arguments for that server until the next =|--http=Spec|=
182
+ % or =|--https=Spec|= or the end of the options.
183
+ % 3. If no =|--http=Spec|= or =|--https=Spec|= appears, one
184
+ % HTTP server is created from the specified parameters.
185
+ %
186
+ % Examples:
187
+ %
188
+ % ==
189
+ % --workers=10 --http --https
190
+ % --http=8080 --https=8443
191
+ % --http=localhost:8080 --workers=1 --https=8443 --workers=25
192
+ % ==
193
+ %
194
+ % $ --port=Port :
195
+ % Start HTTP server at Port. It requires root permission and the
196
+ % option =|--user=User|= to open ports below 1000. The default
197
+ % port is 80. If =|--https|= is used, the default port is 443.
198
+ %
199
+ % $ --ip=IP :
200
+ % Only listen to the given IP address. Typically used as
201
+ % =|--ip=localhost|= to restrict access to connections from
202
+ % _localhost_ if the server itself is behind an (Apache)
203
+ % proxy server running on the same host.
204
+ %
205
+ % $ --debug=Topic :
206
+ % Enable debugging Topic. See debug/3.
207
+ %
208
+ % $ --syslog=Ident :
209
+ % Write debug messages to the syslog daemon using Ident
210
+ %
211
+ % $ --user=User :
212
+ % When started as root to open a port below 1000, this option
213
+ % must be provided to switch to the target user for operating
214
+ % the server. The following actions are performed as root, i.e.,
215
+ % _before_ switching to User:
216
+ %
217
+ % - open the socket(s)
218
+ % - write the pidfile
219
+ % - setup syslog interaction
220
+ % - Read the certificate, key and password file (=|--pwfile=File|=)
221
+ %
222
+ % $ --group=Group :
223
+ % May be used in addition to =|--user|=. If omitted, the login
224
+ % group of the target user is used.
225
+ %
226
+ % $ --pidfile=File :
227
+ % Write the PID of the daemon process to File.
228
+ %
229
+ % $ --output=File :
230
+ % Send output of the process to File. By default, all
231
+ % Prolog console output is discarded.
232
+ %
233
+ % $ --fork[=Bool] :
234
+ % If given as =|--no-fork|= or =|--fork=false|=, the process
235
+ % runs in the foreground.
236
+ %
237
+ % $ --http[=(Bool|Port|BindTo:Port)] :
238
+ % Create a plain HTTP server. If the argument is missing or
239
+ % =true=, create at the specified or default address. Else
240
+ % use the given port and interface. Thus, =|--http|= creates
241
+ % a server at port 80, =|--http=8080|= creates one at port
242
+ % 8080 and =|--http=localhost:8080|= creates one at port
243
+ % 8080 that is only accessible from `localhost`.
244
+ %
245
+ % $ --https[=(Bool|Port|BindTo:Port)] :
246
+ % As =|--http|=, but creates an HTTPS server.
247
+ % Use =|--certfile|=, =|--keyfile|=, =|-pwfile|=,
248
+ % =|--password|= and =|--cipherlist|= to configure SSL for
249
+ % this server.
250
+ %
251
+ % $ --certfile=File :
252
+ % The server certificate for HTTPS.
253
+ %
254
+ % $ --keyfile=File :
255
+ % The server private key for HTTPS.
256
+ %
257
+ % $ --pwfile=File :
258
+ % File holding the password for accessing the private key. This
259
+ % is preferred over using =|--password=PW|= as it allows using
260
+ % file protection to avoid leaking the password. The file is
261
+ % read _before_ the server drops privileges when started with
262
+ % the =|--user|= option.
263
+ %
264
+ % $ --password=PW :
265
+ % The password for accessing the private key. See also `--pwfile`.
266
+ %
267
+ % $ --cipherlist=Ciphers :
268
+ % One or more cipher strings separated by colons. See the OpenSSL
269
+ % documentation for more information. Starting with SWI-Prolog
270
+ % 7.5.11, the default value is always a set of ciphers that was
271
+ % considered secure enough to prevent all critical attacks at the
272
+ % time of the SWI-Prolog release.
273
+ %
274
+ % $ --interactive[=Bool] :
275
+ % If =true= (default =false=) implies =|--no-fork|= and presents
276
+ % the Prolog toplevel after starting the server.
277
+ %
278
+ % $ --gtrace=[Bool] :
279
+ % Use the debugger to trace http_daemon/1.
280
+ %
281
+ % $ --sighup=Action :
282
+ % Action to perform on =|kill -HUP <pid>|=. Default is `reload`
283
+ % (running make/0). Alternative is `quit`, stopping the server.
284
+ %
285
+ % Other options are converted by argv_options/3 and passed to
286
+ % http_server/1. For example, this allows for:
287
+ %
288
+ % $ --workers=Count :
289
+ % Set the number of workers for the multi-threaded server.
290
+ %
291
+ % http_daemon/0 is defined as below. The start code for a specific
292
+ % server can use this as a starting point, for example for specifying
293
+ % defaults or additional options. This uses _guided_ options
294
+ % processing from argv_options/3 from library(main). The option
295
+ % definitions are available as http_opt_type/3, http_opt_help/2 and
296
+ % http_opt_meta/2
297
+ %
298
+ % ```
299
+ % http_daemon :-
300
+ % current_prolog_flag(argv, Argv),
301
+ % argv_options(Argv, _RestArgv, Options),
302
+ % http_daemon(Options).
303
+ % ```
304
+ %
305
+ % @see http_daemon/1
306
+
307
+ http_daemon :-
308
+ current_prolog_flag(argv, Argv),
309
+ argv_options(Argv, _RestArgv, Options),
310
+ http_daemon(Options).
311
+
312
+ % Option declarations for argv_options/3 from library(main).
313
+
314
+ opt_type(port, port, nonneg).
315
+ opt_type(p, port, nonneg).
316
+ opt_type(ip, ip, atom).
317
+ opt_type(debug, debug, term).
318
+ opt_type(syslog, syslog, atom).
319
+ opt_type(user, user, atom).
320
+ opt_type(group, group, atom).
321
+ opt_type(pidfile, pidfile, file(write)).
322
+ opt_type(output, output, file(write)).
323
+ opt_type(fork, fork, boolean).
324
+ opt_type(http, http, nonneg|boolean).
325
+ opt_type(https, https, nonneg|boolean).
326
+ opt_type(certfile, certfile, file(read)).
327
+ opt_type(keyfile, keyfile, file(read)).
328
+ opt_type(pwfile, pwfile, file(read)).
329
+ opt_type(password, password, string).
330
+ opt_type(cipherlist, cipherlist, string).
331
+ opt_type(redirect, redirect, string).
332
+ opt_type(interactive, interactive, boolean).
333
+ opt_type(i, interactive, boolean).
334
+ opt_type(gtrace, gtrace, boolean).
335
+ opt_type(sighup, sighup, oneof([reload,quit])).
336
+ opt_type(workers, workers, natural).
337
+ opt_type(timeout, timeout, number).
338
+ opt_type(keep_alive_timeout, keep_alive_timeout, number).
339
+
340
+ opt_help(port, "HTTP port to listen to").
341
+ opt_help(ip, "Only listen to this ip (--ip=localhost)").
342
+ opt_help(debug, "Print debug message for topic").
343
+ opt_help(syslog, "Send output to syslog daemon as ident").
344
+ opt_help(user, "Run server under this user").
345
+ opt_help(group, "Run server under this group").
346
+ opt_help(pidfile, "Write PID to path").
347
+ opt_help(output, "Send output to file (instead of syslog)").
348
+ opt_help(fork, "Do (default) or do not fork").
349
+ opt_help(http, "Create HTTP server").
350
+ opt_help(https, "Create HTTPS server").
351
+ opt_help(certfile, "The server certificate").
352
+ opt_help(keyfile, "The server private key").
353
+ opt_help(pwfile, "File holding password for the private key").
354
+ opt_help(password, "Password for the private key").
355
+ opt_help(cipherlist, "Cipher strings separated by colons").
356
+ opt_help(redirect, "Redirect all requests to a URL or port").
357
+ opt_help(interactive, "Enter Prolog toplevel after starting server").
358
+ opt_help(gtrace, "Start (graphical) debugger").
359
+ opt_help(sighup, "Action on SIGHUP: reload (default) or quit").
360
+ opt_help(workers, "Number of HTTP worker threads").
361
+ opt_help(timeout, "Time to wait for client to complete request").
362
+ opt_help(keep_alive_timeout, "Time to wait for a new request").
363
+
364
+ opt_meta(port, 'PORT').
365
+ opt_meta(ip, 'IP').
366
+ opt_meta(debug, 'TERM').
367
+ opt_meta(http, 'PORT').
368
+ opt_meta(https, 'PORT').
369
+ opt_meta(syslog, 'IDENT').
370
+ opt_meta(user, 'NAME').
371
+ opt_meta(group, 'NAME').
372
+ opt_meta(redirect, 'URL').
373
+ opt_meta(sighup, 'ACTION').
374
+ opt_meta(workers, 'COUNT').
375
+ opt_meta(timeout, 'SECONDS').
376
+ opt_meta(keep_alive_timeout, 'SECONDS').
377
+
378
+ %! http_opt_type(?Flag, ?Option, ?Type).
379
+ %! http_opt_help(?Option, ?Help).
380
+ %! http_opt_meta(?Option, ?Meta).
381
+ %
382
+ % Allow reusing http option processing
383
+
384
+ http_opt_type(Flag, Option, Type) :-
385
+ opt_type(Flag, Option, Type).
386
+
387
+ http_opt_help(Option, Help) :-
388
+ opt_help(Option, Help),
389
+ Option \= help(_).
390
+
391
+ http_opt_meta(Option, Meta) :-
392
+ opt_meta(Option, Meta).
393
+
394
+
395
+ %! http_daemon(+Options)
396
+ %
397
+ % Start the HTTP server as a daemon process. This predicate processes
398
+ % a Prolog option list. It is normally called from http_daemon/0,
399
+ % which derives the option list from the command line arguments.
400
+ %
401
+ % Error handling depends on whether or not interactive(true) is in
402
+ % effect. If so, the error is printed before entering the toplevel. In
403
+ % non-interactive mode this predicate calls halt(1).
404
+
405
+ http_daemon(Options) :-
406
+ Error = error(_,_),
407
+ catch(http_daemon_guarded(Options), Error, start_failed(Error)).
408
+
409
+ start_failed(Error) :-
410
+ interactive,
411
+ !,
412
+ print_message(warning, Error).
413
+ start_failed(Error) :-
414
+ print_message(error, Error),
415
+ halt(1).
416
+
417
+ %! http_daemon_guarded(+Options)
418
+ %
419
+ % Helper that is started from http_daemon/1. See http_daemon/1 for
420
+ % options that are processed.
421
+
422
+ http_daemon_guarded(Options) :-
423
+ setup_debug(Options),
424
+ kill_x11(Options),
425
+ option_servers(Options, Servers0),
426
+ maplist(make_socket, Servers0, Servers),
427
+ ( option(fork(true), Options, true),
428
+ option(interactive(false), Options, false),
429
+ can_switch_user(Options)
430
+ -> fork(Who),
431
+ ( Who \== child
432
+ -> halt
433
+ ; disable_development_system,
434
+ setup_syslog(Options),
435
+ write_pid(Options),
436
+ setup_output(Options),
437
+ switch_user(Options),
438
+ setup_signals(Options),
439
+ start_servers(Servers),
440
+ wait(Options)
441
+ )
442
+ ; write_pid(Options),
443
+ switch_user(Options),
444
+ setup_signals(Options),
445
+ start_servers(Servers),
446
+ wait(Options)
447
+ ).
448
+
449
+ %! option_servers(+Options, -Sockets:list)
450
+ %
451
+ % Find all sockets that must be created according to Options. Each
452
+ % socket is a term server(Scheme, Address, Opts), where Address is
453
+ % either a plain port (integer) or Host:Port. The latter binds the
454
+ % port to the interface belonging to Host. For example:
455
+ % socket(http, localhost:8080, Opts) creates an HTTP socket that
456
+ % binds to the localhost interface on port 80. Opts are the
457
+ % options specific for the given server.
458
+
459
+ option_servers(Options, Sockets) :-
460
+ opt_sockets(Options, [], [], Sockets).
461
+
462
+ opt_sockets([], Options, [], [Socket]) :-
463
+ !,
464
+ make_server(http(true), Options, Socket).
465
+ opt_sockets([], _, Sockets, Sockets).
466
+ opt_sockets([H|T], OptsH, Sockets0, Sockets) :-
467
+ server_option(H),
468
+ !,
469
+ append(OptsH, [H], OptsH1),
470
+ opt_sockets(T, OptsH1, Sockets0, Sockets).
471
+ opt_sockets([H|T0], Opts, Sockets0, Sockets) :-
472
+ server_start_option(H),
473
+ !,
474
+ server_options(T0, T, Opts, SOpts),
475
+ make_server(H, SOpts, Socket),
476
+ append(Sockets0, [Socket], Sockets1),
477
+ opt_sockets(T, Opts, Sockets1, Sockets).
478
+ opt_sockets([_|T], Opts, Sockets0, Sockets) :-
479
+ opt_sockets(T, Opts, Sockets0, Sockets).
480
+
481
+ server_options([], [], Options, Options).
482
+ server_options([H|T], Rest, Options0, Options) :-
483
+ server_option(H),
484
+ !,
485
+ generalise_option(H, G),
486
+ delete(Options0, G, Options1),
487
+ append(Options1, [H], Options2),
488
+ server_options(T, Rest, Options2, Options).
489
+ server_options([H|T], [H|T], Options, Options) :-
490
+ server_start_option(H),
491
+ !.
492
+ server_options([_|T0], Rest, Options0, Options) :-
493
+ server_options(T0, Rest, Options0, Options).
494
+
495
+ generalise_option(H, G) :-
496
+ H =.. [Name,_],
497
+ G =.. [Name,_].
498
+
499
+ server_start_option(http(_)).
500
+ server_start_option(https(_)).
501
+
502
+ server_option(port(_)).
503
+ server_option(ip(_)).
504
+ server_option(certfile(_)).
505
+ server_option(keyfile(_)).
506
+ server_option(pwfile(_)).
507
+ server_option(password(_)).
508
+ server_option(cipherlist(_)).
509
+ server_option(workers(_)).
510
+ server_option(redirect(_)).
511
+ server_option(timeout(_)).
512
+ server_option(keep_alive_timeout(_)).
513
+
514
+ make_server(http(Address0), Options0, server(http, Address, Options)) :-
515
+ make_address(Address0, 80, Address, Options0, Options).
516
+ make_server(https(Address0), Options0, server(https, Address, SSLOptions)) :-
517
+ make_address(Address0, 443, Address, Options0, Options),
518
+ merge_https_options(Options, SSLOptions).
519
+
520
+ make_address(true, DefPort, Address, Options0, Options) :-
521
+ !,
522
+ option(port(Port), Options0, DefPort),
523
+ ( option(ip(Bind), Options0)
524
+ -> Address = (Bind:Port)
525
+ ; Address = Port
526
+ ),
527
+ merge_options([port(Port)], Options0, Options).
528
+ make_address(Bind:Port, _, Bind:Port, Options0, Options) :-
529
+ !,
530
+ must_be(atom, Bind),
531
+ must_be(integer, Port),
532
+ merge_options([port(Port), ip(Bind)], Options0, Options).
533
+ make_address(Port, _, Address, Options0, Options) :-
534
+ integer(Port),
535
+ !,
536
+ ( option(ip(Bind), Options0)
537
+ -> Address = (Bind:Port)
538
+ ; Address = Port,
539
+ merge_options([port(Port)], Options0, Options)
540
+ ).
541
+ make_address(Spec, _, Address, Options0, Options) :-
542
+ atomic(Spec),
543
+ split_string(Spec, ":", "", [BindString, PortString]),
544
+ number_string(Port, PortString),
545
+ !,
546
+ atom_string(Bind, BindString),
547
+ Address = (Bind:Port),
548
+ merge_options([port(Port), ip(Bind)], Options0, Options).
549
+ make_address(Spec, _, _, _, _) :-
550
+ domain_error(address, Spec).
551
+
552
+ :- dynamic sni/3.
553
+
554
+ merge_https_options(Options, [SSL|Options]) :-
555
+ ( option(certfile(CertFile), Options),
556
+ option(keyfile(KeyFile), Options)
557
+ -> prepare_https_certificate(CertFile, KeyFile, Passwd0),
558
+ read_file_to_string(CertFile, Certificate, []),
559
+ read_file_to_string(KeyFile, Key, []),
560
+ Pairs = [Certificate-Key]
561
+ ; Pairs = []
562
+ ),
563
+ ssl_secure_ciphers(SecureCiphers),
564
+ option(cipherlist(CipherList), Options, SecureCiphers),
565
+ ( string(Passwd0)
566
+ -> Passwd = Passwd0
567
+ ; options_password(Options, Passwd)
568
+ ),
569
+ findall(HostName-HostOptions, http:sni_options(HostName, HostOptions), SNIs),
570
+ maplist(sni_contexts, SNIs),
571
+ SSL = ssl([ certificate_key_pairs(Pairs),
572
+ cipher_list(CipherList),
573
+ password(Passwd),
574
+ sni_hook(http_unix_daemon:sni)
575
+ ]).
576
+
577
+ sni_contexts(Host-Options) :-
578
+ ssl_context(server, SSL, Options),
579
+ assertz(sni(_, Host, SSL)).
580
+
581
+ %! http_certificate_hook(+CertFile, +KeyFile, -Password) is semidet.
582
+ %
583
+ % Hook called before starting the server if the --https option is
584
+ % used. This hook may be used to create or refresh the
585
+ % certificate. If the hook binds Password to a string, this string
586
+ % will be used to decrypt the server private key as if the
587
+ % --password=Password option was given.
588
+
589
+ prepare_https_certificate(CertFile, KeyFile, Password) :-
590
+ http_certificate_hook(CertFile, KeyFile, Password),
591
+ !.
592
+ prepare_https_certificate(_, _, _).
593
+
594
+
595
+ options_password(Options, Passwd) :-
596
+ option(password(Passwd), Options),
597
+ !.
598
+ options_password(Options, Passwd) :-
599
+ option(pwfile(File), Options),
600
+ !,
601
+ read_file_to_string(File, String, []),
602
+ split_string(String, "", "\r\n\t ", [Passwd]).
603
+ options_password(_, '').
604
+
605
+ %! start_servers(+Servers) is det.
606
+ %
607
+ % Start the HTTP server. It performs the following steps:
608
+ %
609
+ % 1. Call broadcast(http(pre_server_start))
610
+ % 2. For each server
611
+ % a. Call broadcast(http(pre_server_start(Port)))
612
+ % b. Call http_server(http_dispatch, Options)
613
+ % c. Call broadcast(http(post_server_start(Port)))
614
+ % 3. Call broadcast(http(post_server_start))
615
+ %
616
+ % This predicate can be hooked using http_server_hook/1. This
617
+ % predicate is executed after
618
+ %
619
+ % - Forking
620
+ % - Setting I/O (e.g., to talk to the syslog daemon)
621
+ % - Dropping root privileges (--user)
622
+ % - Setting up signal handling
623
+
624
+ start_servers(Servers) :-
625
+ broadcast(http(pre_server_start)),
626
+ maplist(start_server, Servers),
627
+ broadcast(http(post_server_start)).
628
+
629
+ start_server(server(_Scheme, Socket, Options)) :-
630
+ option(redirect(To), Options),
631
+ !,
632
+ http_server(server_redirect(To), [tcp_socket(Socket)|Options]).
633
+ start_server(server(_Scheme, Socket, Options)) :-
634
+ http_server_hook([tcp_socket(Socket)|Options]),
635
+ !.
636
+ start_server(server(_Scheme, Socket, Options)) :-
637
+ option(port(Port), Options),
638
+ broadcast(http(pre_server_start(Port))),
639
+ http_server(http_dispatch, [tcp_socket(Socket)|Options]),
640
+ broadcast(http(post_server_start(Port))).
641
+
642
+ make_socket(server(Scheme, Address, Options),
643
+ server(Scheme, Socket, Options)) :-
644
+ tcp_socket(Socket),
645
+ catch(bind_socket(Socket, Address), Error,
646
+ make_socket_error(Error, Address)),
647
+ debug(daemon(socket),
648
+ 'Created socket ~p, listening on ~p', [Socket, Address]).
649
+
650
+ bind_socket(Socket, Address) :-
651
+ tcp_setopt(Socket, reuseaddr),
652
+ tcp_bind(Socket, Address),
653
+ tcp_listen(Socket, 5).
654
+
655
+ make_socket_error(error(socket_error(_,_), _), Address) :-
656
+ address_port(Address, Port),
657
+ integer(Port),
658
+ Port =< 1000,
659
+ !,
660
+ verify_root(open_port(Port)).
661
+ make_socket_error(Error, _) :-
662
+ throw(Error).
663
+
664
+ address_port(_:Port, Port) :- !.
665
+ address_port(Port, Port).
666
+
667
+ %! disable_development_system
668
+ %
669
+ % Disable some development stuff.
670
+
671
+ disable_development_system :-
672
+ set_prolog_flag(editor, '/bin/false').
673
+
674
+ %! enable_development_system
675
+ %
676
+ % Re-enable the development environment. Currently re-enables xpce if
677
+ % this was loaded, but not initialised and causes the interactive
678
+ % toplevel to be re-enabled.
679
+
680
+ enable_development_system :-
681
+ assertz(interactive),
682
+ set_prolog_flag(xpce_threaded, true),
683
+ set_prolog_flag(message_ide, true),
684
+ ( current_prolog_flag(xpce_version, _)
685
+ -> call(pce_dispatch([]))
686
+ ; true
687
+ ),
688
+ set_prolog_flag(toplevel_goal, prolog).
689
+
690
+ %! setup_syslog(+Options) is det.
691
+ %
692
+ % Setup syslog interaction.
693
+
694
+ setup_syslog(Options) :-
695
+ option(syslog(Ident), Options),
696
+ !,
697
+ openlog(Ident, [pid], user).
698
+ setup_syslog(_).
699
+
700
+
701
+ %! setup_output(+Options) is det.
702
+ %
703
+ % Setup output from the daemon process. The default is to send all
704
+ % output to a null-stream (see open_null_stream/1). With the
705
+ % option output(File), all output is written to File.
706
+
707
+ setup_output(Options) :-
708
+ option(output(File), Options),
709
+ !,
710
+ open(File, write, Out, [encoding(utf8)]),
711
+ set_stream(Out, buffer(line)),
712
+ detach_IO(Out).
713
+ setup_output(_) :-
714
+ open_null_stream(Out),
715
+ detach_IO(Out).
716
+
717
+
718
+ %! write_pid(+Options) is det.
719
+ %
720
+ % If the option pidfile(File) is present, write the PID of the
721
+ % daemon to this file.
722
+
723
+ write_pid(Options) :-
724
+ option(pidfile(File), Options),
725
+ current_prolog_flag(pid, PID),
726
+ !,
727
+ setup_call_cleanup(
728
+ open(File, write, Out),
729
+ format(Out, '~d~n', [PID]),
730
+ close(Out)),
731
+ at_halt(catch(delete_file(File), _, true)).
732
+ write_pid(_).
733
+
734
+
735
+ %! switch_user(+Options) is det.
736
+ %
737
+ % Switch to the target user and group. If the server is started as
738
+ % root, this option *must* be present.
739
+
740
+ switch_user(Options) :-
741
+ option(user(User), Options),
742
+ !,
743
+ verify_root(switch_user(User)),
744
+ ( option(group(Group), Options)
745
+ -> set_user_and_group(User, Group)
746
+ ; set_user_and_group(User)
747
+ ),
748
+ prctl(set_dumpable(true)). % re-enable core dumps on Linux
749
+ switch_user(_Options) :-
750
+ verify_no_root.
751
+
752
+ %! can_switch_user(Options) is det.
753
+ %
754
+ % Verify the user options before forking, so we can print the
755
+ % message in time.
756
+
757
+ can_switch_user(Options) :-
758
+ option(user(User), Options),
759
+ !,
760
+ verify_root(switch_user(User)).
761
+ can_switch_user(_Options) :-
762
+ verify_no_root.
763
+
764
+ verify_root(_Task) :-
765
+ geteuid(0),
766
+ !.
767
+ verify_root(Task) :-
768
+ print_message(error, http_daemon(no_root(Task))),
769
+ halt(1).
770
+
771
+ verify_no_root :-
772
+ geteuid(0),
773
+ !,
774
+ throw(error(permission_error(open, server, http),
775
+ context('Refusing to run HTTP server as root', _))).
776
+ verify_no_root.
777
+
778
+ :- if(\+current_predicate(prctl/1)).
779
+ prctl(_).
780
+ :- endif.
781
+
782
+ %! server_redirect(+To, +Request)
783
+ %
784
+ % Redirect all requests for this server to the specified server. To
785
+ % is one of:
786
+ %
787
+ % $ A port (integer) :
788
+ % Redirect to the server running on that port in the same
789
+ % Prolog process.
790
+ % $ =true= :
791
+ % Results from just passing =|--redirect|=. Redirects to
792
+ % an HTTPS server in the same Prolog process.
793
+ % $ A URL :
794
+ % Redirect to the the given URL + the request uri. This can
795
+ % be used if the server cannot find its public address. For
796
+ % example:
797
+ %
798
+ % ```
799
+ % --http --redirect=https://myhost.org --https
800
+ % ```
801
+
802
+ server_redirect(Port, Request) :-
803
+ integer(Port),
804
+ http_server_property(Port, scheme(Scheme)),
805
+ http_public_host(Request, Host, _Port, []),
806
+ memberchk(request_uri(Location), Request),
807
+ ( default_port(Scheme, Port)
808
+ -> format(string(To), '~w://~w~w', [Scheme, Host, Location])
809
+ ; format(string(To), '~w://~w:~w~w', [Scheme, Host, Port, Location])
810
+ ),
811
+ throw(http_reply(moved_temporary(To))).
812
+ server_redirect(true, Request) :-
813
+ !,
814
+ http_server_property(P, scheme(https)),
815
+ server_redirect(P, Request).
816
+ server_redirect(URI, Request) :-
817
+ memberchk(request_uri(Location), Request),
818
+ atom_concat(URI, Location, To),
819
+ throw(http_reply(moved_temporary(To))).
820
+
821
+ default_port(http, 80).
822
+ default_port(https, 443).
823
+
824
+
825
+ %! setup_debug(+Options) is det.
826
+ %
827
+ % Initialise debug/3 topics. The =|--debug|= option may be used
828
+ % multiple times.
829
+
830
+ setup_debug(Options) :-
831
+ setup_trace(Options),
832
+ nodebug(_),
833
+ debug(daemon),
834
+ enable_debug(Options).
835
+
836
+ enable_debug([]).
837
+ enable_debug([debug(Topic)|T]) :-
838
+ !,
839
+ atom_to_term(Topic, Term, _),
840
+ debug(Term),
841
+ enable_debug(T).
842
+ enable_debug([_|T]) :-
843
+ enable_debug(T).
844
+
845
+ setup_trace(Options) :-
846
+ option(gtrace(true), Options),
847
+ !,
848
+ gtrace.
849
+ setup_trace(_).
850
+
851
+
852
+ %! kill_x11(+Options) is det.
853
+ %
854
+ % Get rid of X11 access if interactive is false.
855
+
856
+ kill_x11(Options) :-
857
+ getenv('DISPLAY', Display),
858
+ Display \== '',
859
+ option(interactive(false), Options, false),
860
+ !,
861
+ setenv('DISPLAY', ''),
862
+ set_prolog_flag(gui, false).
863
+ kill_x11(_).
864
+
865
+
866
+ %! setup_signals(+Options)
867
+ %
868
+ % Prepare the server for signal handling. By default SIGINT and
869
+ % SIGTERM terminate the server. SIGHUP causes the server to run
870
+ % make/0.
871
+
872
+ setup_signals(Options) :-
873
+ option(interactive(true), Options, false),
874
+ !.
875
+ setup_signals(Options) :-
876
+ on_signal(int, _, quit),
877
+ on_signal(term, _, quit),
878
+ option(sighup(Action), Options, reload),
879
+ must_be(oneof([reload,quit]), Action),
880
+ on_signal(usr1, _, logrotate),
881
+ on_signal(hup, _, Action).
882
+
883
+ :- public
884
+ quit/1,
885
+ reload/1,
886
+ logrotate/1.
887
+
888
+ quit(Signal) :-
889
+ debug(daemon, 'Dying on signal ~w', [Signal]),
890
+ thread_send_message(main, quit(Signal)).
891
+
892
+ reload(Signal) :-
893
+ debug(daemon, 'Reload on signal ~w', [Signal]),
894
+ thread_send_message(main, reload).
895
+
896
+ logrotate(Signal) :-
897
+ debug(daemon, 'Closing log files on signal ~w', [Signal]),
898
+ thread_send_message(main, logrotate).
899
+
900
+ %! wait(+Options)
901
+ %
902
+ % This predicate runs in the main thread, waiting for messages
903
+ % send by signal handlers to control the server. In addition, it
904
+ % broadcasts maintenance(Interval, Deadline) messages every
905
+ % Interval seconds. These messages may be trapped using listen/2
906
+ % for performing scheduled maintenance such as rotating log files,
907
+ % cleaning stale data, etc.
908
+
909
+ wait(Options) :-
910
+ option(interactive(true), Options, false),
911
+ !,
912
+ enable_development_system.
913
+ wait(Options) :-
914
+ thread_self(Me),
915
+ option(maintenance_interval(Interval), Options, 300),
916
+ Interval > 0,
917
+ !,
918
+ first_deadline(Interval, FirstDeadline),
919
+ State = deadline(0),
920
+ repeat,
921
+ State = deadline(Count),
922
+ Deadline is FirstDeadline+Count*Interval,
923
+ ( thread_idle(thread_get_message(Me, Msg, [deadline(Deadline)]),
924
+ long)
925
+ -> catch(ignore(handle_message(Msg)), E,
926
+ print_message(error, E)),
927
+ Msg = quit(Signal),
928
+ catch(broadcast(http(shutdown)), E,
929
+ print_message(error, E)),
930
+ halt(Signal)
931
+ ; Count1 is Count + 1,
932
+ nb_setarg(1, State, Count1),
933
+ catch(broadcast(maintenance(Interval, Deadline)), E,
934
+ print_message(error, E)),
935
+ fail
936
+ ).
937
+ wait(_) :-
938
+ thread_self(Me),
939
+ repeat,
940
+ thread_idle(thread_get_message(Me, Msg), long),
941
+ catch(ignore(handle_message(Msg)), E,
942
+ print_message(error, E)),
943
+ Msg == quit,
944
+ !,
945
+ halt(0).
946
+
947
+ handle_message(reload) :-
948
+ make,
949
+ broadcast(logrotate).
950
+ handle_message(logrotate) :-
951
+ broadcast(logrotate).
952
+
953
+ first_deadline(Interval, Deadline) :-
954
+ get_time(Now),
955
+ Deadline is ((integer(Now) + Interval - 1)//Interval)*Interval.
956
+
957
+
958
+ /*******************************
959
+ * HOOKS *
960
+ *******************************/
961
+
962
+ %! http_server_hook(+Options) is semidet.
963
+ %
964
+ % Hook that is called to start the HTTP server. This hook must be
965
+ % compatible to http_server(Handler, Options). The default is
966
+ % provided by start_server/1.
967
+
968
+
969
+ %! http:sni_options(-HostName, -SSLOptions) is multi.
970
+ %
971
+ % Hook to provide Server Name Indication (SNI) for TLS
972
+ % servers. When starting an HTTPS server, all solutions of this
973
+ % predicate are collected and a suitable sni_hook/1 is defined
974
+ % for ssl_context/3 to use different contexts depending on the
975
+ % host name of the client request. This hook is executed
976
+ % _before_ privileges are dropped.
977
+
978
+
979
+ /*******************************
980
+ * MESSAGES *
981
+ *******************************/
982
+
983
+ :- multifile
984
+ prolog:message//1.
985
+
986
+ prolog:message(http_daemon(no_root(switch_user(User)))) -->
987
+ [ 'Program must be started as root to use --user=~w.'-[User] ].
988
+ prolog:message(http_daemon(no_root(open_port(Port)))) -->
989
+ [ 'Cannot open port ~w. Only root can open ports below 1000.'-[Port] ].