factor/basis/http/server/static/static.factor

113 lines
3.5 KiB
Factor
Raw Normal View History

! Copyright (C) 2004, 2010 Slava Pestov.
2008-02-29 01:57:38 -05:00
! See http://factorcode.org/license.txt for BSD license.
USING: calendar kernel math math.order math.parser namespaces
parser sequences strings assocs hashtables debugger mime.types
sorting logging calendar.format accessors splitting io io.files
io.files.info io.directories io.pathnames io.encodings.binary
2009-02-05 22:17:03 -05:00
fry xml.entities destructors urls html xml.syntax
html.templates.fhtml http http.server http.server.responses
2009-03-16 21:11:36 -04:00
http.server.redirection xml.writer ;
FROM: sets => adjoin ;
2008-02-29 01:57:38 -05:00
IN: http.server.static
TUPLE: file-responder root hook special index-names allow-listings ;
2008-02-29 01:57:38 -05:00
: modified-since ( request -- date )
"if-modified-since" header ";" split1 drop
dup [ rfc822>timestamp ] when ;
2008-05-01 17:24:50 -04:00
: modified-since? ( filename -- ? )
request get modified-since dup
[ [ file-info modified>> ] dip after? ] [ 2drop t ] if ;
2008-02-29 01:57:38 -05:00
: <file-responder> ( root hook -- responder )
2008-05-01 21:03:02 -04:00
file-responder new
swap >>hook
swap >>root
H{ } clone >>special
V{ "index.html" } >>index-names ;
2008-02-29 01:57:38 -05:00
2008-05-29 18:32:59 -04:00
: (serve-static) ( path mime-type -- response )
[
[ binary <file-reader> &dispose ] dip <content>
binary >>content-encoding
]
2008-05-29 18:32:59 -04:00
[ drop file-info [ size>> ] [ modified>> ] bi ] 2bi
[ "content-length" set-header ]
[ "last-modified" set-header ] bi* ;
2008-02-29 01:57:38 -05:00
: <static> ( root -- responder )
2008-05-29 18:32:59 -04:00
[ (serve-static) ] <file-responder> ;
2008-02-29 01:57:38 -05:00
: serve-static ( filename mime-type -- response )
2008-05-01 17:24:50 -04:00
over modified-since?
[ file-responder get hook>> call( filename mime-type -- response ) ]
[ 2drop <304> ]
if ;
2008-02-29 01:57:38 -05:00
: serving-path ( filename -- filename )
[ file-responder get root>> trim-tail-separators ] dip
[ "/" swap trim-head-separators 3append ] unless-empty ;
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
[ call( filename -- response ) ] [ serve-static ] ?if ;
2008-02-29 01:57:38 -05:00
\ serve-file NOTICE add-input-logging
2009-01-31 21:54:49 -05:00
: file>html ( name -- xml )
2008-10-19 14:09:48 -04:00
dup link-info directory? [ "/" append ] when
2009-01-30 20:28:16 -05:00
dup [XML <li><a href=<->><-></a></li> XML] ;
2008-02-29 01:57:38 -05:00
2009-01-31 21:54:49 -05:00
: directory>html ( path -- xml )
[ file-name ]
[ drop f ]
[
[ file-name ] [ [ [ file>html ] map ] with-directory-files ] bi
[XML <h1><-></h1> <ul><-></ul> XML]
] tri
simple-page ;
2008-02-29 01:57:38 -05:00
: list-directory ( directory -- response )
2008-05-01 21:03:02 -04:00
file-responder get allow-listings>> [
2009-01-31 21:54:49 -05:00
directory>html "text/html" <content>
2008-05-01 21:03:02 -04:00
] [
drop <403>
] if ;
2008-02-29 01:57:38 -05:00
: find-index ( filename -- path )
file-responder get index-names>>
[ append-path dup exists? [ drop f ] unless ] with map-find
drop ;
2008-02-29 01:57:38 -05:00
: serve-directory ( filename -- response )
url get path>> "/" tail? [
2008-04-25 04:23:47 -04:00
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
url get clone [ "/" append ] change-path <permanent-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?
2008-05-15 00:23:12 -04:00
[ dup file-info directory? [ serve-directory ] [ serve-file ] if ]
2008-04-25 04:23:47 -04:00
[ 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 ;
2008-05-26 01:47:27 -04:00
: add-index ( name responder -- )
index-names>> adjoin ;
: serve-fhtml ( path -- response )
<fhtml> "text/html" <content> ;
2008-05-26 01:47:27 -04:00
: enable-fhtml ( responder -- responder )
[ serve-fhtml ] "application/x-factor-server-page" pick special>> set-at
"index.fhtml" over add-index ;