#lang scheme/base
(require net/url
scheme/contract
web-server/configuration/namespace
web-server/dispatchers/dispatch
(prefix-in file: web-server/dispatchers/dispatch-files)
(prefix-in sequencer: web-server/dispatchers/dispatch-sequencer)
(prefix-in servlet: web-server/dispatchers/dispatch-servlets)
web-server/dispatchers/filesystem-map
web-server/http
web-server/private/cache-table
web-server/private/mime-types
web-server/servlet/setup)
(define (make-instaweb-dispatcher dispatch-app
#:htdocs-paths htdocs-paths
#:mime-types-path mime-types-path)
(define (htdocs-url->path path)
(make-url->path (path->complete-path path)))
(define dispatch-htdocs
(apply sequencer:make
(map (lambda (path)
(file:make #:url->path (htdocs-url->path path)
#:path->mime-type (make-path->mime-type (path->complete-path mime-types-path))))
htdocs-paths)))
(sequencer:make dispatch-htdocs dispatch-app))
(define (make-application-dispatcher #:servlet-path servlet-path
#:servlet-namespace servlet-namespace
#:servlet-exn-handler servlet-exn-handler)
(define make-servlet-namespace
(make-make-servlet-namespace #:to-be-copied-module-specs servlet-namespace))
(define-values (clear-cache! url->servlet)
(servlet:make-cached-url->servlet
(lambda (url)
(values servlet-path null))
(make-default-path->servlet #:make-servlet-namespace make-servlet-namespace)))
(define servlet-url->path
(let ([path (path->complete-path servlet-path)])
(lambda (url)
(values path null))))
(servlet:make url->servlet #:responders-servlet servlet-exn-handler))
(provide/contract
[make-instaweb-dispatcher (-> dispatcher/c
#:htdocs-paths (listof (or/c path? string?))
#:mime-types-path path?
dispatcher/c)]
[make-application-dispatcher (-> #:servlet-path (and/c path? absolute-path?)
#:servlet-namespace list?
#:servlet-exn-handler (-> url? exn? response?)
dispatcher/c)])