factor/extra/http/server/static/static.factor

93 lines
2.7 KiB
Factor
Raw Normal View History

2008-02-29 01:57:38 -05:00
! Copyright (C) 2004, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: calendar html io io.files kernel math math.parser http
http.server namespaces parser sequences strings assocs
hashtables debugger http.mime sorting html.elements logging
2008-03-29 00:00:20 -04:00
calendar.format accessors io.encodings.binary fry ;
2008-02-29 01:57:38 -05:00
IN: http.server.static
! special maps mime types to quots with effect ( path -- )
TUPLE: file-responder root hook special ;
: file-http-date ( filename -- string )
file-info modified>> timestamp>http-string ;
2008-02-29 01:57:38 -05:00
: last-modified-matches? ( filename -- ? )
file-http-date dup [
request get "if-modified-since" header =
] when ;
: <304> ( -- response )
304 "Not modified" <trivial-response> ;
: <file-responder> ( root hook -- responder )
H{ } clone file-responder boa ;
2008-02-29 01:57:38 -05:00
: <static> ( root -- responder )
[
<content>
2008-03-11 04:39:09 -04:00
swap
[ file-info size>> "content-length" set-header ]
2008-03-11 04:39:09 -04:00
[ file-http-date "last-modified" set-header ]
[ '[ , binary <file-reader> stdio get stream-copy ] >>body ]
tri
2008-02-29 01:57:38 -05:00
] <file-responder> ;
: serve-static ( filename mime-type -- response )
over last-modified-matches?
2008-03-11 04:39:09 -04:00
[ 2drop <304> ] [ file-responder get hook>> call ] if ;
2008-02-29 01:57:38 -05:00
: serving-path ( filename -- filename )
2008-03-27 06:18:07 -04:00
file-responder get root>> right-trim-separators
"/"
rot "" or left-trim-separators 3append ;
2008-02-29 01:57:38 -05:00
: serve-file ( filename -- response )
dup mime-type
2008-03-11 04:39:09 -04:00
dup file-responder get special>> at
2008-02-29 01:57:38 -05:00
[ call ] [ serve-static ] ?if ;
\ serve-file NOTICE add-input-logging
: file. ( name dirp -- )
[ "/" append ] when
dup <a =href a> write </a> ;
: directory. ( path -- )
dup file-name [
2008-03-11 04:39:09 -04:00
[ <h1> file-name write </h1> ]
[
<ul>
directory sort-keys
[ <li> file. </li> ] assoc-each
</ul>
] bi
2008-02-29 01:57:38 -05:00
] simple-html-document ;
: list-directory ( directory -- response )
"text/html" <content>
2008-03-11 04:39:09 -04:00
swap '[ , directory. ] >>body ;
2008-02-29 01:57:38 -05:00
: find-index ( filename -- path )
2008-04-25 04:23:47 -04:00
"index.html" append-path dup exists? [ drop f ] unless ;
2008-02-29 01:57:38 -05:00
: serve-directory ( filename -- response )
2008-04-25 04:23:47 -04:00
request get path>> "/" tail? [
dup
find-index [ serve-file ] [ list-directory ] ?if
2008-02-29 01:57:38 -05:00
] [
2008-04-25 04:23:47 -04:00
drop
request get path>> "/" append f <standard-redirect>
2008-02-29 01:57:38 -05:00
] if ;
: serve-object ( filename -- response )
2008-04-25 04:23:47 -04:00
serving-path dup exists?
[ dup directory? [ serve-directory ] [ serve-file ] if ]
[ drop <404> ]
if ;
2008-02-29 01:57:38 -05:00
M: file-responder call-responder* ( path responder -- response )
2008-03-11 04:39:09 -04:00
file-responder set
2008-04-25 04:23:47 -04:00
".." over member?
[ drop <400> ] [ "/" join serve-object ] if ;