From 7cefdb49eb460e87e3c3b827af32ae1b6834c4da Mon Sep 17 00:00:00 2001
From: Robert Schilling <rschilling@student.tugraz.at>
Date: Tue, 29 Jul 2014 11:49:46 +0200
Subject: [PATCH] Prevent 500 if hook url is down, fixes #7376

---
 app/controllers/projects/hooks_controller.rb |  9 +++++++--
 app/services/test_hook_service.rb            |  3 +++
 features/project/hooks.feature               |  6 ++++++
 features/steps/project/hooks.rb              | 12 ++++++++++++
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/app/controllers/projects/hooks_controller.rb b/app/controllers/projects/hooks_controller.rb
index c8269ed99ce..cab8fd76e6c 100644
--- a/app/controllers/projects/hooks_controller.rb
+++ b/app/controllers/projects/hooks_controller.rb
@@ -25,8 +25,13 @@ class Projects::HooksController < Projects::ApplicationController
 
   def test
     if !@project.empty_repo?
-      TestHookService.new.execute(hook, current_user)
-      flash[:notice] = 'Hook successfully executed.'
+      status = TestHookService.new.execute(hook, current_user)
+      if status
+        flash[:notice] = 'Hook successfully executed.'
+      else
+        flash[:alert] = 'Hook execution failed. '\
+                        'Ensure hook URL is correct and service is up.'
+      end
     else
       flash[:alert] = 'Hook execution failed. Ensure the project has commits.'
     end
diff --git a/app/services/test_hook_service.rb b/app/services/test_hook_service.rb
index 17d86a7a274..b6b1ef29b51 100644
--- a/app/services/test_hook_service.rb
+++ b/app/services/test_hook_service.rb
@@ -2,5 +2,8 @@ class TestHookService
   def execute(hook, current_user)
     data = GitPushService.new.sample_data(hook.project, current_user)
     hook.execute(data)
+    true
+  rescue SocketError
+    false
   end
 end
diff --git a/features/project/hooks.feature b/features/project/hooks.feature
index 52e02a890dd..1a60846a23e 100644
--- a/features/project/hooks.feature
+++ b/features/project/hooks.feature
@@ -24,3 +24,9 @@ Feature: Project Hooks
     And I visit project hooks page
     When I click test hook button
     Then I should see hook error message
+
+  Scenario: I test a hook on down URL
+    Given project has hook
+    And I visit project hooks page
+    When I click test hook button with invalid URL
+    Then I should see hook service down error message
diff --git a/features/steps/project/hooks.rb b/features/steps/project/hooks.rb
index 30da589260d..2bd383676e7 100644
--- a/features/steps/project/hooks.rb
+++ b/features/steps/project/hooks.rb
@@ -38,6 +38,11 @@ class ProjectHooks < Spinach::FeatureSteps
     click_link 'Test Hook'
   end
 
+  step 'I click test hook button with invalid URL' do
+    stub_request(:post, @hook.url).to_raise(SocketError)
+    click_link 'Test Hook'
+  end
+
   step 'hook should be triggered' do
     page.current_path.should == project_hooks_path(current_project)
     page.should have_selector '.flash-notice',
@@ -49,4 +54,11 @@ class ProjectHooks < Spinach::FeatureSteps
                               text: 'Hook execution failed. '\
                               'Ensure the project has commits.'
   end
+
+  step 'I should see hook service down error message' do
+    page.should have_selector '.flash-alert',
+                              text: 'Hook execution failed. '\
+                                    'Ensure hook URL is correct and '\
+                                    'service is up.'
+  end
 end
-- 
GitLab