hello_world.rb 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # frozen_string_literal: true
  2. # Our Rack application to be executed by rackup
  3. class HelloWorld < Sinatra::Base
  4. configure do
  5. # Static file serving is ostensibly disabled in modular mode but Sinatra
  6. # still calls an expensive Proc on every request...
  7. disable :static
  8. # XSS, CSRF, IP spoofing, etc. protection are not explicitly required
  9. disable :protection
  10. # Only add the charset parameter to specific content types per the requirements
  11. set :add_charset, [mime_type(:html)]
  12. end
  13. helpers do
  14. def bounded_queries
  15. queries = params[:queries].to_i
  16. queries.clamp(QUERIES_MIN, QUERIES_MAX)
  17. end
  18. def json(data)
  19. content_type :json
  20. JSON.fast_generate(data)
  21. end
  22. # Return a random number between 1 and MAX_PK
  23. def rand1
  24. rand(MAX_PK).succ
  25. end
  26. end
  27. after do
  28. response['Date'] = Time.now.httpdate
  29. end
  30. after do
  31. response['Server'] = SERVER_STRING
  32. end if SERVER_STRING
  33. # Test type 1: JSON serialization
  34. get '/json' do
  35. json :message=>'Hello, World!'
  36. end
  37. # Test type 2: Single database query
  38. get '/db' do
  39. json World.with_pk(rand1).values
  40. end
  41. # Test type 3: Multiple database queries
  42. get '/queries' do
  43. worlds =
  44. DB.synchronize do
  45. ALL_IDS.sample(bounded_queries).map do |id|
  46. World.with_pk(id)
  47. end
  48. end
  49. json worlds.map!(&:values)
  50. end
  51. # Test type 4: Fortunes
  52. get '/fortunes' do
  53. @fortunes = Fortune.all
  54. @fortunes << Fortune.new(
  55. :id=>0,
  56. :message=>'Additional fortune added at request time.'
  57. )
  58. @fortunes.sort_by!(&:message)
  59. erb :fortunes, :layout=>true
  60. end
  61. # Test type 5: Database updates
  62. get '/updates' do
  63. worlds = nil
  64. DB.synchronize do
  65. worlds =
  66. ALL_IDS.sample(bounded_queries).map do |id|
  67. world = World.with_pk(id)
  68. new_value = rand1
  69. new_value = rand1 while new_value == world.randomnumber
  70. world.randomnumber = new_value
  71. world
  72. end
  73. World.batch_update(worlds)
  74. end
  75. json worlds.map!(&:values)
  76. end
  77. # Test type 6: Plaintext
  78. get '/plaintext' do
  79. content_type :text
  80. 'Hello, World!'
  81. end
  82. end