From e783bdc456e8407f4d25c1f4330467d0666f3546 Mon Sep 17 00:00:00 2001
From: Alejandro Celaya <alejandrocelaya@gmail.com>
Date: Tue, 21 Nov 2023 10:01:27 +0100
Subject: [PATCH] Set referrer when sending visits to Matomo

---
 .../src/EventDispatcher/Matomo/SendVisitToMatomo.php     | 3 ++-
 module/Core/src/Matomo/MatomoTrackerBuilder.php          | 9 ++++++---
 module/Core/src/Visit/Entity/Visit.php                   | 5 +++++
 .../EventDispatcher/Matomo/SendVisitToMatomoTest.php     | 2 ++
 4 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/module/Core/src/EventDispatcher/Matomo/SendVisitToMatomo.php b/module/Core/src/EventDispatcher/Matomo/SendVisitToMatomo.php
index 4e0bcb86..ad9660cb 100644
--- a/module/Core/src/EventDispatcher/Matomo/SendVisitToMatomo.php
+++ b/module/Core/src/EventDispatcher/Matomo/SendVisitToMatomo.php
@@ -47,7 +47,8 @@ class SendVisitToMatomo
             $tracker
                 ->setUrl($this->resolveUrlToTrack($visit))
                 ->setCustomTrackingParameter('type', $visit->type()->value)
-                ->setUserAgent($visit->userAgent());
+                ->setUserAgent($visit->userAgent())
+                ->setUrlReferrer($visit->referer());
 
             $location = $visit->getVisitLocation();
             if ($location !== null) {
diff --git a/module/Core/src/Matomo/MatomoTrackerBuilder.php b/module/Core/src/Matomo/MatomoTrackerBuilder.php
index 393e0472..4bad6799 100644
--- a/module/Core/src/Matomo/MatomoTrackerBuilder.php
+++ b/module/Core/src/Matomo/MatomoTrackerBuilder.php
@@ -36,9 +36,12 @@ class MatomoTrackerBuilder implements MatomoTrackerBuilderInterface
             ->setRequestMethodNonBulk('POST')
             // Set a reasonable timeout
             ->setRequestTimeout(self::MATOMO_DEFAULT_TIMEOUT)
-            ->setRequestConnectTimeout(self::MATOMO_DEFAULT_TIMEOUT)
-            // We don't want to bulk send, as every request to Shlink will create a new tracker
-            ->disableBulkTracking();
+            ->setRequestConnectTimeout(self::MATOMO_DEFAULT_TIMEOUT);
+
+        // We don't want to bulk send, as every request to Shlink will create a new tracker
+        $tracker->disableBulkTracking();
+        // Disable cookies, as they are ignored anyway
+        $tracker->disableCookieSupport();
 
         return $tracker;
     }
diff --git a/module/Core/src/Visit/Entity/Visit.php b/module/Core/src/Visit/Entity/Visit.php
index a735a3fb..255a55f4 100644
--- a/module/Core/src/Visit/Entity/Visit.php
+++ b/module/Core/src/Visit/Entity/Visit.php
@@ -193,6 +193,11 @@ class Visit extends AbstractEntity implements JsonSerializable
         return $this->userAgent;
     }
 
+    public function referer(): string
+    {
+        return $this->referer;
+    }
+
     public function jsonSerialize(): array
     {
         return [
diff --git a/module/Core/test/EventDispatcher/Matomo/SendVisitToMatomoTest.php b/module/Core/test/EventDispatcher/Matomo/SendVisitToMatomoTest.php
index b76a1d31..94c66623 100644
--- a/module/Core/test/EventDispatcher/Matomo/SendVisitToMatomoTest.php
+++ b/module/Core/test/EventDispatcher/Matomo/SendVisitToMatomoTest.php
@@ -71,6 +71,7 @@ class SendVisitToMatomoTest extends TestCase
         $tracker = $this->createMock(MatomoTracker::class);
         $tracker->expects($this->once())->method('setUrl')->willReturn($tracker);
         $tracker->expects($this->once())->method('setUserAgent')->willReturn($tracker);
+        $tracker->expects($this->once())->method('setUrlReferrer')->willReturn($tracker);
         $tracker->expects($this->once())->method('doTrackPageView')->with('');
 
         if ($visit->isOrphan()) {
@@ -125,6 +126,7 @@ class SendVisitToMatomoTest extends TestCase
         $tracker = $this->createMock(MatomoTracker::class);
         $tracker->expects($this->once())->method('setUrl')->with($expectedTrackedUrl)->willReturn($tracker);
         $tracker->expects($this->once())->method('setUserAgent')->willReturn($tracker);
+        $tracker->expects($this->once())->method('setUrlReferrer')->willReturn($tracker);
         $tracker->expects($this->any())->method('setCustomTrackingParameter')->willReturn($tracker);
         $tracker->expects($this->once())->method('doTrackPageView');