Add very basic GET support (route either resolves or doesn't)

TODO:
+ file-serving if no user-defined routes match. Search "public/" dir
unless otherwise specified by user.
+ query arguments
+ PUT, POST, DELETE
+ templating
+ fuzzy-/pattern-match-enabled user routes (e.g., /something/*/wildcard)?
This commit is contained in:
urlysses 2017-02-14 21:36:17 -05:00
parent 31311ee91c
commit a4e3aa169e
1 changed files with 29 additions and 7 deletions

36
1991.fs
View File

@ -2,7 +2,6 @@
include unix/socket.fs
\ User-defined routing
wordlist constant routes
: find-route ( addr u -- data )
@ -24,27 +23,50 @@ wordlist constant routes
: read-request ( socket -- addr u ) pad 4096 read-socket ;
: send-response ( addr u socket -- )
dup >R write-socket R> close-socket ;
dup >r write-socket r> close-socket ;
: or-404 ( addr u -- 404addr 404u )
2drop
s\" HTTP/1.1 404 Not Found\n Content-Type: text/plain\n\n 404" ;
: requested-route ( addr u -- routeaddr routeu )
bl scan 1- swap 1+ swap 2dup bl scan swap drop - ;
: either-resolve ( addr u -- resolveaddr resolveu )
s" GET" search if
requested-route
find-route dup if
execute
else
0 or-404 exit
then
s\" HTTP/1.1 200 OK\n Content-Type: text/html\n\n" 2swap s+
rdrop exit then ;
: prepare-response ( addr u -- returnaddr returnu)
either-resolve or-404 ;
: start-server { server client }
begin
server 255 listen
server accept-socket to client
client read-request type s\" HTTP/1.1 200 OK\n Content-Type: text/html\n\n fffff" client send-response
client read-request prepare-response client send-response
again ;
\ Userland
: 1991: ( port -- )
create-server 0 start-server ;
: 1991/ ( "<path> <word>" -- )
: /1991 ( "<path> <word>" -- )
bl word ' swap count register-route ;
\ App demo:
: handle-hi ." hi!" ; \ not sure printing is the way to go?
: handle-/ s" fff" ;
: handle-hi s" hi!" ;
1991/ hi handle-hi
/1991 / handle-/
/1991 /hi handle-hi
\ 8080 1991:
8080 1991: