|
1 | 1 | # frozen_string_literal: true
|
| 2 | +require 'time' |
2 | 3 |
|
3 | 4 | # Our Rack application to be executed by rackup
|
4 | 5 | class HelloWorld
|
5 |
| - DEFAULT_HEADERS = {}.tap do |h| |
6 |
| - h[SERVER_HEADER] = SERVER_STRING if SERVER_STRING |
7 |
| - |
8 |
| - h.freeze |
9 |
| - end |
| 6 | + MAX_PK = 10_000 |
| 7 | + ID_RANGE = (1..10_000).freeze |
| 8 | + ALL_IDS = ID_RANGE.to_a |
| 9 | + QUERIES_MIN = 1 |
| 10 | + QUERIES_MAX = 500 |
| 11 | + CONTENT_TYPE = 'Content-Type' |
| 12 | + CONTENT_LENGTH = 'Content-Length' |
| 13 | + JSON_TYPE = 'application/json' |
| 14 | + HTML_TYPE = 'text/html; charset=utf-8' |
| 15 | + PLAINTEXT_TYPE = 'text/plain' |
| 16 | + DATE = 'Date' |
| 17 | + SERVER = 'Server' |
| 18 | + SERVER_STRING = if defined?(PhusionPassenger) |
| 19 | + 'Passenger' |
| 20 | + elsif defined?(Puma) |
| 21 | + 'Puma' |
| 22 | + elsif defined?(Iodine) |
| 23 | + 'Iodine' |
| 24 | + elsif defined?(Unicorn) |
| 25 | + 'Unicorn' |
| 26 | + else |
| 27 | + 'Ruby Rack' |
| 28 | + end |
10 | 29 |
|
11 | 30 | def bounded_queries(env)
|
12 | 31 | params = Rack::Utils.parse_query(env['QUERY_STRING'])
|
@@ -87,35 +106,60 @@ def updates(env)
|
87 | 106 | end
|
88 | 107 |
|
89 | 108 | def call(env)
|
90 |
| - content_type, *body = |
91 |
| - case env['PATH_INFO'] |
92 |
| - when '/json' |
93 |
| - # Test type 1: JSON serialization |
94 |
| - [JSON_TYPE, { message: 'Hello, World!' }.to_json] |
95 |
| - when '/db' |
96 |
| - # Test type 2: Single database query |
97 |
| - [JSON_TYPE, db.to_json] |
98 |
| - when '/queries' |
99 |
| - # Test type 3: Multiple database queries |
100 |
| - [JSON_TYPE, queries(env).to_json] |
101 |
| - when '/fortunes' |
102 |
| - # Test type 4: Fortunes |
103 |
| - [HTML_TYPE, fortunes] |
104 |
| - when '/updates' |
105 |
| - # Test type 5: Database updates |
106 |
| - [JSON_TYPE, updates(env).to_json] |
107 |
| - when '/plaintext' |
108 |
| - # Test type 6: Plaintext |
109 |
| - [PLAINTEXT_TYPE, 'Hello, World!'] |
110 |
| - end |
| 109 | + case env['PATH_INFO'] |
| 110 | + when '/json' |
| 111 | + # Test type 1: JSON serialization |
| 112 | + respond JSON_TYPE, { message: 'Hello, World!' }.to_json |
| 113 | + when '/db' |
| 114 | + # Test type 2: Single database query |
| 115 | + respond JSON_TYPE, db.to_json |
| 116 | + when '/queries' |
| 117 | + # Test type 3: Multiple database queries |
| 118 | + respond JSON_TYPE, queries(env).to_json |
| 119 | + when '/fortunes' |
| 120 | + # Test type 4: Fortunes |
| 121 | + respond HTML_TYPE, fortunes |
| 122 | + when '/updates' |
| 123 | + # Test type 5: Database updates |
| 124 | + respond JSON_TYPE, updates(env).to_json |
| 125 | + when '/plaintext' |
| 126 | + # Test type 6: Plaintext |
| 127 | + respond PLAINTEXT_TYPE, 'Hello, World!' |
| 128 | + end |
| 129 | + end |
| 130 | + |
| 131 | + private |
111 | 132 |
|
| 133 | + def respond(content_type, body) |
112 | 134 | [
|
113 | 135 | 200,
|
114 |
| - DEFAULT_HEADERS.merge( |
115 |
| - CONTENT_TYPE => content_type, |
116 |
| - DATE_HEADER => Time.now.httpdate |
117 |
| - ), |
118 |
| - body |
| 136 | + headers(content_type, body), |
| 137 | + [body] |
119 | 138 | ]
|
120 | 139 | end
|
| 140 | + |
| 141 | + if defined?(Unicorn) |
| 142 | + def headers(content_type, body) |
| 143 | + { |
| 144 | + CONTENT_TYPE => content_type, |
| 145 | + SERVER => SERVER_STRING, |
| 146 | + CONTENT_LENGTH => body.bytesize.to_s |
| 147 | + } |
| 148 | + end |
| 149 | + elsif defined?(Puma) |
| 150 | + def headers(content_type, _) |
| 151 | + { |
| 152 | + CONTENT_TYPE => content_type, |
| 153 | + SERVER => SERVER_STRING, |
| 154 | + DATE => Time.now.utc.httpdate |
| 155 | + } |
| 156 | + end |
| 157 | + else |
| 158 | + def headers(content_type, _) |
| 159 | + { |
| 160 | + CONTENT_TYPE => content_type, |
| 161 | + SERVER => SERVER_STRING |
| 162 | + } |
| 163 | + end |
| 164 | + end |
121 | 165 | end
|
0 commit comments