From 7910adc3515b2bcfae1ba0437a67973e1490f260 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Thu, 10 Nov 2016 21:44:00 +0100 Subject: [PATCH] SONAR-8351 fix support of malformed URL --- .../webhook/WebhookCallerImpl.java | 28 +++++++++++-------- .../webhook/WebhookCallerImplTest.java | 18 +++++++++++- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookCallerImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookCallerImpl.java index 58fbf1e257c..da2a9a017b9 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookCallerImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookCallerImpl.java @@ -19,7 +19,6 @@ */ package org.sonar.server.computation.task.projectanalysis.webhook; -import java.io.IOException; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -44,25 +43,32 @@ public class WebhookCallerImpl implements WebhookCaller { @Override public WebhookDelivery call(Webhook webhook, WebhookPayload payload) { - Request.Builder request = new Request.Builder(); - request.url(webhook.getUrl()); - request.header(PROJECT_KEY_HEADER, payload.getProjectKey()); - RequestBody body = RequestBody.create(JSON, payload.toJson()); - request.post(body); - WebhookDelivery.Builder builder = new WebhookDelivery.Builder(); long startedAt = system.now(); builder .setAt(startedAt) .setPayload(payload) .setWebhook(webhook); - try (Response response = okHttpClient.newCall(request.build()).execute()) { - builder.setHttpStatus(response.code()); - builder.setDurationInMs((int)(system.now() - startedAt)); - } catch (IOException e) { + + try { + Request request = buildHttpRequest(webhook, payload); + try (Response response = okHttpClient.newCall(request).execute()) { + builder.setHttpStatus(response.code()); + builder.setDurationInMs((int) (system.now() - startedAt)); + } + } catch (Exception e) { builder.setError(e); } return builder.build(); } + private static Request buildHttpRequest(Webhook webhook, WebhookPayload payload) { + Request.Builder request = new Request.Builder(); + request.url(webhook.getUrl()); + request.header(PROJECT_KEY_HEADER, payload.getProjectKey()); + RequestBody body = RequestBody.create(JSON, payload.toJson()); + request.post(body); + return request.build(); + } + } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookCallerImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookCallerImplTest.java index ccaa5885ecd..ef4dd6d53ad 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookCallerImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookCallerImplTest.java @@ -72,7 +72,7 @@ public class WebhookCallerImplTest { } @Test - public void send_does_not_throw_exception_on_errors() throws Exception { + public void silently_catch_error_when_external_server_does_not_answer() throws Exception { Webhook webhook = new Webhook(PROJECT_UUID, CE_TASK_UUID, "my-webhook", server.url("/ping").toString()); WebhookPayload payload = new WebhookPayload("P1", "{the payload}"); @@ -87,6 +87,22 @@ public class WebhookCallerImplTest { assertThat(delivery.getPayload()).isSameAs(payload); } + @Test + public void silently_catch_error_when_url_is_incorrect() throws Exception { + Webhook webhook = new Webhook(PROJECT_UUID, CE_TASK_UUID, "my-webhook", "this_is_not_an_url"); + WebhookPayload payload = new WebhookPayload("P1", "{the payload}"); + + WebhookDelivery delivery = newSender().call(webhook, payload); + + assertThat(delivery.getHttpStatus()).isEmpty(); + assertThat(delivery.getDurationInMs()).isEmpty(); + assertThat(delivery.getError().get()).isInstanceOf(IllegalArgumentException.class); + assertThat(delivery.getErrorMessage().get()).isEqualTo("unexpected url: this_is_not_an_url"); + assertThat(delivery.getAt()).isEqualTo(NOW); + assertThat(delivery.getWebhook()).isSameAs(webhook); + assertThat(delivery.getPayload()).isSameAs(payload); + } + private WebhookCaller newSender() { SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(Version.parse("6.2"), SonarQubeSide.SERVER); return new WebhookCallerImpl(system, new OkHttpClientProvider().provide(new MapSettings(), runtime)); -- 2.39.5