up
svn: r13466
This commit is contained in:
parent
d9270d39f2
commit
5d3a76489f
|
@ -7,6 +7,7 @@
|
||||||
web-server/http
|
web-server/http
|
||||||
web-server/managers/lru
|
web-server/managers/lru
|
||||||
web-server/private/util
|
web-server/private/util
|
||||||
|
web-server/dispatchers/dispatch
|
||||||
web-server/configuration/configuration-table
|
web-server/configuration/configuration-table
|
||||||
web-server/configuration/responders
|
web-server/configuration/responders
|
||||||
web-server/dispatchers/dispatch-log
|
web-server/dispatchers/dispatch-log
|
||||||
|
@ -157,4 +158,27 @@ If you want to use @scheme[serve/servlet] in a start up script for a Web server,
|
||||||
are those allowed by @scheme[log-format->format].
|
are those allowed by @scheme[log-format->format].
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@defproc[(dispatch/servlet
|
||||||
|
[start (request? . -> . response/c)]
|
||||||
|
[#:regexp regexp regexp? #rx""]
|
||||||
|
[#:stateless? stateless? boolean? #f]
|
||||||
|
[#:manager manager manager? (make-threshold-LRU-manager #f (* 1024 1024 64))]
|
||||||
|
[#:namespace namespace (listof module-path?) empty]
|
||||||
|
[#:current-directory servlet-current-directory path-string? (current-directory)])
|
||||||
|
dispatcher/c]{
|
||||||
|
@scheme[serve/servlet] starts a server and uses a particular dispatching sequence. For some applications, this
|
||||||
|
nails down too much, but users are conflicted, because the interface is so convenient. For those users, @scheme[dispatch/servlet]
|
||||||
|
does the hardest part of @scheme[serve/servlet] and constructs a dispatcher just for the @scheme[start] servlet.
|
||||||
|
|
||||||
|
The dispatcher responds to requests that match @scheme[regexp]. The current directory
|
||||||
|
of servlet execution is @scheme[servlet-current-directory].
|
||||||
|
|
||||||
|
If @scheme[stateless?] is true, then the servlet is run as a stateless @schememodname[web-server] module.
|
||||||
|
|
||||||
|
The servlet is loaded with @scheme[manager] as its continuation manager. (The default manager limits the amount of memory to 64 MB and
|
||||||
|
deals with memory pressure as discussed in the @scheme[make-threshold-LRU-manager] documentation.)
|
||||||
|
|
||||||
|
The modules specified by @scheme[servlet-namespace] are shared with other servlets.
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
web-server/configuration/responders
|
web-server/configuration/responders
|
||||||
web-server/private/mime-types
|
web-server/private/mime-types
|
||||||
web-server/servlet/setup
|
web-server/servlet/setup
|
||||||
|
web-server/dispatchers/dispatch
|
||||||
(prefix-in lift: web-server/dispatchers/dispatch-lift)
|
(prefix-in lift: web-server/dispatchers/dispatch-lift)
|
||||||
(prefix-in fsmap: web-server/dispatchers/filesystem-map)
|
(prefix-in fsmap: web-server/dispatchers/filesystem-map)
|
||||||
(prefix-in sequencer: web-server/dispatchers/dispatch-sequencer)
|
(prefix-in sequencer: web-server/dispatchers/dispatch-sequencer)
|
||||||
|
@ -42,6 +43,14 @@
|
||||||
"web-server/default-web-root"))
|
"web-server/default-web-root"))
|
||||||
|
|
||||||
(provide/contract
|
(provide/contract
|
||||||
|
[dispatch/servlet (((request? . -> . response/c))
|
||||||
|
(#:regexp regexp?
|
||||||
|
#:current-directory path-string?
|
||||||
|
#:namespace (listof module-path?)
|
||||||
|
#:stateless? boolean?
|
||||||
|
#:manager manager?)
|
||||||
|
. ->* .
|
||||||
|
dispatcher/c)]
|
||||||
[serve/servlet (((request? . -> . response/c))
|
[serve/servlet (((request? . -> . response/c))
|
||||||
(#:command-line? boolean?
|
(#:command-line? boolean?
|
||||||
#:launch-browser? boolean?
|
#:launch-browser? boolean?
|
||||||
|
@ -74,6 +83,43 @@
|
||||||
[(list? (car ds)) (loop (append (car ds) (cdr ds)) r)]
|
[(list? (car ds)) (loop (append (car ds) (cdr ds)) r)]
|
||||||
[else (loop (cdr ds) (cons (car ds) r))])))
|
[else (loop (cdr ds) (cons (car ds) r))])))
|
||||||
|
|
||||||
|
(define (dispatch/servlet
|
||||||
|
start
|
||||||
|
#:regexp
|
||||||
|
[servlet-regexp #rx""]
|
||||||
|
#:current-directory
|
||||||
|
[servlet-current-directory (current-directory)]
|
||||||
|
#:namespace
|
||||||
|
[servlet-namespace empty]
|
||||||
|
#:stateless?
|
||||||
|
[stateless? #f]
|
||||||
|
#:manager
|
||||||
|
[manager
|
||||||
|
(make-threshold-LRU-manager
|
||||||
|
(lambda (request)
|
||||||
|
`(html (head (title "Page Has Expired."))
|
||||||
|
(body (p "Sorry, this page has expired. Please go back."))))
|
||||||
|
(* 64 1024 1024))])
|
||||||
|
(define servlet-box (box #f))
|
||||||
|
(define make-servlet-namespace
|
||||||
|
(make-make-servlet-namespace #:to-be-copied-module-specs servlet-namespace))
|
||||||
|
(filter:make
|
||||||
|
servlet-regexp
|
||||||
|
(servlets:make
|
||||||
|
(lambda (url)
|
||||||
|
(or (unbox servlet-box)
|
||||||
|
(let ([servlet
|
||||||
|
(parameterize ([current-custodian (make-custodian)]
|
||||||
|
[current-namespace
|
||||||
|
(make-servlet-namespace
|
||||||
|
#:additional-specs
|
||||||
|
default-module-specs)])
|
||||||
|
(if stateless?
|
||||||
|
(make-stateless.servlet servlet-current-directory start)
|
||||||
|
(make-v2.servlet servlet-current-directory manager start)))])
|
||||||
|
(set-box! servlet-box servlet)
|
||||||
|
servlet))))))
|
||||||
|
|
||||||
(define (serve/servlet
|
(define (serve/servlet
|
||||||
start
|
start
|
||||||
#:command-line?
|
#:command-line?
|
||||||
|
@ -140,28 +186,18 @@
|
||||||
(define make-servlet-namespace
|
(define make-servlet-namespace
|
||||||
(make-make-servlet-namespace #:to-be-copied-module-specs servlet-namespace))
|
(make-make-servlet-namespace #:to-be-copied-module-specs servlet-namespace))
|
||||||
(define sema (make-semaphore 0))
|
(define sema (make-semaphore 0))
|
||||||
(define servlet-box (box #f))
|
|
||||||
(define dispatcher
|
(define dispatcher
|
||||||
(dispatcher-sequence
|
(dispatcher-sequence
|
||||||
(and log-file (log:make #:format (log:log-format->format log-format)
|
(and log-file (log:make #:format (log:log-format->format log-format)
|
||||||
#:log-path log-file))
|
#:log-path log-file))
|
||||||
(and quit? (filter:make #rx"^/quit$" (quit-server sema)))
|
(and quit? (filter:make #rx"^/quit$" (quit-server sema)))
|
||||||
(filter:make
|
(dispatch/servlet
|
||||||
servlet-regexp
|
start
|
||||||
(servlets:make
|
#:regexp servlet-regexp
|
||||||
(lambda (url)
|
#:namespace servlet-namespace
|
||||||
(or (unbox servlet-box)
|
#:stateless? stateless?
|
||||||
(let ([servlet
|
#:current-directory servlet-current-directory
|
||||||
(parameterize ([current-custodian (make-custodian)]
|
#:manager manager)
|
||||||
[current-namespace
|
|
||||||
(make-servlet-namespace
|
|
||||||
#:additional-specs
|
|
||||||
default-module-specs)])
|
|
||||||
(if stateless?
|
|
||||||
(make-stateless.servlet servlet-current-directory start)
|
|
||||||
(make-v2.servlet servlet-current-directory manager start)))])
|
|
||||||
(set-box! servlet-box servlet)
|
|
||||||
servlet)))))
|
|
||||||
(let-values ([(clear-cache! url->servlet)
|
(let-values ([(clear-cache! url->servlet)
|
||||||
(servlets:make-cached-url->servlet
|
(servlets:make-cached-url->servlet
|
||||||
(fsmap:filter-url->path
|
(fsmap:filter-url->path
|
||||||
|
|
Loading…
Reference in New Issue
Block a user