Skip to content

Commit 38129e7

Browse files
committed
Truncate url using illuminate str
Fix an issue where webhooks from a URL longer than a 255 varchar field are not stored in webhook_calls table
1 parent d71c92d commit 38129e7

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

src/Models/WebhookCall.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Spatie\WebhookClient\Exceptions\InvalidConfig;
1111
use Spatie\WebhookClient\WebhookConfig;
1212
use Symfony\Component\HttpFoundation\HeaderBag;
13+
use Illuminate\Support\Str;
1314

1415
/**
1516
* Class WebhookCall
@@ -52,7 +53,7 @@ public static function storeWebhook(WebhookConfig $config, Request $request): We
5253

5354
return self::create([
5455
'name' => $config->name,
55-
'url' => $request->fullUrl(),
56+
'url' => Str::limit($request->fullUrl(), 252),
5657
'headers' => $headers,
5758
'payload' => $request->input(),
5859
'exception' => null,

tests/Unit/WebhookCallTest.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
namespace Spatie\WebhookClient\Tests\Unit;
4+
5+
use Illuminate\Http\Request;
6+
use Spatie\WebhookClient\Models\WebhookCall;
7+
use Spatie\WebhookClient\SignatureValidator\DefaultSignatureValidator;
8+
use Spatie\WebhookClient\Tests\TestCase;
9+
use Spatie\WebhookClient\Tests\TestClasses\ProcessWebhookJobTestClass;
10+
use Spatie\WebhookClient\WebhookConfig;
11+
use Spatie\WebhookClient\WebhookProfile\ProcessEverythingWebhookProfile;
12+
13+
class WebhookCallTest extends TestCase
14+
{
15+
/** @test */
16+
public function it_stores_url_without_truncation_when_under_255_characters()
17+
{
18+
$url = 'https://example.com/webhook?param=value';
19+
$request = Request::create($url);
20+
$config = new WebhookConfig([
21+
'name' => 'test',
22+
'signing_secret' => 'test',
23+
'signature_header_name' => 'test',
24+
'signature_validator' => DefaultSignatureValidator::class,
25+
'webhook_profile' => ProcessEverythingWebhookProfile::class,
26+
'webhook_response' => null,
27+
'webhook_model' => WebhookCall::class,
28+
'store_headers' => [],
29+
'process_webhook_job' => ProcessWebhookJobTestClass::class
30+
]);
31+
32+
$webhookCall = WebhookCall::storeWebhook($config, $request);
33+
34+
$this->assertEquals($url, $webhookCall->url);
35+
}
36+
37+
/** @test */
38+
public function it_truncates_url_when_exceeding_255_characters()
39+
{
40+
$baseUrl = 'https://example.com/webhook?';
41+
$params = [];
42+
for ($i = 0; $i < 100; $i++) {
43+
$params[] = "param{$i}=" . str_repeat('x', 10);
44+
}
45+
$longUrl = $baseUrl . implode('&', $params);
46+
$request = Request::create($longUrl);
47+
$config = new WebhookConfig([
48+
'name' => 'test',
49+
'signing_secret' => 'test',
50+
'signature_header_name' => 'test',
51+
'signature_validator' => DefaultSignatureValidator::class,
52+
'webhook_profile' => ProcessEverythingWebhookProfile::class,
53+
'webhook_response' => null,
54+
'webhook_model' => WebhookCall::class,
55+
'store_headers' => [],
56+
'process_webhook_job' => ProcessWebhookJobTestClass::class
57+
]);
58+
59+
$webhookCall = WebhookCall::storeWebhook($config, $request);
60+
61+
$this->assertLessThanOrEqual(255, strlen($webhookCall->url));
62+
$this->assertStringEndsWith('...', $webhookCall->url);
63+
}
64+
}

0 commit comments

Comments
 (0)