linkedin 0.2.2 → 0.3.1

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.
Files changed (74) hide show
  1. data/{spec/fixtures/blank.xml → .gemtest} +0 -0
  2. data/.gitignore +36 -21
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +6 -2
  6. data/Rakefile +9 -31
  7. data/changelog.markdown +1 -1
  8. data/lib/linked_in/api/query_methods.rb +49 -0
  9. data/lib/linked_in/api/update_methods.rb +54 -0
  10. data/lib/linked_in/client.rb +44 -147
  11. data/lib/linked_in/errors.rb +20 -0
  12. data/lib/linked_in/helpers/authorization.rb +67 -0
  13. data/lib/linked_in/helpers/request.rb +77 -0
  14. data/lib/linked_in/mash.rb +68 -0
  15. data/lib/linked_in/search.rb +34 -0
  16. data/lib/linked_in/version.rb +11 -0
  17. data/lib/linkedin.rb +4 -55
  18. data/linkedin.gemspec +26 -47
  19. data/spec/cases/client_spec.rb +260 -276
  20. data/spec/cases/linkedin_spec.rb +6 -6
  21. data/spec/cases/mash_spec.rb +85 -0
  22. data/spec/cases/oauth_spec.rb +146 -92
  23. data/spec/fixtures/cassette_library/LinkedIn_Client/_authorize_from_request.yml +28 -0
  24. data/spec/fixtures/cassette_library/LinkedIn_Client/_request_token.yml +28 -0
  25. data/spec/fixtures/cassette_library/LinkedIn_Client/_request_token/with_a_callback_url.yml +28 -0
  26. data/spec/fixtures/cassette_library/LinkedIn_Client/_request_token/with_default_options.yml +28 -0
  27. data/spec/helper.rb +30 -0
  28. metadata +139 -169
  29. data/VERSION +0 -1
  30. data/lib/linked_in/api_standard_profile_request.rb +0 -17
  31. data/lib/linked_in/authorization_helpers.rb +0 -48
  32. data/lib/linked_in/base.rb +0 -13
  33. data/lib/linked_in/birthdate.rb +0 -21
  34. data/lib/linked_in/company.rb +0 -11
  35. data/lib/linked_in/connections.rb +0 -16
  36. data/lib/linked_in/country.rb +0 -9
  37. data/lib/linked_in/current_share.rb +0 -56
  38. data/lib/linked_in/education.rb +0 -41
  39. data/lib/linked_in/error.rb +0 -21
  40. data/lib/linked_in/group.rb +0 -32
  41. data/lib/linked_in/languages.rb +0 -28
  42. data/lib/linked_in/likes.rb +0 -23
  43. data/lib/linked_in/location.rb +0 -13
  44. data/lib/linked_in/message.rb +0 -20
  45. data/lib/linked_in/network.rb +0 -12
  46. data/lib/linked_in/patents.rb +0 -42
  47. data/lib/linked_in/people.rb +0 -18
  48. data/lib/linked_in/person.rb +0 -7
  49. data/lib/linked_in/phone_number.rb +0 -29
  50. data/lib/linked_in/position.rb +0 -46
  51. data/lib/linked_in/profile.rb +0 -85
  52. data/lib/linked_in/publications.rb +0 -40
  53. data/lib/linked_in/recipient.rb +0 -7
  54. data/lib/linked_in/recipients.rb +0 -18
  55. data/lib/linked_in/recommendations.rb +0 -30
  56. data/lib/linked_in/short_profile.rb +0 -13
  57. data/lib/linked_in/skill.rb +0 -33
  58. data/lib/linked_in/to_xml_helpers.rb +0 -53
  59. data/lib/linked_in/update.rb +0 -23
  60. data/lib/linked_in/url_resource.rb +0 -26
  61. data/spec/fixtures/connections.xml +0 -3733
  62. data/spec/fixtures/error.xml +0 -7
  63. data/spec/fixtures/likes.xml +0 -18
  64. data/spec/fixtures/mailbox_items.xml +0 -16
  65. data/spec/fixtures/network_status_with_group.xml +0 -44
  66. data/spec/fixtures/network_statuses.xml +0 -317
  67. data/spec/fixtures/picture_updates.xml +0 -117
  68. data/spec/fixtures/profile.xml +0 -9
  69. data/spec/fixtures/profile_full.xml +0 -3906
  70. data/spec/fixtures/profile_with_positions.xml +0 -79
  71. data/spec/fixtures/search.xml +0 -538
  72. data/spec/fixtures/shares.xml +0 -12
  73. data/spec/fixtures/status.xml +0 -2
  74. data/spec/spec_helper.rb +0 -49
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'helper'
2
2
 
