51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2008 Slava Pestov.
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: kernel namespaces sequences assocs accessors splitting
 | 
						|
unicode.case urls http http.server http.server.responses ;
 | 
						|
IN: http.server.dispatchers
 | 
						|
 | 
						|
TUPLE: dispatcher default responders ;
 | 
						|
 | 
						|
: new-dispatcher ( class -- dispatcher )
 | 
						|
    new
 | 
						|
        <404> <trivial-responder> >>default
 | 
						|
        H{ } clone >>responders ; inline
 | 
						|
 | 
						|
: <dispatcher> ( -- dispatcher )
 | 
						|
    dispatcher new-dispatcher ;
 | 
						|
 | 
						|
: find-responder ( path dispatcher -- path responder )
 | 
						|
    over empty? [
 | 
						|
        "" over responders>> at*
 | 
						|
        [ nip ] [ drop default>> ] if
 | 
						|
    ] [
 | 
						|
        over first over responders>> at*
 | 
						|
        [ [ drop rest-slice ] dip ] [ drop default>> ] if
 | 
						|
    ] if ;
 | 
						|
 | 
						|
M: dispatcher call-responder* ( path dispatcher -- response )
 | 
						|
    find-responder call-responder ;
 | 
						|
 | 
						|
TUPLE: vhost-dispatcher default responders ;
 | 
						|
 | 
						|
: <vhost-dispatcher> ( -- dispatcher )
 | 
						|
    vhost-dispatcher new-dispatcher ;
 | 
						|
 | 
						|
: canonical-host ( host -- host' )
 | 
						|
    >lower "www." ?head drop "." ?tail drop ;
 | 
						|
 | 
						|
: find-vhost ( dispatcher -- responder )
 | 
						|
    url get host>> canonical-host over responders>> at*
 | 
						|
    [ nip ] [ drop default>> ] if ;
 | 
						|
 | 
						|
M: vhost-dispatcher call-responder* ( path dispatcher -- response )
 | 
						|
    find-vhost call-responder ;
 | 
						|
 | 
						|
: add-responder ( dispatcher responder path -- dispatcher )
 | 
						|
    pick responders>> set-at ;
 | 
						|
 | 
						|
: add-main-responder ( dispatcher responder path -- dispatcher )
 | 
						|
    [ add-responder drop ]
 | 
						|
    [ drop "" add-responder drop ]
 | 
						|
    [ 2drop ] 3tri ;
 |