diff --git a/pollen/private/command.rkt b/pollen/private/command.rkt index db82168..2cb1db9 100644 --- a/pollen/private/command.rkt +++ b/pollen/private/command.rkt @@ -175,21 +175,23 @@ version print the version" (current-server-port) (make-publish-di (define (handle-start) (define launch-wanted #f) (define localhost-wanted #f) - (define clargs - (command-line #:program "raco pollen start" - #:argv (vector-drop (current-command-line-arguments) 1) ; snip the 'start' from the front - #:once-each - [("--launch" "-l") "Launch browser after start" (set! launch-wanted #t)] - [("--local") "Restrict access to localhost" (set! localhost-wanted #t)] - #:args other-args - other-args)) - (define dir (path->directory-path (get-first-arg-or-current-dir clargs))) - (unless (directory-exists? dir) - (error (format "~a is not a directory" dir))) - (define http-port (with-handlers ([exn:fail? (λ (e) #f)]) - (string->number (cadr clargs)))) - (when (and http-port (not (exact-positive-integer? http-port))) - (error (format "~a is not a valid port number" http-port))) + (define-values (dir http-port) + (command-line + #:program "raco pollen start" + #:argv (vector-drop (current-command-line-arguments) 1) ; snip the 'start' from the front + #:once-each + [("--launch" "-l") "Launch browser after start" (set! launch-wanted #t)] + [("--local") "Restrict access to localhost" (set! localhost-wanted #t)] + #:args ([dir (current-directory)] [port "8080"]) + (define parsed-dir + (path->directory-path (normalize-path (very-nice-path dir)))) + (unless (directory-exists? parsed-dir) + (error (format "~a is not a directory" parsed-dir))) + + (define parsed-port (string->number port)) + (when (and parsed-port (not (exact-positive-integer? parsed-port))) + (error (format "~a is not a valid port number" parsed-port))) + (values parsed-dir parsed-port))) (parameterize ([current-project-root dir] [current-server-port (or http-port (setup:project-server-port))] [current-server-listen-ip (and localhost-wanted "127.0.0.1")] diff --git a/pollen/private/project-server.rkt b/pollen/private/project-server.rkt index 0a140f6..e649611 100755 --- a/pollen/private/project-server.rkt +++ b/pollen/private/project-server.rkt @@ -1,5 +1,6 @@ #lang racket/base -(require racket/runtime-path +(require racket/async-channel + racket/runtime-path web-server/dispatch web-server/web-server web-server/servlet-dispatch @@ -49,11 +50,11 @@ [("127.0.0.1") "localhost"] [else clsi])) "project server permitting access to all clients"))) - (message "ready to rock") - + (define ch (make-async-channel)) (define stop-func (parameterize ([error-print-width 1000]) (serve + #:confirmation-channel ch #:dispatch (sequencer:make (dispatch/servlet pollen-servlet) (make-static-dispatcher-sequence @@ -62,9 +63,16 @@ (dispatch/servlet route-404)) #:listen-ip (current-server-listen-ip) #:port (current-server-port)))) + (define exn-or-port + (sync ch)) + (when (exn? exn-or-port) + (message "project server failed to start") + (sync (system-idle-evt)) + (exit 1)) + (message "ready to rock") (when open-browser-window? (send-url (string-append server-name servlet-path))) (if return? stop-func (with-handlers ([exn:break? (λ (e) (stop-func) (message "project server stopped"))]) - (do-not-return)))) \ No newline at end of file + (do-not-return))))