3
3
  describe LinkedIn do
4
4
 
@@ -9,10 +9,10 @@ describe LinkedIn do
9
9
  end
10
10
 
11
11
  it "should be able to set the consumer token and consumer secret" do
12
- LinkedIn.token = 'consumer_token'
12
+ LinkedIn.token = 'consumer_token'
13
13
  LinkedIn.secret = 'consumer_secret'
14
14
 
15
- LinkedIn.token.should == 'consumer_token'
15
+ LinkedIn.token.should == 'consumer_token'
16
16
  LinkedIn.secret.should == 'consumer_secret'
17
17
  end
18
18
 
@@ -24,14 +24,14 @@ describe LinkedIn do
24
24
 
25
25
  it "should be able to set the consumer token and consumer secret via a configure block" do
26
26
  LinkedIn.configure do |config|
27
- config.token = 'consumer_token'
27
+ config.token = 'consumer_token'
28
28
  config.secret = 'consumer_secret'
29
29
  config.default_profile_fields = ['education', 'positions']
30
30
  end
31
31
 
32
- LinkedIn.token.should == 'consumer_token'
32
+ LinkedIn.token.should == 'consumer_token'
33
33
  LinkedIn.secret.should == 'consumer_secret'
34
34
  LinkedIn.default_profile_fields.should == ['education', 'positions']
35
35
  end
36
36
 
37
- end
37
+ end
@@ -0,0 +1,85 @@
1
+ require 'helper'
2
+
3
+ describe LinkedIn::Mash do
4
+
5
+ describe ".from_json" do
6
+ it "should convert a json string to a Mash" do
7
+ json_string = "{\"name\":\"Josh Kalderimis\"}"
8
+ mash = LinkedIn::Mash.from_json(json_string)
9
+
10
+ mash.should have_key('name')
11
+ mash.name.should == 'Josh Kalderimis'
12
+ end
13
+ end
14
+
15
+ describe "#convert_keys" do
16
+ let(:mash) do
17
+ LinkedIn::Mash.new({
18
+ 'firstName' => 'Josh',
19
+ 'LastName' => 'Kalderimis',
20
+ '_key' => 1234,
21
+ '_total' => 1234,
22
+ 'values' => {},
23
+ 'numResults' => 'total_results'
24
+ })
25
+ end
26
+
27
+ it "should convert camal cased hash keys to underscores" do
28
+ mash.should have_key('first_name')
29
+ mash.should have_key('last_name')
30
+ end
31
+
32
+ it "should convert the key _key to id" do
33
+ mash.should have_key('id')
34
+ end
35
+
36
+ it "should convert the key _total to total" do
37
+ mash.should have_key('total')
38
+ end
39
+
40
+ it "should convert the key values to all" do
41
+ mash.should have_key('all')
42
+ end
43
+
44
+ it "should convert the key numResults to total_results" do
45
+ mash.should have_key('total_results')
46
+ end
47
+ end
48
+
49
+ describe '#timestamp' do
50
+ it "should return a valid Time if a key of timestamp exists and the value is an int" do
51
+ time_mash = LinkedIn::Mash.new({ 'timestamp' => 1297083249 })
52
+
53
+ time_mash.timestamp.should be_a_kind_of(Time)
54
+ time_mash.timestamp.to_i.should == 1297083249
55
+ end
56
+
57
+ it "should return a valid Time if a key of timestamp exists and the value is an int which is greater than 9999999999" do
58
+ time_mash = LinkedIn::Mash.new({ 'timestamp' => 1297083249 * 1000 })
59
+
60
+ time_mash.timestamp.should be_a_kind_of(Time)
61
+ time_mash.timestamp.to_i.should == 1297083249
62
+ end
63
+
64
+ it "should not try to convert to a Time object if the value isn't an Integer" do
65
+ time_mash = LinkedIn::Mash.new({ 'timestamp' => 'Foo' })
66
+
67
+ time_mash.timestamp.class.should be String
68
+ end
69
+ end
70
+
71
+ describe "#to_date" do
72
+ let(:date_mash) do
73
+ LinkedIn::Mash.new({
74
+ 'year' => 2010,
75
+ 'month' => 06,
76
+ 'day' => 23
77
+ })
78
+ end
79
+
80
+ it "should return a valid Date if the keys year, month, day all exist" do
81
+ date_mash.to_date.should == Date.civil(2010, 06, 23)
82
+ end
83
+ end
84
+
85
+ end
@@ -1,109 +1,163 @@
1
- require 'spec_helper'
2
-
3
- describe "LinkedIn::Client OAuth" do
4
- let(:client) { LinkedIn::Client.new('token', 'secret') }
5
-
6
- it "should initialize with consumer token and secret" do
7
- client.ctoken.should == 'token'
8
- client.csecret.should == 'secret'
9
- end
1
+ require 'helper'
10
2
 
