Skip to content

Commit c219385

Browse files
committed
Optimize construction of headers.
1 parent 96b516e commit c219385

File tree

4 files changed

+103
-9
lines changed

4 files changed

+103
-9
lines changed

lib/grape.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ module Grape
3838

3939
autoload :Cookies
4040
autoload :Validations
41-
autoload :Request, 'grape/http/request'
41+
autoload :Request
4242
autoload :Env, 'grape/util/env'
4343
end
4444

lib/grape/http/request.rb renamed to lib/grape/request.rb

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
module Grape
22
class Request < Rack::Request
3-
HTTP_PREFIX = 'HTTP_'.freeze
4-
UNDERSCORE = '_'.freeze
5-
MINUS = '-'.freeze
3+
HTTP_PREFIX = 'HTTP_'.freeze
64

75
def params
86
@params ||= begin
@@ -22,10 +20,7 @@ def headers
2220
@headers ||= env.each_with_object({}) do |(k, v), h|
2321
next unless k.to_s.start_with? HTTP_PREFIX
2422

25-
k = k[5..-1]
26-
k.tr!(UNDERSCORE, MINUS)
27-
k.downcase!
28-
k.gsub!(/^.|[-\s]./, &:upcase!)
23+
k = k[5..-1].split('_').each(&:capitalize!).join('-')
2924
h[k] = v
3025
end
3126
end

lib/grape/util/env.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ module Env
77
API_TYPE = 'api.type'.freeze
88
API_SUBTYPE = 'api.subtype'.freeze
99
API_VENDOR = 'api.vendor'.freeze
10-
API_VERSION = 'api.version'.freeze
1110
API_FORMAT = 'api.format'.freeze
1211

1312
RACK_INPUT = 'rack.input'.freeze

spec/grape/request_spec.rb

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
require 'spec_helper'
2+
3+
module Grape
4+
describe Request do
5+
let(:default_method) { 'GET' }
6+
let(:default_params) { {} }
7+
let(:default_options) {
8+
{
9+
method: method,
10+
params: params
11+
}
12+
}
13+
let(:default_env) {
14+
Rack::MockRequest.env_for('/', options)
15+
}
16+
let(:method) { default_method }
17+
let(:params) { default_params }
18+
let(:options) { default_options }
19+
let(:env) { default_env }
20+
21+
let(:request) {
22+
Grape::Request.new(env)
23+
}
24+
25+
describe '#params' do
26+
let(:params) {
27+
{
28+
a: '123',
29+
b: 'xyz'
30+
}
31+
}
32+
33+
it 'returns params' do
34+
expect(request.params).to eq('a' => '123', 'b' => 'xyz')
35+
end
36+
37+
describe 'with rack.routing_args' do
38+
let(:options) {
39+
default_options.merge('rack.routing_args' => routing_args)
40+
}
41+
let(:routing_args) {
42+
{
43+
version: '123',
44+
route_info: '456',
45+
c: 'ccc'
46+
}
47+
}
48+
49+
it 'cuts version and route_info' do
50+
expect(request.params).to eq('a' => '123', 'b' => 'xyz', 'c' => 'ccc')
51+
end
52+
end
53+
end
54+
55+
describe '#headers' do
56+
let(:options) {
57+
default_options.merge(request_headers)
58+
}
59+
60+
describe 'with http headers in env' do
61+
let(:request_headers) {
62+
{
63+
'HTTP_X_GRAPE_IS_COOL' => 'yeah'
64+
}
65+
}
66+
67+
it 'cuts HTTP_ prefix and capitalizes header name words' do
68+
expect(request.headers).to eq('X-Grape-Is-Cool' => 'yeah')
69+
end
70+
end
71+
72+
describe 'with non-HTTP_* stuff in env' do
73+
let(:request_headers) {
74+
{
75+
'HTP_X_GRAPE_ENTITY_TOO' => 'but now we are testing Grape'
76+
}
77+
}
78+
79+
it 'does not include them' do
80+
expect(request.headers).to eq({})
81+
end
82+
end
83+
84+
describe 'with symbolic header names' do
85+
let(:request_headers) {
86+
{
87+
HTTP_GRAPE_LIKES_SYMBOLIC: 'it is true'
88+
}
89+
}
90+
let(:env) {
91+
default_env.merge(request_headers)
92+
}
93+
94+
it 'converts them to string' do
95+
expect(request.headers).to eq('Grape-Likes-Symbolic' => 'it is true')
96+
end
97+
end
98+
end
99+
end
100+
end

0 commit comments

Comments
 (0)