Skip to content

Commit 3c7997b

Browse files
committed
fix: update referer handling to prioritize Client-Type header
1 parent a7bd6ac commit 3c7997b

2 files changed

Lines changed: 66 additions & 1 deletion

File tree

biothings/web/analytics/notifiers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def on_finish(self):
3939
request_info["user_agent"] = self.request.headers.get("User-Agent")
4040
request_info["host"] = self.request.host
4141
request_info["path"] = self.request.path
42-
request_info["referer"] = self.request.headers.get("Referer")
42+
request_info["referer"] = self.request.headers.get("Client-Type") or self.request.headers.get("Referer")
4343
self.event["__request__"] = request_info
4444

4545
if hasattr(self, "biothings"):
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from types import SimpleNamespace
2+
from unittest.mock import patch
3+
4+
from tornado.httputil import HTTPHeaders
5+
6+
from biothings.web.analytics.events import Event
7+
from biothings.web.analytics.notifiers import AnalyticsMixin
8+
9+
10+
class DummyNotifier:
11+
async def broadcast(self, event):
12+
pass
13+
14+
15+
class DummyAnalyticsHandler(AnalyticsMixin):
16+
def __init__(self, headers):
17+
self.request = SimpleNamespace(
18+
headers=HTTPHeaders(headers),
19+
remote_ip="127.0.0.1",
20+
host="example.org",
21+
path="/v1/query",
22+
)
23+
self.event = Event()
24+
self._biothings = SimpleNamespace(notifier=DummyNotifier())
25+
26+
@property
27+
def settings(self):
28+
return {}
29+
30+
@property
31+
def biothings(self):
32+
return self._biothings
33+
34+
def get_argument(self, name, default=None):
35+
return default
36+
37+
38+
def test_analytics_mixin_records_client_type_as_referer():
39+
handler = DummyAnalyticsHandler(
40+
{
41+
"Referer": "https://data.niaid.nih.gov/",
42+
"Client-Type": "ui",
43+
}
44+
)
45+
46+
with patch("biothings.web.analytics.notifiers.asyncio.get_event_loop", return_value=object()), patch(
47+
"biothings.web.analytics.notifiers.asyncio.run_coroutine_threadsafe"
48+
) as schedule:
49+
handler.on_finish()
50+
51+
schedule.call_args.args[0].close()
52+
assert handler.event["__request__"]["referer"] == "ui"
53+
assert handler.event.to_GA4_payload("GA4_MEASUREMENT_ID")[0]["params"]["page_referrer"] == "ui"
54+
55+
56+
def test_analytics_mixin_referer_falls_back_to_referer_header():
57+
handler = DummyAnalyticsHandler({"Referer": "https://data.niaid.nih.gov/"})
58+
59+
with patch("biothings.web.analytics.notifiers.asyncio.get_event_loop", return_value=object()), patch(
60+
"biothings.web.analytics.notifiers.asyncio.run_coroutine_threadsafe"
61+
) as schedule:
62+
handler.on_finish()
63+
64+
schedule.call_args.args[0].close()
65+
assert handler.event["__request__"]["referer"] == "https://data.niaid.nih.gov/"

0 commit comments

Comments
 (0)