11
- it "should set authorization path to '/uas/oauth/authorize' by default" do
12
- client.consumer.options[:authorize_path].should == '/uas/oauth/authorize'
13
- end
3
+ describe "LinkedIn::Client" do
14
4
 
15
- it "should have a consumer" do
16
- consumer = mock('oauth consumer')
17
- options = {
18
- :request_token_path => "/uas/oauth/requestToken",
19
- :access_token_path => "/uas/oauth/accessToken",
20
- :authorize_path => "/uas/oauth/authorize",
21
- :site => 'https://api.linkedin.com'
22
- }
23
- OAuth::Consumer.should_receive(:new).with('token', 'secret', options).and_return(consumer)
24
-
25
- client.consumer.should == consumer
5
+ let(:client) do
6
+ key = ENV['LINKED_IN_CONSUMER_KEY'] || '1234'
7
+ secret = ENV['LINKED_IN_CONSUMER_SECRET'] || '1234'
8
+ LinkedIn::Client.new(key, secret)
26
9
  end
27
10
 
28
- it "should have a request token from the consumer" do
29
- options = {
30
- :request_token_path => "/uas/oauth/requestToken",
31
- :access_token_path => "/uas/oauth/accessToken",
32
- :authorize_path => "/uas/oauth/authorize",
33
- :site => 'https://api.linkedin.com'
34
- }
35
- consumer = mock('oauth consumer')
36
- request_token = mock('request token')
37
- consumer.should_receive(:get_request_token).and_return(request_token)
38
- OAuth::Consumer.should_receive(:new).with('token', 'secret', options).and_return(consumer)
39
-
40
- client.request_token.should == request_token
11
+ describe "#consumer" do
12
+ describe "default oauth options" do
13
+ let(:consumer) { client.consumer }
14
+
15
+ it "should return a configured OAuth consumer" do
16
+ consumer.site.should == ''
17
+ consumer.request_token_url.should == 'https://api.linkedin.com/uas/oauth/requestToken'
18
+ consumer.access_token_url.should == 'https://api.linkedin.com/uas/oauth/accessToken'
19
+ consumer.authorize_url.should == 'https://www.linkedin.com/uas/oauth/authorize'
20
+ end
21
+ end
22
+
23
+ describe "different api and auth hosts options" do
24
+ let(:consumer) do
25
+ LinkedIn::Client.new('1234', '1234', {
26
+ :api_host => 'https://api.josh.com',
27
+ :auth_host => 'https://www.josh.com'
28
+ }).consumer
29
+ end
30
+
31
+ it "should return a configured OAuth consumer" do
32
+ consumer.request_token_url.should == 'https://api.josh.com/uas/oauth/requestToken'
33
+ consumer.access_token_url.should == 'https://api.josh.com/uas/oauth/accessToken'
34
+ consumer.authorize_url.should == 'https://www.josh.com/uas/oauth/authorize'
35
+ end
36
+ end
37
+
38
+ describe "different oauth paths" do
39
+ let(:consumer) do
40
+ LinkedIn::Client.new('1234', '1234', {
41
+ :request_token_path => "/secure/oauth/requestToken",
42
+ :access_token_path => "/secure/oauth/accessToken",
43
+ :authorize_path => "/secure/oauth/authorize",
44
+ }).consumer
45
+ end
46
+
47
+ it "should return a configured OAuth consumer" do
48
+ consumer.request_token_url.should == 'https://api.linkedin.com/secure/oauth/requestToken'
49
+ consumer.access_token_url.should == 'https://api.linkedin.com/secure/oauth/accessToken'
50
+ consumer.authorize_url.should == 'https://www.linkedin.com/secure/oauth/authorize'
51
+ end
52
+ end
53
+
54
+ describe "specify oauth urls" do
55
+ let(:consumer) do
56
+ LinkedIn::Client.new('1234', '1234', {
57
+ :request_token_url => "https://api.josh.com/secure/oauth/requestToken",
58
+ :access_token_url => "https://api.josh.com/secure/oauth/accessToken",
59
+ :authorize_url => "https://www.josh.com/secure/oauth/authorize",
60
+ }).consumer
61
+ end
62
+
63
+ it "should return a configured OAuth consumer" do
64
+ consumer.request_token_url.should == 'https://api.josh.com/secure/oauth/requestToken'
65
+ consumer.access_token_url.should == 'https://api.josh.com/secure/oauth/accessToken'
66
+ consumer.authorize_url.should == 'https://www.josh.com/secure/oauth/authorize'
67
+ end
68
+ end
69
+
70
+ describe "use the :site option to specify the host of all oauth urls" do
71
+ let(:consumer) do
72
+ LinkedIn::Client.new('1234', '1234', {
73
+ :site => "https://api.josh.com"
74
+ }).consumer
75
+ end
76
+
77
+ it "should return a configured OAuth consumer" do
78
+ consumer.request_token_url.should == 'https://api.josh.com/uas/oauth/requestToken'
79
+ consumer.access_token_url.should == 'https://api.josh.com/uas/oauth/accessToken'
80
+ consumer.authorize_url.should == 'https://api.josh.com/uas/oauth/authorize'
81
+ end
82
+ end
41
83
  end
42
84
 
43
- it "#set_callback_url should clear the request token and set the callback url" do
44
- consumer = mock('oauth consumer')
45
- request_token = mock('request token')
46
- options = {
47
- :request_token_path => "/uas/oauth/requestToken",
48
- :access_token_path => "/uas/oauth/accessToken",
49
- :authorize_path => "/uas/oauth/authorize",
50
- :site => 'https://api.linkedin.com'
51
- }
52
- OAuth::Consumer.
53
- should_receive(:new).
54
- with('token', 'secret', options).
55
- and_return(consumer)
56
-
57
- linkedin = LinkedIn::Client.new('token', 'secret')
58
-
59
- consumer.
60
- should_receive(:get_request_token).
61
- with({:oauth_callback => 'http://myapp.com/oauth_callback'})
62
-
63
- linkedin.set_callback_url('http://myapp.com/oauth_callback')
85
+ describe "#request_token" do
86
+ describe "with default options" do
87
+ use_vcr_cassette :record => :new_episodes
88
+
89
+ it "should return a valid request token" do
90
+ request_token = client.request_token
91
+
92
+ request_token.should be_a_kind_of OAuth::RequestToken
93
+ request_token.authorize_url.should include("https://www.linkedin.com/uas/oauth/authorize?oauth_token=")
94
+
95
+ a_request(:post, "https://api.linkedin.com/uas/oauth/requestToken").should have_been_made.once
96
+ end
97
+ end
98
+
99
+ describe "with a callback url" do
100
+ use_vcr_cassette :record => :new_episodes
101
+
102
+ it "should return a valid access token" do
103
+ request_token = client.request_token(:oauth_callback => 'http://www.josh.com')
104
+
105
+ request_token.should be_a_kind_of OAuth::RequestToken
106
+ request_token.authorize_url.should include("https://www.linkedin.com/uas/oauth/authorize?oauth_token=")
107
+ request_token.callback_confirmed?.should == true
108
+
109
+ a_request(:post, "https://api.linkedin.com/uas/oauth/requestToken").should have_been_made.once
110
+ end
111
+ end
64
112
  end
