M bulletin.rkt => bulletin.rkt +8 -6
@@ 186,8 186,8 @@
(define-values (dispatch-route url-generator)
(dispatch-rules
- [("candidates") #:method "get" candidates]
[("register") #:method "post" register ]
+ [("candidates") #:method "get" candidates]
[("peer-count") #:method "get" peer-count]
[("commit") #:method "post" commit ]
[("peers") #:method "get" peers ]
@@ 198,7 198,9 @@
(define/contract (internal-server-error url ex)
(url? any/c . -> . can-be-response?)
- (response/full 400 #"Bad Request" (current-seconds) #f empty empty))
+ (response/jsexpr
+ empty
+ #:code 400))
(define/contract (dispatcher req)
(request? . -> . any)
@@ 213,8 215,8 @@
#:port 1984
#:servlet-regexp #rx""
#:command-line? #t
- ;; #:servlet-responder internal-server-error
- ))
+ ; comment out the following to get client-side tracebacks
+ #:servlet-responder internal-server-error))
(module+ main
(void (thread server))
@@ 259,8 261,8 @@
(string->symbol election)
election)])
(election-set! election))]
- [(? eof-object?)
- (displayln "set what? options are `election'")]
+ [(? eof-object?)
+ (displayln "set what? options are `election'")]
[else (displayln "cannot set that")])]
['open
(if (memq state '(closed registering))
M client.rkt => client.rkt +14 -2
@@ 286,6 286,15 @@
(get bulletin "/candidates")
(void))))
+(define (can-we-register? [bulletin : requester]) : (Values Boolean (Option String))
+ (with-handlers ([exn:fail:network:http:error?
+ (λ ([ex : exn:fail:network:http:error])
+ (if (eqv? (exn:fail:network:http:error-code ex) 400)
+ (values #t #f)
+ (values #f (exn-message ex))))])
+ (post bulletin "/register" #:data (jsexpr->string empty))
+ (values #t #f)))
+
(module+ main
(define point (gen))
@@ 294,8 303,11 @@
(readline "Bulletin host: "))
1984))
- (displayln "waiting for the election to open...")
- (wait-for-open-election bulletin)
+ ; check if we're allowed to register
+ (let-values ([(answer why) (can-we-register? bulletin)])
+ (when (not answer)
+ (displayln (format "Cannot register: ~a" why))
+ (exit)))
(define token
(let ([username (readline "Username: ")]