server.lisp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. ;;;; server.lisp
  2. (in-package #:server)
  3. (defparameter *web-env* '("no" "content"))
  4. (defparameter *env-log* (make-array '(0) :adjustable t :fill-pointer 0))
  5. (defun request-formatter (env res now)
  6. (declare (ignore now))
  7. (let ((id "stranger"))
  8. (when-let (d (denizenp env))
  9. (setf id (gethash "label" (data:parsed-json d))))
  10. (format nil "~A: ~A - [~A] \"~A ~A ~A\" ~A ~A \"~:[-~;~:*~A~]\" \"~:[-~;~:*~A~]\""
  11. id
  12. (getf env :remote-addr)
  13. (parse-clock (get-universal-time))
  14. (getf env :request-method)
  15. (getf env :request-uri)
  16. (getf env :server-protocol)
  17. (car res)
  18. (lack.util:content-length res)
  19. (getf env :http-referer)
  20. (getf env :http-user-agent))))
  21. (defparameter *app*
  22. (lack:builder
  23. :backtrace
  24. :session
  25. (:accesslog :formatter #'request-formatter)
  26. (:mount "/login"
  27. (lambda (env)
  28. (make-login-page env)))
  29. (:mount "/post" ;;use with postFormButton in /js/forms.js
  30. (lack:builder
  31. (lambda (app)
  32. (lambda (env)
  33. (if (not (eq (getf env :request-method) :post))
  34. '(404 (:content-type "text/plain") ("must be post request type"))
  35. (funcall app env))))
  36. (:mount "/login"
  37. (lambda (env)
  38. (let* ((pars (getf env :body-parameters))
  39. (username (cdr (assoc "username" pars :test 'string=)))
  40. (password (cdr (assoc "password" pars :test 'string=)))
  41. (denizen (data:denizen-with-username username)))
  42. (print username)
  43. (print password)
  44. (cond
  45. ((and denizen (string= (gethash "password" (data:parsed-json denizen))
  46. password))
  47. (with-session (env)
  48. (setf (gethash 'username session) username))
  49. (data:make-login (current-id env)
  50. (current-ip env)
  51. (current-system env)
  52. (get-universal-time))
  53. '(200 (:content-type "text/plain") ("/grid")))
  54. (t '(200 (:content-type "text/plain") ("/login")))))))
  55. (lambda (env)
  56. (declare (ignore env))
  57. '(404 (:content-type "text/plain") ("invalid post type")))))
  58. (:static :path (lambda (p)
  59. (when p
  60. (cond
  61. ((string= (pathname-type p) "js")
  62. (namestring (merge-pathnames (subseq p 1) "/js/"))))))
  63. :root #P"~/quicklisp/local-projects/server/")
  64. (lambda (app)
  65. (lambda (env)
  66. (if (denizenp env)
  67. (funcall app env)
  68. (make-login-page env))))
  69. (:mount "/recordings"
  70. (lambda (env)
  71. (let ((path (subseq (getf env :request-uri) 1)))
  72. (cond ((equal (pathname-type path) "wav")
  73. `(200 (:content-type "audio/wave")
  74. ,(merge-pathnames
  75. path
  76. #P"~/quicklisp/local-projects/server/")))
  77. ((equal (pathname-type path) "aiff")
  78. `(200 (:content-type "audio/aiff")
  79. ,(merge-pathnames
  80. path
  81. #P"~/quicklisp/local-projects/server/")))
  82. ((equal (pathname-type path) "mp3")
  83. `(200 (:content-type "audio/mp3")
  84. ,(merge-pathnames
  85. path
  86. #P"~/quicklisp/local-projects/server/")))
  87. (t`(200 (:content-type "text/plain")
  88. ,(merge-pathnames
  89. path
  90. #P"~/quicklisp/local-projects/server/")))))))
  91. (:mount "/data" *data-app*)
  92. (:mount "/data_server" #'data-server)
  93. (:mount "/logout"
  94. (lambda (env)
  95. (with-session (env)
  96. (when (gethash 'username session)
  97. (remhash 'username session)))
  98. (make-login-page env)))
  99. (:mount "/chat_server" #'chat-server)
  100. (:mount "/music_chat_server" #'music-chat-server)
  101. (:mount "/wheel_world_chat_server" #'wheel-world-chat-server)
  102. (:mount "/jamulus_controls" #'jamulus-controls)
  103. (:mount "/board_game_server" #'board-game-server)
  104. (:mount "/grid"
  105. (lambda (env)
  106. (make-grid-page env)))
  107. (:mount "/"
  108. (lambda (env)
  109. (make-grid-page env)))
  110. (:mount ""
  111. (lambda (env)
  112. (make-grid-page env)))
  113. (lambda (env)
  114. ;; (let ((path-info (getf env :path-info)))
  115. ;; (princ "bad path-info: ")
  116. ;; (princ path-info)
  117. ;; (cond (t '(404 (:content-type "text/plain") ("not found at all anywhere")))))
  118. (make-grid-page env))))
  119. (defparameter *web-server* nil)
  120. (defun serve ()
  121. (when *web-server* (stop))
  122. (setf *web-server* (clack:clackup *app*
  123. :server :woo
  124. :port 8888
  125. :address "0.0.0.0")))
  126. (defun stop () (values (clack:stop *web-server*)))