racket/collects/web-server/web-server-unit.rkt
2010-05-17 11:05:22 -05:00

107 lines
5.1 KiB
Racket

#lang racket/base
(require net/tcp-sig
racket/unit)
(require web-server/web-server-sig
web-server/web-config-sig
web-server/private/dispatch-server-unit
web-server/private/dispatch-server-sig
web-server/private/web-server-structs
web-server/private/mime-types
web-server/configuration/configuration-table-structs
web-server/private/cache-table
(prefix-in http: web-server/http/request))
(require web-server/dispatchers/dispatch
web-server/servlet/setup
(prefix-in fsmap: web-server/dispatchers/filesystem-map)
(prefix-in sequencer: web-server/dispatchers/dispatch-sequencer)
(prefix-in timeout: web-server/dispatchers/dispatch-timeout)
(prefix-in passwords: web-server/dispatchers/dispatch-passwords)
(prefix-in files: web-server/dispatchers/dispatch-files)
(prefix-in servlets: web-server/dispatchers/dispatch-servlets)
(prefix-in path-procedure: web-server/dispatchers/dispatch-pathprocedure)
(prefix-in log: web-server/dispatchers/dispatch-log)
(prefix-in host: web-server/dispatchers/dispatch-host)
(prefix-in filter: web-server/dispatchers/dispatch-filter)
(prefix-in lift: web-server/dispatchers/dispatch-lift))
(provide web-server@)
(define-unit web-config@->dispatch-server-config@
(import (prefix config: web-config^))
(export dispatch-server-config^)
(init-depend web-config^)
(define read-request http:read-request)
(define port config:port)
(define listen-ip config:listen-ip)
(define max-waiting config:max-waiting)
(define initial-connection-timeout config:initial-connection-timeout)
;; dispatch : connection request -> void
(define dispatch-cache (make-cache-table))
(define dispatch
(host:make
(lambda (host)
(cache-table-lookup!
dispatch-cache host
(lambda ()
(parameterize ([current-custodian (current-server-custodian)])
(host-info->dispatcher
(config:virtual-hosts (symbol->string host)))))))))
;; host-info->dispatcher : host-info -> conn request -> void
(define (host-info->dispatcher host-info)
(sequencer:make
(timeout:make initial-connection-timeout)
(if (and (host-log-format host-info)
(host-log-path host-info))
(log:make #:format (log:log-format->format (host-log-format host-info))
#:log-path (host-log-path host-info))
(lambda (conn req) (next-dispatcher)))
(if (host-passwords host-info)
(let-values ([(update-password-cache! password-check)
(passwords:password-file->authorized? (host-passwords host-info))])
(sequencer:make
(timeout:make (timeouts-password (host-timeouts host-info)))
(passwords:make
(passwords:make-basic-denied?/path
password-check)
#:authentication-responder (responders-authentication (host-responders host-info)))
(path-procedure:make "/conf/refresh-passwords"
(lambda _
(update-password-cache!)
((responders-passwords-refreshed (host-responders host-info)))))))
(lambda (conn req) (next-dispatcher)))
(path-procedure:make "/conf/collect-garbage"
(lambda _
(collect-garbage)
((responders-collect-garbage (host-responders host-info)))))
(let-values ([(clear-cache! url->servlet)
(servlets:make-cached-url->servlet
(fsmap:filter-url->path
#rx"\\.(ss|scm|rkt|rktd)$"
(fsmap:make-url->valid-path
(fsmap:make-url->path (paths-servlet (host-paths host-info)))))
(make-default-path->servlet
#:make-servlet-namespace config:make-servlet-namespace
#:timeouts-default-servlet (timeouts-default-servlet (host-timeouts host-info))))])
(sequencer:make
(path-procedure:make "/conf/refresh-servlets"
(lambda _
(clear-cache!)
((responders-servlets-refreshed (host-responders host-info)))))
(sequencer:make
(timeout:make (timeouts-servlet-connection (host-timeouts host-info)))
(servlets:make url->servlet
#:responders-servlet-loading (responders-servlet-loading (host-responders host-info))
#:responders-servlet (responders-servlet (host-responders host-info))))))
(files:make #:url->path (fsmap:make-url->path (paths-htdocs (host-paths host-info)))
#:path->mime-type (make-path->mime-type (paths-mime-types (host-paths host-info)))
#:indices (host-indices host-info))
(lift:make (responders-file-not-found (host-responders host-info))))))
(define-compound-unit/infer web-server@
(import tcp^ web-config^)
(export web-server^)
(link web-config@->dispatch-server-config@ dispatch-server@))