: httpd ( port -- )
internet-server "http.server"
- [ handle-client ] with-server ;
- latin1 [ handle-client ] with-server ;
++ binary [ handle-client ] with-server ;
: httpd-main ( -- ) 8888 httpd ;
--- /dev/null
- USING: io io.files io.streams.string
++USING: io io.files io.streams.string io.encodings.utf8
+http.server.templating.fhtml kernel tools.test sequences ;
+IN: http.server.templating.fhtml.tests
+
+: test-template ( path -- ? )
+ "extra/http/server/templating/fhtml/test/" swap append
+ [
+ ".fhtml" append resource-path
+ [ run-template-file ] with-string-writer
+ ] keep
- ".html" append resource-path file-contents = ;
++ ".html" append resource-path utf8 file-contents = ;
+
+[ t ] [ "example" test-template ] unit-test
+[ t ] [ "bug" test-template ] unit-test
+[ t ] [ "stack" test-template ] unit-test
+
+[ ] [ "<%\n%>" parse-template drop ] unit-test
--- /dev/null
- io.files io.streams.lines io.streams.string html html.elements
+! Copyright (C) 2005 Alex Chapman
+! Copyright (C) 2006, 2007 Slava Pestov
+! See http://factorcode.org/license.txt for BSD license.
+USING: continuations sequences kernel parser namespaces io
- assocs ;
++io.files io.streams.string html html.elements
+source-files debugger combinators math quotations generic
+strings splitting accessors http.server.static http.server
- ?resource-path file-contents
++assocs io.encodings.utf8 ;
+
+IN: http.server.templating.fhtml
+
+: templating-vocab ( -- vocab-name ) "http.server.templating.fhtml" ;
+
+! See apps/http-server/test/ or libs/furnace/ for template usage
+! examples
+
+! We use a custom lexer so that %> ends a token even if not
+! followed by whitespace
+TUPLE: template-lexer ;
+
+: <template-lexer> ( lines -- lexer )
+ <lexer> template-lexer construct-delegate ;
+
+M: template-lexer skip-word
+ [
+ {
+ { [ 2dup nth CHAR: " = ] [ drop 1+ ] }
+ { [ 2dup swap tail-slice "%>" head? ] [ drop 2 + ] }
+ { [ t ] [ f skip ] }
+ } cond
+ ] change-column ;
+
+DEFER: <% delimiter
+
+: check-<% ( lexer -- col )
+ "<%" over lexer-line-text rot lexer-column start* ;
+
+: found-<% ( accum lexer col -- accum )
+ [
+ over lexer-line-text
+ >r >r lexer-column r> r> subseq parsed
+ \ write-html parsed
+ ] 2keep 2 + swap set-lexer-column ;
+
+: still-looking ( accum lexer -- accum )
+ [
+ dup lexer-line-text swap lexer-column tail
+ parsed \ print-html parsed
+ ] keep next-line ;
+
+: parse-%> ( accum lexer -- accum )
+ dup still-parsing? [
+ dup check-<%
+ [ found-<% ] [ [ still-looking ] keep parse-%> ] if*
+ ] [
+ drop
+ ] if ;
+
+: %> lexer get parse-%> ; parsing
+
+: parse-template-lines ( lines -- quot )
+ <template-lexer> [
+ V{ } clone lexer get parse-%> f (parse-until)
+ ] with-parser ;
+
+: parse-template ( string -- quot )
+ [
+ use [ clone ] change
+ templating-vocab use+
+ string-lines parse-template-lines
+ ] with-scope ;
+
+: eval-template ( string -- ) parse-template call ;
+
+: html-error. ( error -- )
+ <pre> error. </pre> ;
+
+: run-template-file ( filename -- )
+ [
+ [
+ "quiet" on
+ parser-notes off
+ templating-vocab use+
+ ! so that reload works properly
+ dup source-file file set
- [ run-template-file ] with-file-writer ;
++ ?resource-path utf8 file-contents
+ [ eval-template ] [ html-error. drop ] recover
+ ] with-file-vocabs
+ ] curry assert-depth ;
+
+: run-relative-template-file ( filename -- )
+ file get source-file-path parent-directory
+ swap path+ run-template-file ;
+
+: template-convert ( infile outfile -- )
++ utf8 [ run-template-file ] with-file-writer ;
+
+! file responder integration
+: serve-fhtml ( filename -- response )
+ "text/html" <content>
+ swap [ run-template-file ] curry >>body ;
+
+: enable-fhtml ( responder -- responder )
+ [ serve-fhtml ]
+ "application/x-factor-server-page"
+ pick special>> set-at ;
--- /dev/null
-M: unix-io destruct-handle ( obj -- ) unix:close drop ;
+ ! Copyright (C) 2007 Elie Chaftari, Doug Coleman.
+ ! See http://factorcode.org/license.txt for BSD license.
+ USING: alien.c-types alien.syntax destructors hexdump io
+ io.buffers io.nonblocking io.sockets
+ io.unix.backend io.unix.files kernel libc locals math qualified
+ sequences io.sniffer.backend ;
+ QUALIFIED: unix
+ IN: io.sniffer.bsd
+
++M: unix-io destruct-handle ( obj -- ) unix:close ;
+
+ C-UNION: ifreq_props "sockaddr-in" "short" "int" "caddr_t" ;
+ C-STRUCT: ifreq { { "char" 16 } "name" } { "ifreq_props" "props" } ;
+
+ TUPLE: sniffer-spec path ifname ;
+
+ C: <sniffer-spec> sniffer-spec
+
+ : IOCPARM_MASK HEX: 1fff ; inline
+ : IOCPARM_MAX IOCPARM_MASK 1+ ; inline
+ : IOC_VOID HEX: 20000000 ; inline
+ : IOC_OUT HEX: 40000000 ; inline
+ : IOC_IN HEX: 80000000 ; inline
+ : IOC_INOUT IOC_IN IOC_OUT bitor ; inline
+ : IOC_DIRMASK HEX: e0000000 ; inline
+
+ :: ioc ( inout group num len -- n )
+ group first 8 shift num bitor
+ len IOCPARM_MASK bitand 16 shift bitor
+ inout bitor ;
+
+ : io-len ( type -- n )
+ dup zero? [ heap-size ] unless ;
+
+ : io ( group num -- n )
+ IOC_VOID -rot 0 io-len ioc ;
+
+ : ior ( group num type -- n )
+ IOC_OUT -roll io-len ioc ;
+
+ : iow ( group num type -- n )
+ IOC_IN -roll io-len ioc ;
+
+ : iowr ( group num type -- n )
+ IOC_INOUT -roll io-len ioc ;
+
+ : BIOCGBLEN ( -- n ) "B" 102 "uint" ior ; inline
+ : BIOCSETIF ( -- n ) "B" 108 "ifreq" iow ; inline
+ : BIOCPROMISC ( -- n ) "B" 105 io ; inline
+ : BIOCIMMEDIATE ( -- n ) "B" 112 "uint" iow ; inline
+
+ : make-ifreq-props ( ifname -- ifreq )
+ "ifreq" <c-object>
+ 12 <short> 16 0 pad-right over set-ifreq-props
+ swap malloc-char-string dup free-always
+ over set-ifreq-name ;
+
+ : make-ioctl-buffer ( fd -- buffer )
+ BIOCGBLEN "char*" <c-object>
+ [ unix:ioctl io-error ] keep
+ *int <buffer> ;
+
+ : ioctl-BIOSETIF ( fd ifreq -- )
+ >r BIOCSETIF r> unix:ioctl io-error ;
+
+ : ioctl-BIOPROMISC ( fd -- )
+ BIOCPROMISC f unix:ioctl io-error ;
+
+ : ioctl-BIOCIMMEDIATE
+ BIOCIMMEDIATE 1 <int> unix:ioctl io-error ;
+
+ : ioctl-sniffer-fd ( fd ifname -- )
+ dupd make-ifreq-props ioctl-BIOSETIF
+ dup ioctl-BIOPROMISC
+ ioctl-BIOCIMMEDIATE ;
+
+ M: unix-io <sniffer> ( obj -- sniffer )
+ [
+ [
+ sniffer-spec-path
+ open-read
+ dup close-later
+ ] keep
+ dupd sniffer-spec-ifname ioctl-sniffer-fd
+ dup make-ioctl-buffer
+ input-port <port> <line-reader>
+ \ sniffer construct-delegate
+ ] with-destructors ;
+