em-instagram 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/lib/em-instagram/request.rb +9 -5
- data/lib/em-instagram/server.rb +29 -4
- data/lib/em-instagram/version.rb +1 -1
- data/spec/request_spec.rb +38 -0
- data/spec/server_spec.rb +1 -0
- metadata +34 -15
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
M2QyOTk3MTc1NjA0ODQ2MjljYzU2OWJhOTc2MjI5NGRkNTM1ZTkyMQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YmY5NDU1ODc3MzBlNGU5ZTA0ZWQ3MDA5YTUzMzllN2U5NDA0YTVlMA==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MmYyMDY3MzFhNGRhY2NjYTYxNDFhNWNlMzdhYTAzNzM0MmYzM2E1MDI5Mzdl
|
10
|
+
ZjljYjYxM2E4NjcxZjkxMjM1Y2MxOWU4ZGE5Y2RhMDk2YzgyYTU0NDVmZDNi
|
11
|
+
MTAxMmU0NzJjYmMwYjA2MjY4NTQ1MDIxZGMxYzZhZjZlOTQ0OGU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OWY3ODVlNThmZWJjMTNkZmJkN2I3ZDM4MmU5MmNmMjIxNWYxMjNmYjYwZDFi
|
14
|
+
NzQ1NjkyNWRhZTVhNzBjZWVmZjFlNGFmODA1NmJhOTgwNzNlNWFhMzBjMGI5
|
15
|
+
MjBhMzNmMTQyNjJhNTYxYmM3YmMyOGFlZjM3NDE5NmVkODRhN2Y=
|
data/lib/em-instagram/request.rb
CHANGED
@@ -10,11 +10,15 @@ module EventMachine
|
|
10
10
|
|
11
11
|
protected
|
12
12
|
def process_instagram_response(response)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
begin
|
14
|
+
case response.response_header.status
|
15
|
+
when 200
|
16
|
+
succeed JSON.parse(response.response)['data']
|
17
|
+
else
|
18
|
+
fail JSON.parse(response.response)['meta']['error_message']
|
19
|
+
end
|
20
|
+
rescue JSON::ParserError
|
21
|
+
fail "Invalid JSON returned: #{response.response}"
|
18
22
|
end
|
19
23
|
end
|
20
24
|
end
|
data/lib/em-instagram/server.rb
CHANGED
@@ -22,9 +22,19 @@ module EventMachine
|
|
22
22
|
response.status = 200
|
23
23
|
response.content = params['hub.challenge']
|
24
24
|
when 'POST'
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
if valid_instagram_response?
|
26
|
+
begin
|
27
|
+
@updates.push(*JSON.load(@http_post_content))
|
28
|
+
response.status = 202
|
29
|
+
response.content = 'Accepted'
|
30
|
+
rescue JSON::ParserError
|
31
|
+
response.status = 400
|
32
|
+
response.content = "Invalid JSON"
|
33
|
+
end
|
34
|
+
else
|
35
|
+
response.status = 401
|
36
|
+
response.content = "Invalid Request"
|
37
|
+
end
|
28
38
|
else
|
29
39
|
response.status = 405
|
30
40
|
response.content = 'Method Not Allowed'
|
@@ -34,7 +44,22 @@ module EventMachine
|
|
34
44
|
end
|
35
45
|
|
36
46
|
def process_update
|
37
|
-
@updates.pop { |data| subscriber.receive_notification data; EventMachine::next_tick { process_update } }
|
47
|
+
@updates.pop { |data| self.subscriber.receive_notification data; EventMachine::next_tick { process_update } }
|
48
|
+
end
|
49
|
+
|
50
|
+
def valid_instagram_response?
|
51
|
+
return false if @http_headers.to_s.size == 0
|
52
|
+
sig_arr = @http_headers.split("\x00").select do |header|
|
53
|
+
header.include?("X-Hub-Signature".downcase)
|
54
|
+
end
|
55
|
+
sig = if sig_arr.size > 0
|
56
|
+
sig_arr.first.split(":").last.strip
|
57
|
+
else
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
digest = OpenSSL::Digest::Digest.new('sha1')
|
61
|
+
verify_signature = OpenSSL::HMAC.hexdigest(digest, self.subscriber.client_secret, @http_post_content)
|
62
|
+
sig && sig == verify_signature
|
38
63
|
end
|
39
64
|
|
40
65
|
end
|
data/lib/em-instagram/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe EventMachine::Instagram::Request do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should call the succeed callback passing the data as an argument with a valid request" do
|
10
|
+
body = "{\"data\":{\"mykey\":\"myvalue\"}}"
|
11
|
+
conn = double("connection")
|
12
|
+
conn.stub(:errback)
|
13
|
+
conn.stub(:callback)
|
14
|
+
response_header = double('rheader')
|
15
|
+
response_header.stub(:status => 200)
|
16
|
+
response = double('response')
|
17
|
+
response.stub(:response_header => response_header)
|
18
|
+
response.stub(:response => body)
|
19
|
+
req = EventMachine::Instagram::Request.new(conn)
|
20
|
+
req.should_receive(:succeed).with({"mykey" => "myvalue"})
|
21
|
+
req.send(:process_instagram_response, response)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should call the fail callback if it receives invalid JSON" do
|
25
|
+
body = "<html><body>There was an error</body></html>"
|
26
|
+
conn = double("connection")
|
27
|
+
conn.stub(:errback)
|
28
|
+
conn.stub(:callback)
|
29
|
+
response_header = double('rheader')
|
30
|
+
response_header.stub(:status => 500)
|
31
|
+
response = double('response')
|
32
|
+
response.stub(:response_header => response_header)
|
33
|
+
response.stub(:response => body)
|
34
|
+
req = EventMachine::Instagram::Request.new(conn)
|
35
|
+
req.should_receive(:fail).with("Invalid JSON returned")
|
36
|
+
req.send(:process_instagram_response, response)
|
37
|
+
end
|
38
|
+
end
|
data/spec/server_spec.rb
CHANGED
@@ -49,6 +49,7 @@ describe EventMachine::Instagram::Server do
|
|
49
49
|
@response.should_receive(:status=).with(202)
|
50
50
|
@response.should_receive(:content=).with("Accepted")
|
51
51
|
server = EventMachine::ServerStub.new
|
52
|
+
server.stub(:valid_instagram_response? => true)
|
52
53
|
server.http_request_method = "POST"
|
53
54
|
server.http_post_content = json.to_json
|
54
55
|
server.updates = []
|
metadata
CHANGED
@@ -1,20 +1,45 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-instagram
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Joe Pym
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
|
-
cert_chain:
|
10
|
+
cert_chain:
|
11
|
+
- !binary |-
|
12
|
+
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJB
|
13
|
+
Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREEvTVJBd0RnWURWUVFEREFkcWIy
|
14
|
+
VXUKY0hsdE1SWXdGQVlLQ1pJbWlaUHlMR1FCR1JZR2JXOXpZV2xqTVJNd0VR
|
15
|
+
WUtDWkltaVpQeUxHUUJHUllEWTI5dApNQjRYRFRFek1ETXdOVEU0TVRrME5G
|
16
|
+
b1hEVEUwTURNd05URTRNVGswTkZvd1B6RVFNQTRHQTFVRUF3d0hhbTlsCkxu
|
17
|
+
QjViVEVXTUJRR0NnbVNKb21UOGl4a0FSa1dCbTF2YzJGcFl6RVRNQkVHQ2dt
|
18
|
+
U0pvbVQ4aXhrQVJrV0EyTnYKYlRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFB
|
19
|
+
RGdnRVBBRENDQVFvQ2dnRUJBUGFYbEVtd2JGY0czRnRLSGZOUApXdHpoZ2lJ
|
20
|
+
U0d0S1JnNkFubVdHNkFKcXNSZkNDaDBBUjhlUDRWMURBMFRWM29DRGJoamtp
|
21
|
+
Tjg0QXp0SUMzd1Q2ClpUMGdNWkwra2NwZUdVejFCT21rSmFjcC8zUE9jQUlr
|
22
|
+
VGp1dEFjTXg0N1B0WW5FSkpvd3FUYkJiYTZJYStLZEwKclVEZCtRQ2IzdS9i
|
23
|
+
MGZ4N3o5MmR2ZkZuRFdKY2lMdXlvY0dTT3pUMDBaNWRDSlV6WmNRZzA2eWFH
|
24
|
+
QlVCWlRlUAo4OTRoWXNTT2pwajJOdlpPNnBoVGlxaVZ0cm1hM0VPVVZuVDdL
|
25
|
+
cW5pZWt4QVV5Tk1BeUdhNzBRV243VURkRTNuCnpqb2xvV3NxTmI4bU85NTVj
|
26
|
+
cFdMbWFicTlEOS9XODhkYzNzUVZHK1FlcWNVTHpTTnNBSEt4MDhIZ1ZkdG03
|
27
|
+
a00KNkw4Q0F3RUFBYU01TURjd0NRWURWUjBUQkFJd0FEQWRCZ05WSFE0RUZn
|
28
|
+
UVVKbnZNNFdNcThPT3p5Q2hoSTYwTwpDdWtxQWtNd0N3WURWUjBQQkFRREFn
|
29
|
+
U3dNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFNalNNVk1uSVV2VVRFClJF
|
30
|
+
RFRYUjAyaGh3ancrb1Zzcks5Tk1YVkJZZDV5VzZ6d1RVa2l2KzI2aHllbk1S
|
31
|
+
dDdVQW85ZGF1WXlEQ2ZSVWcKTDkyK2J0NXZoYzkwRzVPeWREUUFPSCtFWnBH
|
32
|
+
Mkdlc1Fzcy9ya0ZvbTdlY3N6WWV3ZlZXSVhpeVRURWhTeXFyZQp3MGZBN1FZ
|
33
|
+
UmVVSHBlMEpiS1dmRW9CcG5QazRyL2tidHZobXZESklYdnM1TmZ6eVJyU25u
|
34
|
+
S29jRHI1T29RK2lPCldoa2ZabTFyOTgyWTRLWmg4eVI5aVp4QURQSjBVMDJn
|
35
|
+
cWkwT1ZqMjAvRCsvcjJxRkNqV2cwVjAzdTdGNDg2UkwKbkVBa3lXL3NaTjRX
|
36
|
+
Q29RbmpoeDF3MmYrd2FnVURBTzY4L0E1U0kxaUdyZVlRb3VvN1lRS0xNWC9p
|
37
|
+
WlFKYng2QwpzTERtRXdUcgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
12
38
|
date: 2013-04-03 00:00:00.000000000 Z
|
13
39
|
dependencies:
|
14
40
|
- !ruby/object:Gem::Dependency
|
15
41
|
name: eventmachine
|
16
42
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
43
|
requirements:
|
19
44
|
- - ! '>='
|
20
45
|
- !ruby/object:Gem::Version
|
@@ -22,7 +47,6 @@ dependencies:
|
|
22
47
|
type: :runtime
|
23
48
|
prerelease: false
|
24
49
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
50
|
requirements:
|
27
51
|
- - ! '>='
|
28
52
|
- !ruby/object:Gem::Version
|
@@ -30,7 +54,6 @@ dependencies:
|
|
30
54
|
- !ruby/object:Gem::Dependency
|
31
55
|
name: eventmachine_httpserver
|
32
56
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
57
|
requirements:
|
35
58
|
- - ! '>='
|
36
59
|
- !ruby/object:Gem::Version
|
@@ -38,7 +61,6 @@ dependencies:
|
|
38
61
|
type: :runtime
|
39
62
|
prerelease: false
|
40
63
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
64
|
requirements:
|
43
65
|
- - ! '>='
|
44
66
|
- !ruby/object:Gem::Version
|
@@ -46,7 +68,6 @@ dependencies:
|
|
46
68
|
- !ruby/object:Gem::Dependency
|
47
69
|
name: em-http-request
|
48
70
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
71
|
requirements:
|
51
72
|
- - ! '>='
|
52
73
|
- !ruby/object:Gem::Version
|
@@ -54,7 +75,6 @@ dependencies:
|
|
54
75
|
type: :runtime
|
55
76
|
prerelease: false
|
56
77
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
78
|
requirements:
|
59
79
|
- - ! '>='
|
60
80
|
- !ruby/object:Gem::Version
|
@@ -62,7 +82,6 @@ dependencies:
|
|
62
82
|
- !ruby/object:Gem::Dependency
|
63
83
|
name: rspec
|
64
84
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
85
|
requirements:
|
67
86
|
- - ~>
|
68
87
|
- !ruby/object:Gem::Version
|
@@ -70,7 +89,6 @@ dependencies:
|
|
70
89
|
type: :development
|
71
90
|
prerelease: false
|
72
91
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
92
|
requirements:
|
75
93
|
- - ~>
|
76
94
|
- !ruby/object:Gem::Version
|
@@ -97,36 +115,37 @@ files:
|
|
97
115
|
- spec/api/media_spec.rb
|
98
116
|
- spec/api/subscriptions_spec.rb
|
99
117
|
- spec/em-instagram_spec.rb
|
118
|
+
- spec/request_spec.rb
|
100
119
|
- spec/server_spec.rb
|
101
120
|
- spec/spec_helper.rb
|
102
121
|
homepage: ''
|
103
122
|
licenses: []
|
123
|
+
metadata: {}
|
104
124
|
post_install_message:
|
105
125
|
rdoc_options: []
|
106
126
|
require_paths:
|
107
127
|
- lib
|
108
128
|
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
-
none: false
|
110
129
|
requirements:
|
111
130
|
- - ! '>='
|
112
131
|
- !ruby/object:Gem::Version
|
113
132
|
version: '0'
|
114
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
-
none: false
|
116
134
|
requirements:
|
117
135
|
- - ! '>='
|
118
136
|
- !ruby/object:Gem::Version
|
119
137
|
version: 1.3.4
|
120
138
|
requirements: []
|
121
139
|
rubyforge_project:
|
122
|
-
rubygems_version:
|
140
|
+
rubygems_version: 2.0.3
|
123
141
|
signing_key:
|
124
|
-
specification_version:
|
142
|
+
specification_version: 4
|
125
143
|
summary: ''
|
126
144
|
test_files:
|
127
145
|
- spec/api/media_spec.rb
|
128
146
|
- spec/api/subscriptions_spec.rb
|
129
147
|
- spec/em-instagram_spec.rb
|
148
|
+
- spec/request_spec.rb
|
130
149
|
- spec/server_spec.rb
|
131
150
|
- spec/spec_helper.rb
|
132
151
|
has_rdoc:
|