start-kawa-server.scm 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. (import
  2. (class java.io IOException OutputStream FilterInputStream)
  3. (class java.net InetSocketAddress)
  4. (class com.sun.net.httpserver HttpExchange HttpHandler HttpServer)
  5. (macduffie sxml)
  6. (macduffie json))
  7. (include "./canvas.js")
  8. (include "./web-server.scm")
  9. (define default-port 43334)
  10. (define (main args)
  11. (define current-port
  12. (if (null? (cdr args))
  13. default-port
  14. (string->number (cadr args))))
  15. (define server ::HttpServer (HttpServer:create (InetSocketAddress current-port) 0))
  16. (server:createContext "/api/NewId" (NewIdHandler))
  17. (server:createContext "/api/PushBuffer" (PushBufferHandler))
  18. (server:createContext "/api/PushBulkBuffer" (PushBulkBufferHandler))
  19. (server:createContext "/api/PullBuffer" (PullBufferHandler))
  20. (server:createContext "/api/ClearBuffer" (ClearBufferHandler))
  21. (server:createContext "/index.html" (FrontendHandler))
  22. (server:createContext "/" (FrontendHandler))
  23. (server:createContext "/draw.js" (ScriptingHandler))
  24. (server:setExecutor #!null)
  25. (server:start))
  26. (define (filter-input-stream->string fis ::FilterInputStream sz ::int)
  27. (define b ::byte[] (byte[] length: sz))
  28. (fis:read b)
  29. (String b))
  30. (define not-found ::String "404NOTFOUND")
  31. (define (make-handler content-type ::String body-proc)
  32. (define-class result (HttpHandler)
  33. ((handle (t ::HttpExchange))
  34. ((t:getResponseHeaders):set "Content-Type" content-type)
  35. (let ()
  36. (define os ::OutputStream #!null)
  37. (define request-method (t:getRequestMethod))
  38. (define request-headers (t:getRequestHeaders))
  39. (define request-body (t:getRequestBody))
  40. (define body ::String (body-proc request-method request-headers request-body))
  41. (define response ::byte[] (body:getBytes))
  42. (cond
  43. ((string=? body not-found)
  44. (set! body "")
  45. (set! response (body:getBytes))
  46. (t:sendResponseHeaders 404 0))
  47. (else
  48. (t:sendResponseHeaders 200 response:length)))
  49. (set! os (t:getResponseBody))
  50. (os:write response)
  51. (os:close))))
  52. result)
  53. (define NewIdHandler (make-handler "application/json; charset=UTF-8" (lambda (method headers body)
  54. (if (string=? method "POST")
  55. (api-new-id!)
  56. not-found))))
  57. (define PushBufferHandler (make-handler "application/json; charset=UTF-8" (lambda (method headers body)
  58. (if (string=? method "POST")
  59. (api-push-buffer! (filter-input-stream->string body 1000))
  60. not-found))))
  61. (define PushBulkBufferHandler (make-handler "application/json; charset=UTF-8" (lambda (method headers body)
  62. (if (string=? method "POST")
  63. (api-push-bulk-buffer! (filter-input-stream->string body 100000000))
  64. not-found))))
  65. (define PullBufferHandler (make-handler "application/json; charset=UTF-8" (lambda (method headers body)
  66. (if (string=? method "POST")
  67. (json-write-string (api-pull-buffer! (filter-input-stream->string body 1000)))
  68. not-found))))
  69. (define ClearBufferHandler (make-handler "application/json; charset=UTF-8" (lambda (method headers body)
  70. (if (string=? method "POST")
  71. (api-clear-buffer!)
  72. not-found))))
  73. (define FrontendHandler (make-handler "text/html; charset=UTF-8" (lambda (method headers body) (sxml->xml index-page))))
  74. (define ScriptingHandler (make-handler "application/javascript; charset=UTF-8" (lambda (method headers body) script-page)))
  75. (main (command-line))