65
113
 
66
- it "should be able to create access token from request token, request secret and verifier" do
67
- consumer = OAuth::Consumer.new('token', 'secret', {:site => 'https://api.linkedin.com'})
68
- client.stub(:consumer).and_return(consumer)
69
-
70
- access_token = mock('access token', :token => 'atoken', :secret => 'asecret')
71
- request_token = mock('request token')
72
- request_token.
73
- should_receive(:get_access_token).
74
- with(:oauth_verifier => 'verifier').
75
- and_return(access_token)
76
-
77
- OAuth::RequestToken.
78
- should_receive(:new).
79
- with(consumer, 'rtoken', 'rsecret').
80
- and_return(request_token)
81
-
82
- client.authorize_from_request('rtoken', 'rsecret', 'verifier')
83
- client.access_token.class.should be(OAuth::AccessToken)
84
- client.access_token.token.should == 'atoken'
85
- client.access_token.secret.should == 'asecret'
114
+ describe "#authorize_from_request" do
115
+ let(:access_token) do
116
+ # if you remove the related casssette you will need to do the following
117
+ # authorize_from_request request manually
118
+ #
119
+ # request_token = client.request_token
120
+ # puts "token : #{request_token.token} - secret #{request_token.secret}"
121
+ # puts "auth url : #{request_token.authorize_url}"
122
+ # raise 'keep note of the token and secret'
123
+ #
124
+ client.authorize_from_request('dummy-token', 'dummy-secret', 'dummy-pin')
125
+ end
126
+
127
+ use_vcr_cassette :record => :new_episodes, :match_requests_on => [:uri, :method]
128
+
129
+ it "should return a valid access token" do
130
+ access_token.should be_a_kind_of Array
131
+ access_token[0].should be_a_kind_of String
132
+ access_token[1].should be_a_kind_of String
133
+
134
+ a_request(:post, "https://api.linkedin.com/uas/oauth/accessToken").should have_been_made.once
135
+ end
86
136
  end
87
137
 
88
- it "should be able to create access token from access token and secret" do
89
- consumer = OAuth::Consumer.new('token', 'secret', {:site => 'https://api.linkedin.com'})
90
- client.stub(:consumer).and_return(consumer)
138
+ describe "#access_token" do
139
+ let(:access_token) do
140
+ client.authorize_from_access('dummy-token', 'dummy-secret')
141
+ client.access_token
142
+ end
91
143
 
92
- client.authorize_from_access('atoken', 'asecret')
93
- client.access_token.class.should be(OAuth::AccessToken)
94
- client.access_token.token.should == 'atoken'
95
- client.access_token.secret.should == 'asecret'
144
+ it "should return a valid auth token" do
145
+ access_token.should be_a_kind_of OAuth::AccessToken
146
+ access_token.token.should be_a_kind_of String
147
+ access_token.token.should be_a_kind_of String
148
+ end
96
149
  end
97
150
 
98
- it "should be able to configure consumer token and consumer secret without passing to initialize" do
99
- LinkedIn.configure do |config|
100
- config.token = 'consumer_token'
101
- config.secret = 'consumer_secret'
151
+ describe "#authorize_from_access" do
152
+ let(:auth_token) do
153
+ client.authorize_from_access('dummy-token', 'dummy-secret')
102
154
  end
103
155
 
104
- linkedin = LinkedIn::Client.new
105
- linkedin.ctoken.should == 'consumer_token'
106
- linkedin.csecret.should == 'consumer_secret'
156
+ it "should return a valid auth token" do
157
+ auth_token.should be_a_kind_of Array
158
+ auth_token[0].should be_a_kind_of String
159
+ auth_token[1].should be_a_kind_of String
160
+ end
107
161
  end
108
162
 
