A server-side web framework written in Forth. http://www.1-9-9-1.com
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

73 linhas
1.6KB

  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. \ Internal request handling
  19. : read-request ( socket -- addr u ) pad 4096 read-socket ;
  20. : send-response ( addr u socket -- )
  21. dup >r write-socket r> close-socket ;
  22. : or-404 ( addr u -- 404addr 404u )
  23. 2drop
  24. s\" HTTP/1.1 404 Not Found\n Content-Type: text/plain\n\n 404" ;
  25. : requested-route ( addr u -- routeaddr routeu )
  26. bl scan 1- swap 1+ swap 2dup bl scan swap drop - ;
  27. : either-resolve ( addr u -- resolveaddr resolveu )
  28. s" GET" search if
  29. requested-route
  30. find-route dup if
  31. execute
  32. else
  33. 0 exit \ continue to 404
  34. then
  35. s\" HTTP/1.1 200 OK\n Content-Type: text/html\n\n" 2swap s+
  36. rdrop exit then ;
  37. : prepare-response ( addr u -- returnaddr returnu)
  38. either-resolve or-404 ;
  39. : start-server { server client }
  40. begin
  41. server 255 listen
  42. server accept-socket to client
  43. client read-request prepare-response client send-response
  44. again ;
  45. \ Userland
  46. : 1991: ( port -- )
  47. create-server 0 start-server ;
  48. : /1991 ( "<path> <word>" -- )
  49. bl word ' swap count register-route ;
  50. \ App demo:
  51. : handle-/ s" fff" ;
  52. : handle-hi s" hi!" ;
  53. /1991 / handle-/
  54. /1991 /hi handle-hi
  55. 8080 1991: