fix(proxy): add validation and normalization for database proxy timeout

- Extract proxy timeout configuration logic into dedicated method
- Add min:1 validation rule for publicPortTimeout
- Normalize invalid timeout values (null, 0, negative) to default 3600s
- Add tests for timeout configuration normalization and validation
This commit is contained in:
Andras Bacsai 2026-03-10 09:59:19 +01:00
parent 4615cfd007
commit 184fbb98f3
4 changed files with 34 additions and 3 deletions

View file

@ -54,8 +54,7 @@ public function handle(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|St
if (isDev()) {
$configuration_dir = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/databases/'.$database->uuid.'/proxy';
}
$timeout = $database->public_port_timeout ?? 3600;
$timeoutConfig = $timeout === 0 ? 'proxy_timeout 0;' : "proxy_timeout {$timeout}s;";
$timeoutConfig = $this->buildProxyTimeoutConfig($database->public_port_timeout);
$nginxconf = <<<EOF
user nginx;
worker_processes auto;
@ -163,4 +162,13 @@ private function isNonTransientError(string $message): bool
return false;
}
private function buildProxyTimeoutConfig(?int $timeout): string
{
if ($timeout === null || $timeout < 1) {
$timeout = 3600;
}
return "proxy_timeout {$timeout}s;";
}
}

View file

@ -92,7 +92,7 @@ class Index extends Component
'image' => 'required',
'excludeFromStatus' => 'required|boolean',
'publicPort' => 'nullable|integer',
'publicPortTimeout' => 'nullable|integer',
'publicPortTimeout' => 'nullable|integer|min:1',
'isPublic' => 'required|boolean',
'isLogDrainEnabled' => 'required|boolean',
// Application-specific rules

View file

@ -43,3 +43,15 @@
->and($method->invoke($action, 'network timeout'))->toBeFalse()
->and($method->invoke($action, 'connection refused'))->toBeFalse();
});
test('buildProxyTimeoutConfig normalizes invalid values to default', function (?int $input, string $expected) {
$action = new StartDatabaseProxy;
$method = new ReflectionMethod($action, 'buildProxyTimeoutConfig');
expect($method->invoke($action, $input))->toBe($expected);
})->with([
[null, 'proxy_timeout 3600s;'],
[0, 'proxy_timeout 3600s;'],
[-10, 'proxy_timeout 3600s;'],
[120, 'proxy_timeout 120s;'],
]);

View file

@ -0,0 +1,11 @@
<?php
use App\Livewire\Project\Service\Index;
test('service database proxy timeout requires a minimum of one second', function () {
$component = new Index;
$rules = (fn (): array => $this->rules)->call($component);
expect($rules['publicPortTimeout'])
->toContain('min:1');
});