From 7664f3d20e1704d4d53cb3a10f293366bfb857c7 Mon Sep 17 00:00:00 2001 From: David Florness Date: Sun, 8 Mar 2020 15:37:26 -0600 Subject: [PATCH] Client checks if it can register before trying --- bulletin.rkt | 14 ++++++++------ client.rkt | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/bulletin.rkt b/bulletin.rkt index 3fdcb83..6cecfcc 100644 --- a/bulletin.rkt +++ b/bulletin.rkt @@ -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)) diff --git a/client.rkt b/client.rkt index 0578a9f..9ad7cbc 100644 --- a/client.rkt +++ b/client.rkt @@ -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: ")] -- 2.38.4