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

108 lines
3.2 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 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
fry xml.entities destructors urls html.elements
html.templates.fhtml http http.server http.server.responses
2008-06-02 16:00:03 -04:00
http.server.redirection ;
2008-02-29 01:57:38 -05:00
IN: http.server.static
2008-05-01 21:03:02 -04:00
TUPLE: file-responder root hook special 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?
2008-05-01 17:24:50 -04:00
] [
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 ;
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-charset
]
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 ] [ 2drop <304> ] if ;
2008-02-29 01:57:38 -05:00
: serving-path ( filename -- filename )
2008-09-05 19:56:35 -04:00
file-responder get root>> trim-right-separators
2008-03-27 06:18:07 -04:00
"/"
2008-09-05 19:56:35 -04:00
rot "" or trim-left-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
2008-10-19 14:09:48 -04:00
: file. ( name -- )
dup link-info directory? [ "/" append ] when
2008-05-27 03:42:13 -04:00
dup <a =href a> escape-string write </a> ;
2008-02-29 01:57:38 -05:00
: directory. ( path -- )
2008-09-29 05:10:00 -04:00
dup file-name [ ] [
2008-05-27 03:42:13 -04:00
[ <h1> file-name escape-string write </h1> ]
[
<ul>
2008-10-19 21:42:27 -04:00
directory-files [ <li> file. </li> ] each
2008-05-27 03:42:13 -04:00
</ul>
] bi
] 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>> [
2008-09-10 23:11:40 -04:00
'[ _ directory. ] "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 )
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 )
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
! file responder integration
: enable-fhtml ( responder -- responder )
[ <fhtml> "text/html" <content> ]
2008-05-26 01:47:27 -04:00
"application/x-factor-server-page"
pick special>> set-at ;