Hex Artifact Content

Not logged in

Artifact 87378b1a42e24b2ab40f9c554a19df2e0f5531ed:


0000: 25 25 25 0a 25 25 25 20 73 65 72 76 65 72 2e 70  %%%.%%% server.p
0010: 6c 0a 25 25 25 20 50 72 6f 74 6f 74 79 70 65 20  l.%%% Prototype 
0020: 73 65 72 76 65 72 0a 25 25 25 0a 0a 3a 2d 20 75  server.%%%..:- u
0030: 73 65 5f 6d 6f 64 75 6c 65 28 6c 69 62 72 61 72  se_module(librar
0040: 79 28 68 74 74 70 2f 74 68 72 65 61 64 5f 68 74  y(http/thread_ht
0050: 74 70 64 29 29 2e 0a 3a 2d 20 75 73 65 5f 6d 6f  tpd))..:- use_mo
0060: 64 75 6c 65 28 6c 69 62 72 61 72 79 28 68 74 74  dule(library(htt
0070: 70 2f 68 74 74 70 5f 64 69 73 70 61 74 63 68 29  p/http_dispatch)
0080: 29 2e 0a 3a 2d 20 75 73 65 5f 6d 6f 64 75 6c 65  )..:- use_module
0090: 28 6c 69 62 72 61 72 79 28 68 74 74 70 2f 68 74  (library(http/ht
00a0: 74 70 5f 73 65 72 76 65 72 5f 66 69 6c 65 73 29  tp_server_files)
00b0: 29 2e 0a 3a 2d 20 75 73 65 5f 6d 6f 64 75 6c 65  )..:- use_module
00c0: 28 6c 69 62 72 61 72 79 28 70 65 6e 67 69 6e 65  (library(pengine
00d0: 73 29 29 2e 0a 0a 25 20 4c 6f 61 64 20 74 68 65  s))...% Load the
00e0: 20 6f 74 68 65 72 20 63 6f 6d 70 6f 6e 65 6e 74   other component
00f0: 73 2e 0a 3a 2d 20 75 73 65 5f 6d 6f 64 75 6c 65  s..:- use_module
0100: 28 27 70 6c 73 72 63 2f 63 68 65 63 6b 65 72 27  ('plsrc/checker'
0110: 29 2e 0a 3a 2d 20 75 73 65 5f 6d 6f 64 75 6c 65  )..:- use_module
0120: 28 27 70 6c 73 72 63 2f 70 72 6f 67 72 61 6d 27  ('plsrc/program'
0130: 29 2e 0a 0a 0a 0a 25 20 41 64 64 20 73 65 61 72  ).....% Add sear
0140: 63 68 20 70 61 74 68 73 20 66 6f 72 20 2e 2f 72  ch paths for ./r
0150: 65 73 20 61 6e 64 20 2e 2f 6c 69 62 0a 25 20 54  es and ./lib.% T
0160: 4f 44 4f 3a 20 46 69 67 75 72 65 20 6f 75 74 20  ODO: Figure out 
0170: 74 68 65 20 63 6f 72 72 65 63 74 20 77 61 79 20  the correct way 
0180: 74 6f 20 64 6f 20 74 68 69 73 20 28 72 65 66 65  to do this (refe
0190: 72 65 6e 63 65 20 74 68 65 20 63 75 72 72 65 6e  rence the curren
01a0: 74 20 57 44 29 2e 0a 75 73 65 72 3a 66 69 6c 65  t WD)..user:file
01b0: 5f 73 65 61 72 63 68 5f 70 61 74 68 28 72 65 73  _search_path(res
01c0: 2c 52 65 73 50 61 74 68 29 20 3a 2d 0a 20 20 20  ,ResPath) :-.   
01d0: 20 61 62 73 6f 6c 75 74 65 5f 66 69 6c 65 5f 6e   absolute_file_n
01e0: 61 6d 65 28 27 2e 27 2c 57 44 29 2c 0a 20 20 20  ame('.',WD),.   
01f0: 20 61 74 6f 6d 5f 63 6f 6e 63 61 74 28 57 44 2c   atom_concat(WD,
0200: 27 2f 72 65 73 27 2c 52 65 73 50 61 74 68 29 2e  '/res',ResPath).
0210: 0a 75 73 65 72 3a 66 69 6c 65 5f 73 65 61 72 63  .user:file_searc
0220: 68 5f 70 61 74 68 28 6c 69 62 2c 52 65 73 50 61  h_path(lib,ResPa
0230: 74 68 29 20 3a 2d 0a 20 20 20 20 61 62 73 6f 6c  th) :-.    absol
0240: 75 74 65 5f 66 69 6c 65 5f 6e 61 6d 65 28 27 2e  ute_file_name('.
0250: 27 2c 57 44 29 2c 0a 20 20 20 20 61 74 6f 6d 5f  ',WD),.    atom_
0260: 63 6f 6e 63 61 74 28 57 44 2c 27 2f 6c 69 62 27  concat(WD,'/lib'
0270: 2c 52 65 73 50 61 74 68 29 2e 0a 75 73 65 72 3a  ,ResPath)..user:
0280: 66 69 6c 65 5f 73 65 61 72 63 68 5f 70 61 74 68  file_search_path
0290: 28 73 72 63 2c 52 65 73 50 61 74 68 29 20 3a 2d  (src,ResPath) :-
02a0: 0a 20 20 20 20 25 20 49 73 20 74 68 69 73 20 6e  .    % Is this n
02b0: 65 63 65 73 73 61 72 79 3f 0a 20 20 20 20 61 62  ecessary?.    ab
02c0: 73 6f 6c 75 74 65 5f 66 69 6c 65 5f 6e 61 6d 65  solute_file_name
02d0: 28 27 2e 27 2c 57 44 29 2c 0a 20 20 20 20 61 74  ('.',WD),.    at
02e0: 6f 6d 5f 63 6f 6e 63 61 74 28 57 44 2c 27 2f 73  om_concat(WD,'/s
02f0: 72 63 27 2c 52 65 73 50 61 74 68 29 2e 0a 0a 75  rc',ResPath)...u
0300: 73 65 72 3a 66 69 6c 65 5f 73 65 61 72 63 68 5f  ser:file_search_
0310: 70 61 74 68 28 65 78 61 6d 70 6c 65 73 2c 52 65  path(examples,Re
0320: 73 50 61 74 68 29 20 3a 2d 0a 20 20 20 20 61 62  sPath) :-.    ab
0330: 73 6f 6c 75 74 65 5f 66 69 6c 65 5f 6e 61 6d 65  solute_file_name
0340: 28 27 2e 27 2c 57 44 29 2c 0a 20 20 20 20 61 74  ('.',WD),.    at
0350: 6f 6d 5f 63 6f 6e 63 61 74 28 57 44 2c 27 2f 65  om_concat(WD,'/e
0360: 78 61 6d 70 6c 65 73 27 2c 52 65 73 50 61 74 68  xamples',ResPath
0370: 29 2e 0a 0a 25 20 54 68 69 73 20 6d 61 6b 65 73  )...% This makes
0380: 20 2e 2f 70 6c 73 72 63 20 61 76 61 69 6c 61 62   ./plsrc availab
0390: 6c 65 20 73 6f 20 77 65 20 63 61 6e 20 64 6f 20  le so we can do 
03a0: 74 68 69 6e 67 73 20 6c 69 6b 65 0a 25 20 75 73  things like.% us
03b0: 65 5f 6d 6f 64 75 6c 65 28 70 6c 73 72 63 28 70  e_module(plsrc(p
03c0: 72 6f 67 72 61 6d 29 29 2e 0a 75 73 65 72 3a 66  rogram))..user:f
03d0: 69 6c 65 5f 73 65 61 72 63 68 5f 70 61 74 68 28  ile_search_path(
03e0: 70 6c 73 72 63 2c 52 65 73 50 61 74 68 29 20 3a  plsrc,ResPath) :
03f0: 2d 0a 20 20 20 20 61 62 73 6f 6c 75 74 65 5f 66  -.    absolute_f
0400: 69 6c 65 5f 6e 61 6d 65 28 27 2e 27 2c 57 44 29  ile_name('.',WD)
0410: 2c 0a 20 20 20 20 61 74 6f 6d 5f 63 6f 6e 63 61  ,.    atom_conca
0420: 74 28 57 44 2c 27 2f 70 6c 73 72 63 27 2c 52 65  t(WD,'/plsrc',Re
0430: 73 50 61 74 68 29 2e 0a 0a 25 20 49 6e 73 74 61  sPath)...% Insta
0440: 6c 6c 20 50 45 6e 67 69 6e 65 20 61 70 70 6c 69  ll PEngine appli
0450: 63 61 74 69 6f 6e 73 20 28 72 65 70 6c 2c 20 70  cations (repl, p
0460: 61 73 73 69 73 74 29 0a 3a 2d 20 70 65 6e 67 69  assist).:- pengi
0470: 6e 65 5f 61 70 70 6c 69 63 61 74 69 6f 6e 28 72  ne_application(r
0480: 65 70 6c 29 2e 0a 3a 2d 20 75 73 65 5f 6d 6f 64  epl)..:- use_mod
0490: 75 6c 65 28 72 65 70 6c 3a 27 2e 2f 61 70 70 73  ule(repl:'./apps
04a0: 2f 72 65 70 6c 2f 72 65 70 6c 27 29 2e 0a 0a 3a  /repl/repl')...:
04b0: 2d 20 70 65 6e 67 69 6e 65 5f 61 70 70 6c 69 63  - pengine_applic
04c0: 61 74 69 6f 6e 28 70 61 73 73 69 73 74 29 2e 0a  ation(passist)..
04d0: 3a 2d 20 75 73 65 5f 6d 6f 64 75 6c 65 28 70 61  :- use_module(pa
04e0: 73 73 69 73 74 3a 27 2e 2f 61 70 70 73 2f 70 61  ssist:'./apps/pa
04f0: 73 73 69 73 74 2f 70 61 73 73 69 73 74 27 29 2e  ssist/passist').
0500: 0a 0a 25 20 54 68 69 73 20 6d 61 6b 65 73 20 69  ..% This makes i
0510: 74 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 75 73  t so that all us
0520: 65 72 73 20 61 72 65 20 61 75 74 68 65 6e 74 69  ers are authenti
0530: 63 61 74 65 64 2c 20 61 6e 64 20 61 6c 6c 20 61  cated, and all a
0540: 75 74 68 65 6e 74 69 63 61 74 65 64 20 75 73 65  uthenticated use
0550: 72 73 0a 25 20 63 61 6e 20 72 75 6e 20 6e 6f 6e  rs.% can run non
0560: 2d 73 61 6e 64 62 6f 78 65 64 20 63 6f 64 65 2e  -sandboxed code.
0570: 20 0a 70 65 6e 67 69 6e 65 73 3a 6e 6f 74 5f 73   .pengines:not_s
0580: 61 6e 64 62 6f 78 65 64 28 5f 2c 5f 29 2e 0a 70  andboxed(_,_)..p
0590: 65 6e 67 69 6e 65 73 3a 61 75 74 68 65 6e 74 69  engines:authenti
05a0: 63 61 74 69 6f 6e 5f 68 6f 6f 6b 28 5f 2c 5f 2c  cation_hook(_,_,
05b0: 75 73 65 72 29 2e 0a 0a 3a 2d 20 68 74 74 70 5f  user)...:- http_
05c0: 68 61 6e 64 6c 65 72 28 72 6f 6f 74 28 73 72 63  handler(root(src
05d0: 29 2c 20 73 65 72 76 65 5f 66 69 6c 65 73 5f 69  ), serve_files_i
05e0: 6e 5f 64 69 72 65 63 74 6f 72 79 28 73 72 63 29  n_directory(src)
05f0: 2c 20 5b 70 72 65 66 69 78 5d 29 2e 0a 3a 2d 20  , [prefix])..:- 
0600: 68 74 74 70 5f 68 61 6e 64 6c 65 72 28 72 6f 6f  http_handler(roo
0610: 74 28 72 65 73 29 2c 20 73 65 72 76 65 5f 66 69  t(res), serve_fi
0620: 6c 65 73 5f 69 6e 5f 64 69 72 65 63 74 6f 72 79  les_in_directory
0630: 28 72 65 73 29 2c 20 5b 70 72 65 66 69 78 5d 29  (res), [prefix])
0640: 2e 0a 3a 2d 20 68 74 74 70 5f 68 61 6e 64 6c 65  ..:- http_handle
0650: 72 28 72 6f 6f 74 28 6c 69 62 29 2c 20 73 65 72  r(root(lib), ser
0660: 76 65 5f 66 69 6c 65 73 5f 69 6e 5f 64 69 72 65  ve_files_in_dire
0670: 63 74 6f 72 79 28 6c 69 62 29 2c 20 5b 70 72 65  ctory(lib), [pre
0680: 66 69 78 5d 29 2e 0a 3a 2d 20 68 74 74 70 5f 68  fix])..:- http_h
0690: 61 6e 64 6c 65 72 28 72 6f 6f 74 28 65 78 61 6d  andler(root(exam
06a0: 70 6c 65 73 29 2c 20 73 65 72 76 65 5f 66 69 6c  ples), serve_fil
06b0: 65 73 5f 69 6e 5f 64 69 72 65 63 74 6f 72 79 28  es_in_directory(
06c0: 65 78 61 6d 70 6c 65 73 29 2c 20 5b 70 72 65 66  examples), [pref
06d0: 69 78 5d 29 2e 0a 0a 25 20 53 69 6d 70 6c 65 20  ix])...% Simple 
06e0: 69 6e 64 65 78 20 68 61 6e 64 6c 65 72 2c 20 73  index handler, s
06f0: 6f 20 74 68 61 74 20 49 20 64 6f 6e 27 74 20 68  o that I don't h
0700: 61 76 65 20 74 6f 20 73 74 61 72 65 20 61 74 20  ave to stare at 
0710: 61 20 34 30 34 20 6f 6e 20 73 74 61 72 74 75 70  a 404 on startup
0720: 2e 0a 25 3a 2d 20 68 74 74 70 5f 68 61 6e 64 6c  ..%:- http_handl
0730: 65 72 28 27 2f 69 6e 64 65 78 2e 68 74 6d 6c 27  er('/index.html'
0740: 2c 20 73 68 6f 77 5f 69 6e 64 65 78 2c 20 5b 5d  , show_index, []
0750: 29 2e 0a 0a 0a 25 20 73 65 72 76 65 72 28 29 2c  )....% server(),
0760: 20 73 65 72 76 65 72 28 50 6f 72 74 29 0a 25 20   server(Port).% 
0770: 53 74 61 72 74 20 74 68 65 20 41 72 65 6e 64 20  Start the Arend 
0780: 73 65 72 76 65 72 20 6f 6e 20 74 68 65 20 73 70  server on the sp
0790: 65 63 69 66 69 65 64 20 70 6f 72 74 20 28 64 65  ecified port (de
07a0: 66 61 75 6c 74 73 20 74 6f 20 34 30 30 31 29 2e  faults to 4001).
07b0: 0a 73 74 61 72 74 20 3a 2d 20 73 65 72 76 65 72  .start :- server
07c0: 28 34 30 30 31 29 2e 0a 73 65 72 76 65 72 28 50  (4001)..server(P
07d0: 6f 72 74 29 20 3a 2d 0a 20 20 20 20 20 20 68 74  ort) :-.      ht
07e0: 74 70 5f 73 65 72 76 65 72 28 68 74 74 70 5f 64  tp_server(http_d
07f0: 69 73 70 61 74 63 68 2c 20 5b 70 6f 72 74 28 50  ispatch, [port(P
0800: 6f 72 74 29 5d 29 2e 0a 0a 0a 25 20 50 72 6f 76  ort)])....% Prov
0810: 69 64 65 20 61 20 67 65 6e 74 6c 65 20 77 61 79  ide a gentle way
0820: 20 74 6f 20 73 74 6f 70 20 74 68 65 20 73 65 72   to stop the ser
0830: 76 65 72 2e 20 28 43 61 6e 20 62 65 20 75 73 65  ver. (Can be use
0840: 64 20 74 6f 20 72 65 73 74 61 72 74 2e 29 0a 73  d to restart.).s
0850: 74 6f 70 20 3a 2d 20 68 74 74 70 5f 73 74 6f 70  top :- http_stop
0860: 5f 73 65 72 76 65 72 28 34 30 30 31 2c 20 5b 5d  _server(4001, []
0870: 29 2e 0a 0a 0a 25 20 53 74 61 72 74 20 74 68 65  )....% Start the
0880: 20 73 65 72 76 65 72 20 6f 6e 20 6c 6f 61 64 2e   server on load.
0890: 0a 3a 2d 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .:- initializati
08a0: 6f 6e 28 73 74 61 72 74 29 2e                    on(start).