Skip to content

Commit 9de8d47

Browse files
Add real ip detection to asgi integration (#1199)
Closes #1154
1 parent a12a719 commit 9de8d47

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

sentry_sdk/integrations/asgi.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def event_processor(self, event, hint, asgi_scope):
171171

172172
client = asgi_scope.get("client")
173173
if client and _should_send_default_pii():
174-
request_info["env"] = {"REMOTE_ADDR": client[0]}
174+
request_info["env"] = {"REMOTE_ADDR": self._get_ip(asgi_scope)}
175175

176176
if (
177177
event.get("transaction", _DEFAULT_TRANSACTION_NAME)
@@ -225,6 +225,20 @@ def _get_query(self, scope):
225225
return None
226226
return urllib.parse.unquote(qs.decode("latin-1"))
227227

228+
def _get_ip(self, scope):
229+
# type: (Any) -> str
230+
try:
231+
return scope["headers"]["x_forwarded_for"].split(",")[0].strip()
232+
except (KeyError, IndexError):
233+
pass
234+
235+
try:
236+
return scope["headers"]["x_real_ip"]
237+
except KeyError:
238+
pass
239+
240+
return scope.get("client")[0]
241+
228242
def _get_headers(self, scope):
229243
# type: (Any) -> Dict[str, str]
230244
"""

tests/integrations/asgi/test_asgi.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,3 +251,44 @@ def kangaroo_handler(request):
251251
}
252252
)
253253
)
254+
255+
256+
def test_x_forwarded_for(sentry_init, app, capture_events):
257+
sentry_init(send_default_pii=True)
258+
events = capture_events()
259+
260+
client = TestClient(app)
261+
response = client.get("/", headers={"X-Forwarded-For": "testproxy"})
262+
263+
assert response.status_code == 200
264+
265+
(event,) = events
266+
assert event["request"]["env"] == {"REMOTE_ADDR": "testproxy"}
267+
268+
269+
def test_x_forwarded_for_multiple_entries(sentry_init, app, capture_events):
270+
sentry_init(send_default_pii=True)
271+
events = capture_events()
272+
273+
client = TestClient(app)
274+
response = client.get(
275+
"/", headers={"X-Forwarded-For": "testproxy1,testproxy2,testproxy3"}
276+
)
277+
278+
assert response.status_code == 200
279+
280+
(event,) = events
281+
assert event["request"]["env"] == {"REMOTE_ADDR": "testproxy1"}
282+
283+
284+
def test_x_real_ip(sentry_init, app, capture_events):
285+
sentry_init(send_default_pii=True)
286+
events = capture_events()
287+
288+
client = TestClient(app)
289+
response = client.get("/", headers={"X-Real-IP": "1.2.3.4"})
290+
291+
assert response.status_code == 200
292+
293+
(event,) = events
294+
assert event["request"]["env"] == {"REMOTE_ADDR": "1.2.3.4"}

0 commit comments

Comments
 (0)