octobercms/october · error · ApplicationException
system::lang.server.response_invalid
system::lang.server.response_invalid
Error message
Invalid response from the server.
What it means
After a 200 response, requestServerData() decodes the gateway body with @json_decode; the catch around it throws 'Invalid response from the server' (system::lang.server.response_invalid) if decoding raises. This indicates the update server returned something that is not valid JSON — an HTML error page, a serialized blob, or a truncated body. It is the 'server answered but spoke the wrong protocol' branch of the updater's response validation.
Source
Thrown at modules/system/classes/updatemanager/HasGatewayAccess.php:62
if ($result->status() === 404) {
throw new ApplicationException(Lang::get('system::lang.server.response_not_found'));
}
if ($result->status() !== 200) {
throw new ApplicationException(
strlen($contents)
? $contents
: Lang::get('system::lang.server.response_empty')
);
}
$resultData = false;
try {
$resultData = @json_decode($contents, true);
}
catch (Exception $ex) {
throw new ApplicationException(Lang::get('system::lang.server.response_invalid'));
}
if ($resultData === false || (is_string($resultData) && !strlen($resultData))) {
throw new ApplicationException(Lang::get('system::lang.server.response_invalid'));
}
return $resultData;
}
/**
* requestServerFile downloads a file from the update server.
* @param string $uri
* @param string $fileCode
* @param array $postData
*/
public function requestServerFile($uri, $fileCode, $postData = [])
{
$filePath = $this->getFilePath($fileCode);View on GitHub (pinned to b608633a7e)
Solutions
- Capture the raw response (curl the same endpoint) and inspect what is actually returned instead of JSON
- If a captive portal or proxy injects HTML, fix the network path or proxy exclusions for the gateway host
- For custom gateways, ensure every endpoint the updater hits emits application/json only
- Verify the body isn't truncated by TLS inspection or output compression middleware
Defensive patterns
Strategy: try-catch
Try / catch
try {
$response = \System\Classes\UpdateManager::instance()->requestServerData($uri, $postData);
} catch (\October\Rain\Exception\ApplicationException $ex) {
if (str_contains($ex->getMessage(), 'Invalid response')) {
// gateway spoke non-JSON (captive portal/proxy) — log the context, don't retry blindly
Log::warning('Update gateway returned non-JSON payload', ['uri' => $uri]);
}
throw $ex;
} Prevention
- Verify server egress reaches the gateway cleanly (no captive portals/WAF interstitials)
- For custom gateways, assert Content-Type: application/json on every updater route in tests
- Keep a curl-based health check for gateway endpoints in your monitoring
When it happens
Trigger: Gateway returns 200 with HTML (captive portal, login page, proxy interstitial), partially downloaded body, or BOM/prefix noise before the JSON; any update/marketplace request going through requestServerData().
Common situations: Captive Wi-Fi / hotel portal intercepting HTTPS; a custom update server returning rendered pages on some routes; response compression or charset issues corrupting the body; ISP-level content rewriting.
Related errors
- system::lang.server.response_invalid
- system::lang.server.response_not_found
- system::lang.server.response_empty
- system::lang.server.response_empty
- Broken JSON boolean body near ${str}
AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21).
Data as JSON: /api/errors/103b6532f9c4b03f.
Report an issue: GitHub.