109
- end
163
+ end
@@ -0,0 +1,28 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: https://api.linkedin.com:443/uas/oauth/accessToken
6
+ body:
7
+ headers:
8
+ user-agent:
9
+ - OAuth gem v0.4.4
10
+ authorization:
11
+ - OAuth oauth_body_hash="2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D", oauth_consumer_key="eAI15DqRUTTd7OuQJBG3Mo0aw2Ekx5yoLX3x3NaLnbTnZbaU46OEii7uNTKijII4", oauth_nonce="ztYyddIoKJ8flDjBJyveOSqm96CLaEM4QpOC0CSW0E", oauth_signature="NSp3ZDtycelP7wsDM7dsuDTZGys%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1297095033", oauth_token="2f5b42dd-1e0e-4f8f-a03c-1e510bde5935", oauth_verifier="25038", oauth_version="1.0"
12
+ content-length:
13
+ - "0"
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ content-type:
20
+ - text/plain
21
+ server:
22
+ - Apache-Coyote/1.1
23
+ date:
24
+ - Mon, 07 Feb 2011 16:10:34 GMT
25
+ content-length:
26
+ - "156"
27
+ body: oauth_token=28774cd4-fbe1-4e6e-a05e-1243f6471933&oauth_token_secret=2fafe259-976e-41ad-a6f5-d26bbba42923&oauth_expires_in=0&oauth_authorization_expires_in=0
28
+ http_version: "1.1"
@@ -0,0 +1,28 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: https://api.linkedin.com:443/uas/oauth/requestToken
6
+ body:
7
+ headers:
8
+ user-agent:
9
+ - OAuth gem v0.4.4
10
+ authorization:
11
+ - OAuth oauth_body_hash="2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D", oauth_callback="oob", oauth_consumer_key="eAI15DqRUTTd7OuQJBG3Mo0aw2Ekx5yoLX3x3NaLnbTnZbaU46OEii7uNTKijII4", oauth_nonce="jSQpxoXaoTl2e0dALgc7VKzRJE993wqzRWuXuF0H0", oauth_signature="wn%2Bw0Jvyb9TQ4DC8sq3CxWMDM7Y%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1297093507", oauth_version="1.0"
12
+ content-length:
13
+ - "0"
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ content-type:
20
+ - text/plain
21
+ server:
22
+ - Apache-Coyote/1.1
23
+ date:
24
+ - Mon, 07 Feb 2011 15:45:08 GMT
25
+ content-length:
26
+ - "236"
27
+ body: oauth_token=95f8619b-7069-433b-ac9e-35dfba02b0f7&oauth_token_secret=dffd7996-6943-48ce-be6b-771e86b10f92&oauth_callback_confirmed=true&xoauth_request_auth_url=https%3A%2F%2Fapi.linkedin.com%2Fuas%2Foauth%2Fauthorize&oauth_expires_in=599
28
+ http_version: "1.1"
@@ -0,0 +1,28 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: https://api.linkedin.com:443/uas/oauth/requestToken
6
+ body:
7
+ headers:
8
+ user-agent:
9
+ - OAuth gem v0.4.4
10
+ authorization:
11
+ - OAuth oauth_body_hash="2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D", oauth_callback="http%3A%2F%2Fwww.josh.com", oauth_consumer_key="eAI15DqRUTTd7OuQJBG3Mo0aw2Ekx5yoLX3x3NaLnbTnZbaU46OEii7uNTKijII4", oauth_nonce="OYVkd4yi5oe16NGQMbANhBB8cabeynkTX28fOEjG1rs", oauth_signature="%2BwgZ8nb2CM5oWRpJEC5U0554uGk%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1297103790", oauth_version="1.0"
12
+ content-length:
13
+ - "0"
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ content-type:
20
+ - text/plain
21
+ server:
22
+ - Apache-Coyote/1.1
23
+ date:
24
+ - Mon, 07 Feb 2011 18:36:30 GMT
25
+ content-length:
26
+ - "236"
27
+ body: oauth_token=f8af7ca2-ca1a-48f2-be6a-bd7b721e2868&oauth_token_secret=c5ec7928-7740-4813-a202-2be8800a0b32&oauth_callback_confirmed=true&xoauth_request_auth_url=https%3A%2F%2Fapi.linkedin.com%2Fuas%2Foauth%2Fauthorize&oauth_expires_in=599
28
+ http_version: "1.1"