From bf080deeafb94d0a1b49f0fbeaf0617ab95894c8 Mon Sep 17 00:00:00 2001 From: Andrey Helldar Date: Tue, 31 Mar 2026 17:33:25 +0300 Subject: [PATCH] Added handling of empty values --- src/TrackerRequest.php | 27 +++++++++++++++++-- tests/Unit/Request/IpTest.php | 14 ++++++++-- .../{TrackIdTest.php => TraceIdTest.php} | 13 +++++++++ tests/Unit/Request/UserIdTest.php | 10 +++++++ 4 files changed, 60 insertions(+), 4 deletions(-) rename tests/Unit/Request/{TrackIdTest.php => TraceIdTest.php} (76%) diff --git a/src/TrackerRequest.php b/src/TrackerRequest.php index 7baf646..38927f7 100644 --- a/src/TrackerRequest.php +++ b/src/TrackerRequest.php @@ -8,6 +8,8 @@ use Ramsey\Uuid\UuidFactory; use Symfony\Component\HttpFoundation\Request; +use function in_array; +use function is_array; use function is_int; class TrackerRequest @@ -17,7 +19,7 @@ public function __construct( protected TrackerHeader $header, ) {} - public function userId(int|string|null $id): static + public function userId(int|string|null $id = null): static { $id ??= $this->getUserId(); @@ -89,6 +91,8 @@ public function getRequest(): Request protected function set(string $key, array|int|string|null $value): static { if (! is_int($value) && ! $value) { + $this->request->headers->remove($key); + return $this; } @@ -103,6 +107,25 @@ protected function set(string $key, array|int|string|null $value): static protected function get(string $key): array|string|null { - return $this->request->headers->get($key); + return $this->resolve( + $this->request->headers->get($key) + ); + } + + protected function resolve(array|int|string|null $value): array|string|null + { + if (is_array($value)) { + return $value; + } + + if (is_int($value)) { + return (string) $value; + } + + if (in_array($value, ['', 'null', '[]', '{}', '-'], true)) { + return null; + } + + return $value; } } diff --git a/tests/Unit/Request/IpTest.php b/tests/Unit/Request/IpTest.php index 0815eef..8befe64 100644 --- a/tests/Unit/Request/IpTest.php +++ b/tests/Unit/Request/IpTest.php @@ -14,7 +14,7 @@ expect($telemetry->getIp())->toBe('203.0.113.10'); }); -test('Else HTTP_X_REAL_IP (non-standard header name checked by the class)', function () { +test('HTTP_X_REAL_IP (non-standard header name checked by the class)', function () { $header = new TrackerHeader; $request = makeRequest(); @@ -24,7 +24,7 @@ expect($telemetry->getIp())->toBe('198.51.100.20'); }); -test('Else client ip (REMOTE_ADDR)', function () { +test('client ip (REMOTE_ADDR)', function () { $header = new TrackerHeader; $request = makeRequest([], ['REMOTE_ADDR' => '192.0.2.30']); @@ -43,6 +43,16 @@ expect($request->headers->get($header->ip))->toBe('127.0.0.1'); }); +test('telemetry header is empty', function (string $value) { + $header = new TrackerHeader; + + $request = makeRequest([$header->ip => $value]); + $telemetry = new TrackerRequest($request, $header); + $telemetry->ip(); + + expect($request->headers->get($header->ip))->toBe('127.0.0.1'); +})->with(['', '-']); + test('ip() with value overrides and sets header', function () { $header = new TrackerHeader; diff --git a/tests/Unit/Request/TrackIdTest.php b/tests/Unit/Request/TraceIdTest.php similarity index 76% rename from tests/Unit/Request/TrackIdTest.php rename to tests/Unit/Request/TraceIdTest.php index b2fe06c..0907d8c 100644 --- a/tests/Unit/Request/TrackIdTest.php +++ b/tests/Unit/Request/TraceIdTest.php @@ -46,3 +46,16 @@ expect($request->headers->get($header->traceId))->toBe('manual-id'); }); + +test('telemetry header is empty', function (string $value) { + $header = new TrackerHeader; + + $request = makeRequest([$header->traceId => $value]); + $telemetry = new TrackerRequest($request, $header); + $telemetry->traceId(); + + $generated = $request->headers->get($header->traceId); + + expect(Uuid::isValid($generated))->toBeTrue() + ->and(Uuid::fromString($generated)->getVersion())->toBe(7); +})->with(['', '-']); diff --git a/tests/Unit/Request/UserIdTest.php b/tests/Unit/Request/UserIdTest.php index 73ff3e5..70ed792 100644 --- a/tests/Unit/Request/UserIdTest.php +++ b/tests/Unit/Request/UserIdTest.php @@ -44,3 +44,13 @@ $telemetry = new TrackerRequest($request, $header); expect($telemetry->getUserId())->toBeNull(); }); + +test('telemetry header is empty', function (string $value) { + $header = new TrackerHeader; + + $request = makeRequest([$header->userId => $value]); + $telemetry = new TrackerRequest($request, $header); + $telemetry->userId(); + + expect($request->headers->get($header->userId))->toBeNull(); +})->with(['', '-']);