hello_world.rb 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # frozen_string_literal: true
  2. # Our Rack application to be executed by rackup
  3. class HelloWorld
  4. DEFAULT_HEADERS = {}.tap do |h|
  5. h[SERVER_HEADER] = SERVER_STRING if SERVER_STRING
  6. h.freeze
  7. end
  8. def bounded_queries(env)
  9. params = Rack::Utils.parse_query(env['QUERY_STRING'])
  10. queries = params['queries'].to_i
  11. queries.clamp(QUERIES_MIN, QUERIES_MAX)
  12. end
  13. # Return a random number between 1 and MAX_PK
  14. def rand1
  15. rand(MAX_PK).succ
  16. end
  17. WORLD_BY_ID = World.naked.where(:id=>:$id).prepare(:first, :world_by_id)
  18. WORLD_UPDATE = World.where(:id=>:$id).prepare(:update, :world_update, :randomnumber=>:$randomnumber)
  19. def db
  20. WORLD_BY_ID.(:id=>rand1)
  21. end
  22. def queries(env)
  23. DB.synchronize do
  24. ALL_IDS.sample(bounded_queries(env)).map do |id|
  25. WORLD_BY_ID.(id: id)
  26. end
  27. end
  28. end
  29. def fortunes
  30. fortunes = Fortune.all
  31. fortunes << Fortune.new(
  32. :id=>0,
  33. :message=>'Additional fortune added at request time.'
  34. )
  35. fortunes.sort_by!(&:message)
  36. html = String.new(<<~'HTML')
  37. <!DOCTYPE html>
  38. <html>
  39. <head>
  40. <title>Fortunes</title>
  41. </head>
  42. <body>
  43. <table>
  44. <tr>
  45. <th>id</th>
  46. <th>message</th>
  47. </tr>
  48. HTML
  49. fortunes.each do |fortune|
  50. html << <<~"HTML"
  51. <tr>
  52. <td>#{fortune.id}</td>
  53. <td>#{Rack::Utils.escape_html(fortune.message)}</td>
  54. </tr>
  55. HTML
  56. end
  57. html << <<~'HTML'
  58. </table>
  59. </body>
  60. </html>
  61. HTML
  62. end
  63. def updates(env)
  64. DB.synchronize do
  65. ALL_IDS.sample(bounded_queries(env)).map do |id|
  66. world = WORLD_BY_ID.(id: id)
  67. WORLD_UPDATE.(id: world[:id], randomnumber: (world[:randomnumber] = rand1))
  68. world
  69. end
  70. end
  71. end
  72. def call(env)
  73. content_type, *body =
  74. case env['PATH_INFO']
  75. when '/json'
  76. # Test type 1: JSON serialization
  77. [JSON_TYPE, JSON.fast_generate(:message=>'Hello, World!')]
  78. when '/db'
  79. # Test type 2: Single database query
  80. [JSON_TYPE, JSON.fast_generate(db)]
  81. when '/queries'
  82. # Test type 3: Multiple database queries
  83. [JSON_TYPE, JSON.fast_generate(queries(env))]
  84. when '/fortunes'
  85. # Test type 4: Fortunes
  86. [HTML_TYPE, fortunes]
  87. when '/updates'
  88. # Test type 5: Database updates
  89. [JSON_TYPE, JSON.fast_generate(updates(env))]
  90. when '/plaintext'
  91. # Test type 6: Plaintext
  92. [PLAINTEXT_TYPE, 'Hello, World!']
  93. end
  94. [
  95. 200,
  96. DEFAULT_HEADERS.merge(
  97. CONTENT_TYPE => content_type,
  98. DATE_HEADER => Time.now.httpdate
  99. ),
  100. body
  101. ]
  102. end
  103. end