33require 'spec_helper'
44
55RSpec . describe Sentry ::RequestInterface do
6- let ( :exception ) { ZeroDivisionError . new ( "divided by 0" ) }
7- let ( :additional_headers ) { { } }
8- let ( :env ) { Rack ::MockRequest . env_for ( "/test" , additional_headers ) }
9- let ( :interface ) { described_class . build ( env : env ) }
6+ let ( :env ) { Rack ::MockRequest . env_for ( "/test" ) }
7+
8+ subject do
9+ described_class . build ( env : env )
10+ end
1011
1112 before do
1213 Sentry . init do |config |
1516 end
1617
1718 describe "rack_env_whitelist" do
18- it 'excludes non whitelisted params from rack env' do
19- additional_env = { "random_param" => "text" , "query_string" => "test" }
20- new_env = env . merge ( additional_env )
21- interface = described_class . build ( env : new_env )
19+ let ( :additional_env ) { { "random_param" => "text" , "query_string" => "test" } }
20+
21+ before do
22+ env . merge! ( additional_env )
23+ end
2224
23- expect ( interface . env ) . to_not include ( additional_env )
25+ it 'excludes non whitelisted params from rack env' do
26+ expect ( subject . env ) . to_not include ( additional_env )
2427 end
2528
2629 it 'formats rack env according to the provided whitelist' do
2730 Sentry . configuration . rack_env_whitelist = %w( random_param query_string )
28- additional_env = { "random_param" => "text" , "query_string" => "test" }
29- new_env = env . merge ( additional_env )
30- interface = described_class . build ( env : new_env )
31-
32- expect ( interface . env ) . to eq ( additional_env )
31+ expect ( subject . env ) . to eq ( additional_env )
3332 end
3433
3534 it 'keeps the original env intact when an empty whitelist is provided' do
3635 Sentry . configuration . rack_env_whitelist = [ ]
37- interface = described_class . build ( env : env )
3836
39- expect ( interface . env ) . to eq ( env )
37+ expect ( subject . env ) . to eq ( env )
4038 end
4139 end
4240
4341 describe 'format headers' do
4442 let ( :additional_headers ) { { "HTTP_VERSION" => "HTTP/1.1" , "HTTP_COOKIE" => "test" , "HTTP_X_REQUEST_ID" => "12345678" } }
43+ let ( :env ) { Rack ::MockRequest . env_for ( "/test" , additional_headers ) }
4544
4645 it 'transforms headers to conform with the interface' do
47- interface = described_class . build ( env : env )
48-
49- expect ( interface . headers ) . to eq ( "Content-Length" => "0" , "Version" => "HTTP/1.1" , "X-Request-Id" => "12345678" )
46+ expect ( subject . headers ) . to eq ( "Content-Length" => "0" , "Version" => "HTTP/1.1" , "X-Request-Id" => "12345678" )
5047 end
5148
5249 context 'from Rails middleware' do
5350 let ( :additional_headers ) { { "action_dispatch.request_id" => "12345678" } }
5451
5552 it 'transforms headers to conform with the interface' do
56- interface = described_class . build ( env : env )
57-
58- expect ( interface . headers ) . to eq ( "Content-Length" => "0" , "X-Request-Id" => "12345678" )
53+ expect ( subject . headers ) . to eq ( "Content-Length" => "0" , "X-Request-Id" => "12345678" )
5954 end
6055 end
6156
6257 context 'with special characters' do
6358 let ( :additional_headers ) { { "HTTP_FOO" => "Tekirda\xC4 " } }
6459
6560 it "doesn't cause any issue" do
66- interface = described_class . build ( env : env )
67- json = JSON . generate ( interface . to_hash )
61+ json = JSON . generate ( subject . to_hash )
6862
6963 expect ( JSON . parse ( json ) [ "headers" ] ) . to eq ( { "Content-Length" => "0" , "Foo" => "Tekirda�" } )
7064 end
8377 end
8478
8579 it "doesn't capture cookies info" do
86- new_env = env . merge (
87- ::Rack ::RACK_REQUEST_COOKIE_HASH => "cookies!"
88- )
80+ env . merge! ( ::Rack ::RACK_REQUEST_COOKIE_HASH => "cookies!" )
8981
90- interface = described_class . build ( env : new_env )
91-
92- expect ( interface . cookies ) . to eq ( nil )
93- expect ( interface . env [ "COOKIE" ] ) . to eq ( nil )
82+ expect ( subject . cookies ) . to eq ( nil )
83+ expect ( subject . env [ "COOKIE" ] ) . to eq ( nil )
9484 end
9585
9686 describe "headers filtering" do
9787 it "filters out HTTP_COOKIE header" do
98- new_env = env . merge (
99- "HTTP_COOKIE" => "cookies!"
100- )
88+ env . merge! ( "HTTP_COOKIE" => "cookies!" )
10189
102- interface = described_class . build ( env : new_env )
103-
104- expect ( interface . headers [ "Cookie" ] ) . to eq ( nil )
90+ expect ( subject . headers [ "Cookie" ] ) . to eq ( nil )
10591 end
10692
10793 it "filters out non-http headers" do
108- expect ( interface . headers [ "Request-Method" ] ) . to eq ( nil )
94+ expect ( subject . headers [ "Request-Method" ] ) . to eq ( nil )
10995 end
11096
11197 it "doesn't filter out CONTENT_TYPE or CONTENT_LENGTH headers" do
112- new_env = env . merge (
98+ env . merge! (
11399 "CONTENT_LENGTH" => 10 ,
114100 "CONTENT_TYPE" => "text/html"
115101 )
116102
117- interface = described_class . build ( env : new_env )
118-
119- expect ( interface . headers [ "Content-Length" ] ) . to eq ( "10" )
120- expect ( interface . headers [ "Content-Type" ] ) . to eq ( "text/html" )
103+ expect ( subject . headers [ "Content-Length" ] ) . to eq ( "10" )
104+ expect ( subject . headers [ "Content-Type" ] ) . to eq ( "text/html" )
121105 end
122106
123107 it 'does not ignore version headers which do not match SERVER_PROTOCOL' do
124- new_env = env . merge ( "SERVER_PROTOCOL" => "HTTP/1.1" , "HTTP_VERSION" => "HTTP/2.0" )
108+ env . merge! ( "SERVER_PROTOCOL" => "HTTP/1.1" , "HTTP_VERSION" => "HTTP/2.0" )
125109
126- interface = described_class . build ( env : new_env )
127-
128- expect ( interface . headers [ "Version" ] ) . to eq ( "HTTP/2.0" )
110+ expect ( subject . headers [ "Version" ] ) . to eq ( "HTTP/2.0" )
129111 end
130112
131113 it 'retains any literal "HTTP-" in the actual header name' do
132- new_env = env . merge ( "HTTP_HTTP_CUSTOM_HTTP_HEADER" => "test" )
133- interface = described_class . build ( env : new_env )
134-
135- expect ( interface . headers ) . to include ( "Http-Custom-Http-Header" => "test" )
114+ env . merge! ( "HTTP_HTTP_CUSTOM_HTTP_HEADER" => "test" )
115+ expect ( subject . headers ) . to include ( "Http-Custom-Http-Header" => "test" )
136116 end
137117
138118 it 'does not fail if an object in the env cannot be cast to string' do
@@ -142,39 +122,28 @@ def to_s
142122 end
143123 end . new
144124
145- new_env = env . merge ( "HTTP_FOO" => "BAR" , "rails_object" => obj )
125+ env . merge! ( "HTTP_FOO" => "BAR" , "rails_object" => obj )
146126
147- expect { described_class . build ( env : new_env ) } . to_not raise_error
127+ expect { described_class . build ( env : env ) } . to_not raise_error
148128 end
149129 end
150130
151131 it "doesn't store request body by default" do
152- new_env = env . merge (
153- "REQUEST_METHOD" => "POST" ,
154- ::Rack ::RACK_INPUT => StringIO . new ( "data=ignore me" )
155- )
132+ env . merge! ( "REQUEST_METHOD" => "POST" , ::Rack ::RACK_INPUT => StringIO . new ( "data=ignore me" ) )
156133
157- interface = described_class . build ( env : new_env )
158-
159- expect ( interface . data ) . to eq ( nil )
134+ expect ( subject . data ) . to eq ( nil )
160135 end
161136
162137 it "doesn't store request body by default" do
163- new_env = env . merge ( ::Rack ::RACK_INPUT => StringIO . new ( "ignore me" ) )
164-
165- interface = described_class . build ( env : new_env )
138+ env . merge! ( ::Rack ::RACK_INPUT => StringIO . new ( "ignore me" ) )
166139
167- expect ( interface . data ) . to eq ( nil )
140+ expect ( subject . data ) . to eq ( nil )
168141 end
169142
170143 it "doesn't store query_string by default" do
171- new_env = env . merge (
172- "QUERY_STRING" => "token=xxxx"
173- )
144+ env . merge! ( "QUERY_STRING" => "token=xxxx" )
174145
175- interface = described_class . build ( env : new_env )
176-
177- expect ( interface . query_string ) . to eq ( nil )
146+ expect ( subject . query_string ) . to eq ( nil )
178147 end
179148
180149 context "with config.send_default_pii = true" do
@@ -183,51 +152,34 @@ def to_s
183152 end
184153
185154 it "stores cookies" do
186- new_env = env . merge (
187- ::Rack ::RACK_REQUEST_COOKIE_HASH => "cookies!"
188- )
189-
190- interface = described_class . build ( env : new_env )
155+ env . merge! ( ::Rack ::RACK_REQUEST_COOKIE_HASH => "cookies!" )
191156
192- expect ( interface . cookies ) . to eq ( "cookies!" )
157+ expect ( subject . cookies ) . to eq ( "cookies!" )
193158 end
194159
195160 it "stores form data" do
196- new_env = env . merge (
197- "REQUEST_METHOD" => "POST" ,
198- ::Rack ::RACK_INPUT => StringIO . new ( "data=catch me" )
199- )
200-
201- interface = described_class . build ( env : new_env )
161+ env . merge! ( "REQUEST_METHOD" => "POST" , ::Rack ::RACK_INPUT => StringIO . new ( "data=catch me" ) )
202162
203- expect ( interface . data ) . to eq ( { "data" => "catch me" } )
163+ expect ( subject . data ) . to eq ( { "data" => "catch me" } )
204164 end
205165
206166 it "stores query string" do
207- new_env = env . merge (
208- "QUERY_STRING" => "token=xxxx"
209- )
210-
211- interface = described_class . build ( env : new_env )
167+ env . merge! ( "QUERY_STRING" => "token=xxxx" )
212168
213- expect ( interface . query_string ) . to eq ( "token=xxxx" )
169+ expect ( subject . query_string ) . to eq ( "token=xxxx" )
214170 end
215171
216172 it "stores request body" do
217- new_env = env . merge ( ::Rack ::RACK_INPUT => StringIO . new ( "catch me" ) )
173+ env . merge! ( ::Rack ::RACK_INPUT => StringIO . new ( "catch me" ) )
218174
219- interface = described_class . build ( env : new_env )
220-
221- expect ( interface . data ) . to eq ( "catch me" )
175+ expect ( subject . data ) . to eq ( "catch me" )
222176 end
223177
224178 it "force encodes request body to avoid encoding issue" do
225- new_env = env . merge ( ::Rack ::RACK_INPUT => StringIO . new ( "あ" ) )
226-
227- interface = described_class . build ( env : new_env )
179+ env . merge! ( ::Rack ::RACK_INPUT => StringIO . new ( "あ" ) )
228180
229181 expect do
230- JSON . generate ( interface . to_hash )
182+ JSON . generate ( subject . to_hash )
231183 end . not_to raise_error
232184 end
233185
@@ -241,12 +193,10 @@ def to_s
241193 "HTTP_X_FORWARDED_FOR" => ip
242194 )
243195
244- interface = described_class . build ( env : env )
245-
246- expect ( interface . env ) . to include ( "REMOTE_ADDR" )
247- expect ( interface . headers . keys ) . to include ( "Client-Ip" )
248- expect ( interface . headers . keys ) . to include ( "X-Real-Ip" )
249- expect ( interface . headers . keys ) . to include ( "X-Forwarded-For" )
196+ expect ( subject . env ) . to include ( "REMOTE_ADDR" )
197+ expect ( subject . headers . keys ) . to include ( "Client-Ip" )
198+ expect ( subject . headers . keys ) . to include ( "X-Real-Ip" )
199+ expect ( subject . headers . keys ) . to include ( "X-Forwarded-For" )
250200 end
251201 end
252202end
0 commit comments