Merge pull request #1415 from albertsun/feature/request-headers-in-web-request

Pass request headers to receive_web_request

Andrew Cantino лет %!s(int64=8): %!d(string=назад)
Родитель
Сommit
ee504ba067
3 измененных файлов с 55 добавлено и 6 удалено
  1. 3 2
      app/controllers/web_requests_controller.rb
  2. 12 2
      app/models/agent.rb
  3. 40 2
      spec/models/agent_spec.rb

+ 3 - 2
app/controllers/web_requests_controller.rb

@@ -24,7 +24,8 @@ class WebRequestsController < ApplicationController
24 24
     if user
25 25
       agent = user.agents.find_by_id(params[:agent_id])
26 26
       if agent
27
-        content, status, content_type = agent.trigger_web_request(params.except(:action, :controller, :agent_id, :user_id, :format), request.method_symbol.to_s, request.format.to_s)
27
+        content, status, content_type = agent.trigger_web_request(request)
28
+
28 29
         if content.is_a?(String)
29 30
           render :text => content, :status => status || 200, :content_type => content_type || 'text/plain'
30 31
         elsif content.is_a?(Hash)
@@ -46,7 +47,7 @@ class WebRequestsController < ApplicationController
46 47
       secret = params[:secret]
47 48
       user.agents.of_type(Agents::UserLocationAgent).each { |agent|
48 49
         if agent.options[:secret] == secret
49
-          agent.trigger_web_request(params.except(:action, :controller, :user_id, :format), request.method_symbol.to_s, request.format.to_s)
50
+          agent.trigger_web_request(request)
50 51
         end
51 52
       }
52 53
       render :text => "ok"

+ 12 - 2
app/models/agent.rb

@@ -100,6 +100,10 @@ class Agent < ActiveRecord::Base
100 100
     ["not implemented", 404]
101 101
   end
102 102
 
103
+  # alternate method signature for receive_web_request
104
+  # def receive_web_request(request=ActionDispatch::Request.new( ... ))
105
+  # end
106
+
103 107
   # Implement me in your subclass to decide if your Agent is working.
104 108
   def working?
105 109
     raise "Implement me in your subclass"
@@ -149,7 +153,8 @@ class Agent < ActiveRecord::Base
149 153
     end
150 154
   end
151 155
 
152
-  def trigger_web_request(params, method, format)
156
+  def trigger_web_request(request)
157
+    params = request.params.except(:action, :controller, :agent_id, :user_id, :format)
153 158
     if respond_to?(:receive_webhook)
154 159
       Rails.logger.warn "DEPRECATED: The .receive_webhook method is deprecated, please switch your Agent to use .receive_web_request."
155 160
       receive_webhook(params).tap do
@@ -157,7 +162,12 @@ class Agent < ActiveRecord::Base
157 162
         save!
158 163
       end
159 164
     else
160
-      receive_web_request(params, method, format).tap do
165
+      if method(:receive_web_request).arity == 1
166
+        handled_request = receive_web_request(request)
167
+      else
168
+        handled_request = receive_web_request(params, request.method_symbol.to_s, request.format.to_s)
169
+      end
170
+      handled_request.tap do
161 171
         self.last_web_request_at = Time.now
162 172
         save!
163 173
       end

+ 40 - 2
spec/models/agent_spec.rb

@@ -736,12 +736,44 @@ describe Agent do
736 736
       end
737 737
 
738 738
       it "calls the .receive_web_request hook, updates last_web_request_at, and saves" do
739
-        @agent.trigger_web_request({ :some_param => "some_value" }, "post", "text/html")
739
+        request = ActionDispatch::Request.new({
740
+          'action_dispatch.request.request_parameters' => { :some_param => "some_value" },
741
+          'REQUEST_METHOD' => "POST",
742
+          'HTTP_ACCEPT' => 'text/html'
743
+        })
744
+
745
+        @agent.trigger_web_request(request)
740 746
         expect(@agent.reload.memory['last_request']).to eq([ { "some_param" => "some_value" }, "post", "text/html" ])
741 747
         expect(@agent.last_web_request_at.to_i).to be_within(1).of(Time.now.to_i)
742 748
       end
743 749
     end
744 750
 
751
+    context "when .receive_web_request is defined with just request" do
752
+      before do
753
+        @agent = Agents::WebRequestReceiver.new(:name => "something")
754
+        @agent.user = users(:bob)
755
+        @agent.save!
756
+
757
+        def @agent.receive_web_request(request)
758
+          memory['last_request'] = [request.params, request.method_symbol.to_s, request.format, {'HTTP_X_CUSTOM_HEADER' => request.headers['HTTP_X_CUSTOM_HEADER']}]
759
+          ['Ok!', 200]
760
+        end
761
+      end
762
+
763
+      it "calls the .trigger_web_request with headers, and they get passed to .receive_web_request" do
764
+        request = ActionDispatch::Request.new({
765
+          'action_dispatch.request.request_parameters' => { :some_param => "some_value" },
766
+          'REQUEST_METHOD' => "POST",
767
+          'HTTP_ACCEPT' => 'text/html',
768
+          'HTTP_X_CUSTOM_HEADER' => "foo"
769
+        })
770
+
771
+        @agent.trigger_web_request(request)
772
+        expect(@agent.reload.memory['last_request']).to eq([ { "some_param" => "some_value" }, "post", "text/html", {'HTTP_X_CUSTOM_HEADER' => "foo"} ])
773
+        expect(@agent.last_web_request_at.to_i).to be_within(1).of(Time.now.to_i)
774
+      end
775
+    end
776
+
745 777
     context "when .receive_webhook is defined" do
746 778
       before do
747 779
         @agent = Agents::WebRequestReceiver.new(:name => "something")
@@ -755,8 +787,14 @@ describe Agent do
755 787
       end
756 788
 
757 789
       it "outputs a deprecation warning and calls .receive_webhook with the params" do
790
+        request = ActionDispatch::Request.new({
791
+          'action_dispatch.request.request_parameters' => { :some_param => "some_value" },
792
+          'REQUEST_METHOD' => "POST",
793
+          'HTTP_ACCEPT' => 'text/html'
794
+        })
795
+
758 796
         mock(Rails.logger).warn("DEPRECATED: The .receive_webhook method is deprecated, please switch your Agent to use .receive_web_request.")
759
-        @agent.trigger_web_request({ :some_param => "some_value" }, "post", "text/html")
797
+        @agent.trigger_web_request(request)
760 798
         expect(@agent.reload.memory['last_webhook_request']).to eq({ "some_param" => "some_value" })
761 799
         expect(@agent.last_web_request_at.to_i).to be_within(1).of(Time.now.to_i)
762 800
       end