@@ -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" |
@@ -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 |
@@ -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 |