A server-side web framework written in Forth. http://www.1-9-9-1.com
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

93 řádky
2.3KB

  1. \ 1991
  2. include unix/socket.fs
  3. \ User-defined routing
  4. wordlist constant routes
  5. : find-route ( addr u -- data )
  6. routes search-wordlist if
  7. >body @
  8. else 0 then ;
  9. : register-route ( data addr u -- )
  10. 2dup routes search-wordlist if
  11. routes drop nip nip
  12. >body !
  13. else
  14. routes get-current >r set-current \ switch definition word lists
  15. nextname create ,
  16. r> set-current
  17. then ;
  18. \ Public directory
  19. : pubvar create 0 , 0 , ;
  20. pubvar public
  21. : set-public-path ( addr u -- )
  22. public 2! ;
  23. : get-public-path ( -- addr u )
  24. public 2@ ;
  25. \ Internal request handling
  26. : read-request ( socket -- addr u ) pad 4096 read-socket ;
  27. : send-response ( addr u socket -- )
  28. dup >r write-socket r> close-socket ;
  29. : requested-route ( addr u -- routeaddr routeu )
  30. bl scan 1- swap 1+ swap 2dup bl scan swap drop - ;
  31. : file-exists? ( addr u -- addr u bool )
  32. 2dup file-status nip 0= ;
  33. : serve-file ( addr u -- addr u )
  34. slurp-file ;
  35. : either-resolve ( addr u -- resolveaddr resolveu )
  36. s" GET" search if
  37. requested-route
  38. 2dup find-route dup if
  39. >r 2drop r> \ keep xt, drop the route string
  40. execute \ execute the user's route handler
  41. else
  42. drop \ drop the xt
  43. get-public-path 2swap s+ \ see if route exists in public dir
  44. file-exists? if
  45. serve-file \ collect file contents
  46. else
  47. exit \ continue to 404
  48. then
  49. then
  50. s\" HTTP/1.1 200 OK\n Content-Type: text/html\n\n" 2swap s+
  51. rdrop exit then ;
  52. : or-404 ( addr u -- 404addr 404u )
  53. 2drop
  54. s\" HTTP/1.1 404 Not Found\n Content-Type: text/plain\n\n 404" ;
  55. : prepare-response ( addr u -- returnaddr returnu)
  56. either-resolve or-404 ;
  57. : start-server { server client }
  58. begin
  59. server 255 listen
  60. server accept-socket to client
  61. client read-request prepare-response client send-response
  62. again ;
  63. \ Userland
  64. : 1991: ( port -- )
  65. create-server 0 start-server ;
  66. : /1991 ( "<path> <word>" -- )
  67. bl word ' swap count register-route ;
  68. \ App demo:
  69. : handle-/ s" fff" ;
  70. : handle-hi s" hi!" ;
  71. /1991 / handle-/
  72. /1991 /hi handle-hi
  73. 8080 1991: