~edwargix/tallyard

7664f3d20e1704d4d53cb3a10f293366bfb857c7 — David Florness 5 years ago c464397
Client checks if it can register before trying
2 files changed, 22 insertions(+), 8 deletions(-)

M bulletin.rkt
M client.rkt
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: ")]