server.cr 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. require "http/server"
  2. require "json"
  3. require "pg"
  4. require "ecr"
  5. APPDB = DB.open("postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world?initial_pool_size=256&max_pool_size=256&max_idle_pool_size=256")
  6. ID_MAXIMUM = 10_000
  7. server = HTTP::Server.new do |context|
  8. response = context.response
  9. request = context.request
  10. response.headers["Server"] = "Crystal"
  11. response.headers["Date"] = HTTP.format_time(Time.now)
  12. case request.path
  13. when "/json"
  14. response.status_code = 200
  15. response.headers["Content-Type"] = "application/json"
  16. {message: "Hello, World!"}.to_json(response)
  17. when "/plaintext"
  18. response.status_code = 200
  19. response.headers["Content-Type"] = "text/plain"
  20. response.print "Hello, World!"
  21. when "/db"
  22. response.status_code = 200
  23. response.headers["Content-Type"] = "application/json"
  24. random_world.to_json(response)
  25. when "/queries"
  26. response.status_code = 200
  27. response.headers["Content-Type"] = "application/json"
  28. JSON.build(response) do |json|
  29. json.array do
  30. sanitized_query_count(request).times do
  31. random_world.to_json(json)
  32. end
  33. end
  34. end
  35. when "/fortunes"
  36. response.status_code = 200
  37. response.headers["Content-Type"] = "text/html; charset=UTF-8"
  38. data = fortunes
  39. additional_fortune = {
  40. id: 0,
  41. message: "Additional fortune added at request time.",
  42. }
  43. data.push(additional_fortune)
  44. data.sort! { |f1, f2| f1[:message] <=> f2[:message] }
  45. ECR.embed "views/fortunes.ecr", response
  46. when "/updates"
  47. response.status_code = 200
  48. response.headers["Content-Type"] = "application/json"
  49. JSON.build(response) do |json|
  50. json.array do
  51. sanitized_query_count(request).times do
  52. world = set_world({id: random_world[:id], randomNumber: rand(1..ID_MAXIMUM)})
  53. world.to_json(json)
  54. end
  55. end
  56. end
  57. else
  58. response.status_code = 404
  59. end
  60. end
  61. private def random_world
  62. id = rand(1..ID_MAXIMUM)
  63. random_number = APPDB.query_one("SELECT randomNumber FROM world WHERE id = $1", id, as: Int32)
  64. {id: id, randomNumber: random_number}
  65. end
  66. private def set_world(world)
  67. APPDB.exec("UPDATE world SET randomNumber = $1 WHERE id = $2", world[:randomNumber], world[:id])
  68. world
  69. end
  70. private def fortunes
  71. data = Array(NamedTuple(id: Int32, message: String)).new
  72. APPDB.query_each("SELECT id, message FROM Fortune") do |rs|
  73. data.push({id: rs.read(Int32), message: rs.read(String)})
  74. end
  75. data
  76. end
  77. private def sanitized_query_count(request)
  78. queries = request.query_params["queries"].as(String)
  79. queries = queries.to_i? || 1
  80. queries.clamp(1..500)
  81. end
  82. server.listen("0.0.0.0", 8080, reuse_port: true)