Skip to content

Commit b265e13

Browse files
committed
Add a new `extra-dispatcher-file' configuration option.
This allows handling other requests to implement additional course-related functionality by the already running server (instead of adding more servers for whatever's needed). The documentation needs more work though: it refers to `dispatcher/c' which needs to be added, and there is no real sample code for it. (My use is too specific to be used.)
1 parent ac08937 commit b265e13

File tree

5 files changed

+44
-10
lines changed

5 files changed

+44
-10
lines changed

handin-server/private/config.rkt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
[(port-number) (values 7979 id )]
8080
[(use-https) (values #t id )]
8181
[(hook-file) (values #f path/false )]
82+
[(extra-dispatcher-file) (values #f path/false )]
8283
[(session-timeout) (values 300 id )]
8384
[(session-memory-limit) (values 40000000 id )]
8485
[(default-file-name) (values "handin.rkt" id )]

handin-server/private/hooker.rkt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22

33
(require "config.rkt" "logger.rkt" "reloadable.rkt")
44

5-
(provide hook)
5+
(provide hook extra-dispatcher)
66

77
(define hook-file #f)
88
(define hook-proc #f)
9-
109
(define (hook what alist)
1110
(let ([file (get-conf 'hook-file)])
1211
(when file
@@ -15,3 +14,15 @@
1514
(set! hook-proc (auto-reload-procedure `(file ,(path->string file))
1615
'hook)))
1716
(hook-proc what (current-session) alist))))
17+
18+
(define dispatcher-file #f)
19+
(define dispatcher-proc #f)
20+
(define ((extra-dispatcher otherwise) connection request)
21+
(let ([file (get-conf 'extra-dispatcher-file)])
22+
(cond [(not file) (otherwise)]
23+
[else (unless (equal? file dispatcher-file)
24+
(set! dispatcher-file file)
25+
(set! dispatcher-proc
26+
(auto-reload-procedure `(file ,(path->string file))
27+
'dispatcher)))
28+
(dispatcher-proc connection request)])))

handin-server/run-servlet.rkt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
web-server/managers/lru
1414
(prefix-in sequencer: web-server/dispatchers/dispatch-sequencer)
1515
(prefix-in log: web-server/dispatchers/dispatch-log)
16+
web-server/dispatchers/dispatch
1617
web-server/http/request-structs
1718
net/url
1819
openssl
@@ -67,6 +68,7 @@
6768

6869
(provide run-servlet)
6970
(define (run-servlet dispatcher
71+
#:extra-dispatcher [extra-dispatcher #f]
7072
#:log-file [log-file #f])
7173
;; a channel for incoming requests
7274
(define ach (make-async-channel))
@@ -93,6 +95,7 @@
9395
(wrap-sequence
9496
(and log-file (log:make #:format (log:log-format->format 'apache-default)
9597
#:log-path log-file))
98+
(and extra-dispatcher (extra-dispatcher next-dispatcher))
9699
(let ([init-path (make-parameter "/")])
97100
(dispatch/servlet
98101
(lambda (req)

handin-server/scribblings/server-setup.scrbl

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ This directory contains the following files and sub-directories:
164164
@filepath{users.rktd} file and fill in such information. (The third
165165
element for such descriptors is ignored.)}
166166

167-
@item{@indexed-racket[hook-file] --- a path (relative to handin
167+
@item{@indexed-racket[hook-file] --- a path (relative to the handin
168168
server directory or absolute) that specifies a filename that
169169
contains a `hook' module. This is useful as a general device for
170170
customizing the server through Racket code. The file is expected
@@ -211,11 +211,29 @@ This directory contains the following files and sub-directories:
211211
'("[email protected]") '() '()
212212
(map (lambda (key+val)
213213
(apply format "~a: ~s" key+val))
214-
alist))))]}}]
215-
214+
alist))))]}}
215+
216+
@item{@indexed-racket[extra-dispatcher-file] --- a path (relative to
217+
the handin server directory or absolute) that specifies a filename
218+
that contains a `dispatcher' module. When specified, this file will
219+
be loaded, and it is expected to provide a @racket[dispatcher]
220+
function, which can be used by the web server, i.e., one that
221+
satisfies @racket[dispatcher/c]. This dispatcher will get used in
222+
the embedded handin server, before the handin servlet. It can
223+
therefore be used to handle additional servlets that implement
224+
additional functionality. Here is a sample skeleton:
225+
226+
@racketmod[
227+
racket/base
228+
(require web-server/http web-server/servlet-dispatch)
229+
(provide dispatcher)
230+
(define (start req)
231+
;; implement the "foo" operation
232+
....)
233+
(define dispatcher (dispatch/servlet start #:regexp #rx"^/foo"))]}]
216234

217235
The @secref{grading-utils} uses the following keys:
218-
236+
219237
@itemlist[
220238

221239
@item{@indexed-racket[deadline]: sets a per-assignment deadline for submissions,

handin-server/web-status-server.rkt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
web-server/servlet
1010
web-server/compat/0/coerce
1111
web-server/compat/0/http/response-structs
12-
handin-server/private/md5
13-
handin-server/private/logger
14-
handin-server/private/config
15-
handin-server/private/hooker
12+
"private/md5.rkt"
13+
"private/logger.rkt"
14+
"private/config.rkt"
15+
"private/hooker.rkt"
1616
"run-servlet.rkt")
1717

1818
(define (aget alist key)
@@ -343,6 +343,7 @@
343343
(begin0 (parameterize ([error-print-context-length 0])
344344
(run-servlet
345345
dispatcher
346+
#:extra-dispatcher extra-dispatcher
346347
#:log-file (get-conf 'web-log-file)))
347348
(log-line "*** embedded web server started"))
348349
;; simple "server" so it's known that there is no server

0 commit comments

Comments
 (0)