Not logged in

Artifact 6da23be8654f0bd565dbe77fa8d67ca5607cd9d9

File casket.rx part of check-in [aeba3cb867] - fix to work with latest image by crc on 2011-01-05 21:30:39. [annotate]


( casket ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ )
chain: casket'
{{
  variable :options
---reveal---
  : KiB            ( n-n ) 1024 * ;
  : casket:path    ( -$ ) @memory  8 KiB - ;
  : casket:options ( -$ ) @:options ;
  : casket:buffer  ( -$ ) @memory 16 KiB - ;
  : casket:root    ( -$ ) "./" ;
  : casket:url     ( -$ ) "http://domain.com/path/to/cgi" ;
  : getRequest     ( -$ )
    casket:path dup "PATH_INFO" getEnv
    dup 1+ '/ ^strings'findChar 1+ !:options ;
}}
  ( ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ )
  : Content-type:    ( "- )
    "Content-type: " getToken ^strings'append "\n\n" ^strings'append
     keepString .data ` puts ; immediate
  ( ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ )
  {{
    : char ( $-$ )
      @+ 'n over = [ drop cr      0 ] ifTrue
         '' over = [ drop '" putc 0 ] ifTrue
         '[ over = [ 27 putc putc 0 ] ifTrue
      0; putc ;
    : obj  ( $-$ )
      @+ 'd over = [ drop swap @base [ decimal putn ] dip !base 0 ] ifTrue
         'o over = [ drop swap @base [ octal   putn ] dip !base 0 ] ifTrue
         'x over = [ drop swap @base [ hex     putn ] dip !base 0 ] ifTrue
         'c over = [ drop swap putc 0 ] ifTrue
         's over = [ drop &puts dip 0 ] ifTrue
         'u over = [ drop casket:url puts 0 ] ifTrue
      0; putc ;
    : complex ( $-n )
      repeat
        @+ 0;
        dup '\ = [ drop char 0 ] ifTrue
        dup '% = [ drop obj  0 ] ifTrue
        putc
      again ;
  ---reveal---
    : tputs complex drop ;
  }}
  ( ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ )
  {{
    create buffer  ( -a )
      16 1024 * allot
    : casket:templates ( -$ ) casket:root "templates/" ^strings'append ;
  ---reveal---
    : withTemplate ( $- )
      buffer 0 16 1024 * fill
      casket:templates ^strings'prepend buffer swap ^files'slurp drop
      buffer tputs ;
  }}

: /404
  Content-type: text/html
  "<html><body><h1>404</h1></body></html>" tputs cr bye ;
: /
  Content-type: text/html
  "<html><body><h1>casket</h1></body></html>" tputs cr bye ;

: doBeforeDispatch ;

: dispatch
  doBeforeDispatch
  getRequest 1+
  [ @+ [ 0 <> ] [ '/ <> ] bi and ] while 1- 0 swap !
  casket:path find [ @d->xt do ] [ drop /404 ] if bye ;

{{
  create bit 5 allot
  : extract  ( $c-$a ) drop @+ bit ! @+ bit 1+ ! bit ;
  : render   ( $c-$n )
    dup '+ = [ drop 32 ] ifTrue
    dup 13 = [ drop 32 ] ifTrue
    dup 10 = [ drop 32 ] ifTrue
    dup '% = [ extract hex toNumber decimal ] ifTrue ;
  : <decode> (  $-$  ) repeat @+ 0; render ^buffer'add again ;
---reveal---
  : decode   (  $-   ) casket:buffer ^buffer'set <decode> drop ;
}}

: serve: ( """- )
  getToken dup
  "/" ^strings'prepend header
  compiler on
  keepString .data getToken drop
  ` Content-type: ` puts ` ; &.word reclass ;

;chain