diff --git a/htdocs/core/triggers/interface_95_modWebhook_WebhookTriggers.class.php b/htdocs/core/triggers/interface_95_modWebhook_WebhookTriggers.class.php index 5044088c06d..77074431854 100644 --- a/htdocs/core/triggers/interface_95_modWebhook_WebhookTriggers.class.php +++ b/htdocs/core/triggers/interface_95_modWebhook_WebhookTriggers.class.php @@ -133,6 +133,14 @@ class InterfaceWebhookTriggers extends DolibarrTriggers $nbPosts++; } else { $errormsg = "The WebHook for triggercode ".$action." failed to do the GET URL ".$tmpobject->url." with httpcode=".(!empty($response['http_code']) ? $response['http_code'] : "")." curl_error_no=".(!empty($response['curl_error_no']) ? $response['curl_error_no'] : ""); + // getURLContent returns http_code 400 with an explanation in $response['content'] + // when the host is rejected by the SSRF protection (private/reserved range, local + // network, metadata server, ...). Surface that explanation so the operator can + // either fix the target URL or enable $dolibarr_allow_localurl_for_webhooks in + // conf.php when the target is on a trusted local network. + if (empty($response['curl_error_no']) && !empty($response['http_code']) && $response['http_code'] == 400 && !empty($response['content'])) { + $errormsg .= " - ".$response['content']; + } $errorforhistory ++; if ($tmpobject->type == Target::TYPE_BLOCKING) {