apigee-oauth 0.4.0

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 (85) hide show
  1. data/.gitignore +2 -0
  2. data/HISTORY +125 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +70 -0
  5. data/Rakefile +35 -0
  6. data/TODO +32 -0
  7. data/bin/oauth +5 -0
  8. data/examples/yql.rb +44 -0
  9. data/lib/apigee-oauth.rb +12 -0
  10. data/lib/digest/hmac.rb +104 -0
  11. data/lib/oauth/cli.rb +378 -0
  12. data/lib/oauth/client.rb +4 -0
  13. data/lib/oauth/client/action_controller_request.rb +54 -0
  14. data/lib/oauth/client/em_http.rb +94 -0
  15. data/lib/oauth/client/helper.rb +91 -0
  16. data/lib/oauth/client/net_http.rb +127 -0
  17. data/lib/oauth/consumer.rb +383 -0
  18. data/lib/oauth/core_ext.rb +31 -0
  19. data/lib/oauth/errors.rb +3 -0
  20. data/lib/oauth/errors/error.rb +4 -0
  21. data/lib/oauth/errors/problem.rb +14 -0
  22. data/lib/oauth/errors/unauthorized.rb +12 -0
  23. data/lib/oauth/helper.rb +88 -0
  24. data/lib/oauth/oauth.rb +13 -0
  25. data/lib/oauth/oauth_test_helper.rb +25 -0
  26. data/lib/oauth/request_proxy.rb +24 -0
  27. data/lib/oauth/request_proxy/action_controller_request.rb +61 -0
  28. data/lib/oauth/request_proxy/base.rb +166 -0
  29. data/lib/oauth/request_proxy/curb_request.rb +55 -0
  30. data/lib/oauth/request_proxy/em_http_request.rb +67 -0
  31. data/lib/oauth/request_proxy/jabber_request.rb +41 -0
  32. data/lib/oauth/request_proxy/mock_request.rb +44 -0
  33. data/lib/oauth/request_proxy/net_http.rb +72 -0
  34. data/lib/oauth/request_proxy/rack_request.rb +40 -0
  35. data/lib/oauth/request_proxy/typhoeus_request.rb +53 -0
  36. data/lib/oauth/server.rb +66 -0
  37. data/lib/oauth/signature.rb +45 -0
  38. data/lib/oauth/signature/base.rb +110 -0
  39. data/lib/oauth/signature/hmac/base.rb +15 -0
  40. data/lib/oauth/signature/hmac/md5.rb +8 -0
  41. data/lib/oauth/signature/hmac/rmd160.rb +8 -0
  42. data/lib/oauth/signature/hmac/sha1.rb +9 -0
  43. data/lib/oauth/signature/hmac/sha2.rb +8 -0
  44. data/lib/oauth/signature/md5.rb +13 -0
  45. data/lib/oauth/signature/plaintext.rb +23 -0
  46. data/lib/oauth/signature/rsa/sha1.rb +46 -0
  47. data/lib/oauth/signature/sha1.rb +13 -0
  48. data/lib/oauth/token.rb +7 -0
  49. data/lib/oauth/tokens/access_token.rb +68 -0
  50. data/lib/oauth/tokens/consumer_token.rb +33 -0
  51. data/lib/oauth/tokens/request_token.rb +32 -0
  52. data/lib/oauth/tokens/server_token.rb +9 -0
  53. data/lib/oauth/tokens/token.rb +17 -0
  54. data/tasks/deployment.rake +34 -0
  55. data/tasks/environment.rake +7 -0
  56. data/tasks/website.rake +17 -0
  57. data/test/cases/oauth_case.rb +19 -0
  58. data/test/cases/spec/1_0-final/test_construct_request_url.rb +62 -0
  59. data/test/cases/spec/1_0-final/test_normalize_request_parameters.rb +88 -0
  60. data/test/cases/spec/1_0-final/test_parameter_encodings.rb +86 -0
  61. data/test/cases/spec/1_0-final/test_signature_base_strings.rb +77 -0
  62. data/test/integration/consumer_test.rb +304 -0
  63. data/test/keys/rsa.cert +11 -0
  64. data/test/keys/rsa.pem +16 -0
  65. data/test/test_access_token.rb +26 -0
  66. data/test/test_action_controller_request_proxy.rb +132 -0
  67. data/test/test_consumer.rb +159 -0
  68. data/test/test_curb_request_proxy.rb +76 -0
  69. data/test/test_em_http_client.rb +79 -0
  70. data/test/test_em_http_request_proxy.rb +114 -0
  71. data/test/test_helper.rb +20 -0
  72. data/test/test_hmac_sha1.rb +20 -0
  73. data/test/test_net_http_client.rb +282 -0
  74. data/test/test_net_http_request_proxy.rb +72 -0
  75. data/test/test_oauth_helper.rb +49 -0
  76. data/test/test_rack_request_proxy.rb +40 -0
  77. data/test/test_request_token.rb +51 -0
  78. data/test/test_rsa_sha1.rb +59 -0
  79. data/test/test_server.rb +40 -0
  80. data/test/test_signature.rb +22 -0
  81. data/test/test_signature_base.rb +32 -0
  82. data/test/test_signature_plain_text.rb +31 -0
  83. data/test/test_token.rb +14 -0
  84. data/test/test_typhoeus_request_proxy.rb +80 -0
  85. metadata +287 -0
@@ -0,0 +1,11 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIBpjCCAQ+gAwIBAgIBATANBgkqhkiG9w0BAQUFADAZMRcwFQYDVQQDDA5UZXN0
3
+ IFByaW5jaXBhbDAeFw03MDAxMDEwODAwMDBaFw0zODEyMzEwODAwMDBaMBkxFzAV
4
+ BgNVBAMMDlRlc3QgUHJpbmNpcGFsMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
5
+ gQC0YjCwIfYoprq/FQO6lb3asXrxLlJFuCvtinTF5p0GxvQGu5O3gYytUvtC2JlY
6
+ zypSRjVxwxrsuRcP3e641SdASwfrmzyvIgP08N4S0IFzEURkV1wp/IpH7kH41Etb
7
+ mUmrXSwfNZsnQRE5SYSOhh+LcK2wyQkdgcMv11l4KoBkcwIDAQABMA0GCSqGSIb3
8
+ DQEBBQUAA4GBAGZLPEuJ5SiJ2ryq+CmEGOXfvlTtEL2nuGtr9PewxkgnOjZpUy+d
9
+ 4TvuXJbNQc8f4AMWL/tO9w0Fk80rWKp9ea8/df4qMq5qlFWlx6yOLQxumNOmECKb
10
+ WpkUQDIDJEoFUzKMVuJf4KO/FJ345+BNLGgbJ6WujreoM1X/gYfdnJ/J
11
+ -----END CERTIFICATE-----
@@ -0,0 +1,16 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALRiMLAh9iimur8V
3
+ A7qVvdqxevEuUkW4K+2KdMXmnQbG9Aa7k7eBjK1S+0LYmVjPKlJGNXHDGuy5Fw/d
4
+ 7rjVJ0BLB+ubPK8iA/Tw3hLQgXMRRGRXXCn8ikfuQfjUS1uZSatdLB81mydBETlJ
5
+ hI6GH4twrbDJCR2Bwy/XWXgqgGRzAgMBAAECgYBYWVtleUzavkbrPjy0T5FMou8H
6
+ X9u2AC2ry8vD/l7cqedtwMPp9k7TubgNFo+NGvKsl2ynyprOZR1xjQ7WgrgVB+mm
7
+ uScOM/5HVceFuGRDhYTCObE+y1kxRloNYXnx3ei1zbeYLPCHdhxRYW7T0qcynNmw
8
+ rn05/KO2RLjgQNalsQJBANeA3Q4Nugqy4QBUCEC09SqylT2K9FrrItqL2QKc9v0Z
9
+ zO2uwllCbg0dwpVuYPYXYvikNHHg+aCWF+VXsb9rpPsCQQDWR9TT4ORdzoj+Nccn
10
+ qkMsDmzt0EfNaAOwHOmVJ2RVBspPcxt5iN4HI7HNeG6U5YsFBb+/GZbgfBT3kpNG
11
+ WPTpAkBI+gFhjfJvRw38n3g/+UeAkwMI2TJQS4n8+hid0uus3/zOjDySH3XHCUno
12
+ cn1xOJAyZODBo47E+67R4jV1/gzbAkEAklJaspRPXP877NssM5nAZMU0/O/NGCZ+
13
+ 3jPgDUno6WbJn5cqm8MqWhW1xGkImgRk+fkDBquiq4gPiT898jusgQJAd5Zrr6Q8
14
+ AO/0isr/3aa6O6NLQxISLKcPDk2NOccAfS/xOtfOz4sJYM3+Bs4Io9+dZGSDCA54
15
+ Lw03eHTNQghS0A==
16
+ -----END PRIVATE KEY-----
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestAccessToken < Test::Unit::TestCase
4
+ def setup
5
+ @fake_response = {
6
+ :user_id => 5734758743895,
7
+ :oauth_token => "key",
8
+ :oauth_token_secret => "secret"
9
+ }
10
+ # setup a fake req. token. mocking Consumer would be more appropriate...
11
+ @access_token = OAuth::AccessToken.from_hash(
12
+ OAuth::Consumer.new("key", "secret", {}),
13
+ @fake_response
14
+ )
15
+ end
16
+
17
+ def test_provides_response_parameters
18
+ assert @access_token
19
+ assert_respond_to @access_token, :params
20
+ end
21
+
22
+ def test_access_token_makes_non_oauth_response_params_available
23
+ assert_not_nil @access_token.params[:user_id]
24
+ assert_equal 5734758743895, @access_token.params[:user_id]
25
+ end
26
+ end
@@ -0,0 +1,132 @@
1
+ gem 'actionpack', '>2.2.0', '<2.3.0'
2
+ require File.dirname(__FILE__) + '/test_helper.rb'
3
+
4
+ require 'oauth/request_proxy/action_controller_request'
5
+ require 'action_controller/test_process'
6
+
7
+ class ActionControllerRequestProxyTest < Test::Unit::TestCase
8
+ def request_proxy(request_method = :get, uri_params = {}, body_params = {})
9
+ request = ActionController::TestRequest.new
10
+ request.set_REQUEST_URI('/')
11
+
12
+ case request_method
13
+ when :post
14
+ request.env['REQUEST_METHOD'] = 'POST'
15
+ when :put
16
+ request.env['REQUEST_METHOD'] = 'PUT'
17
+ end
18
+
19
+ request.env['REQUEST_URI'] = '/'
20
+ request.env['RAW_POST_DATA'] = body_params.to_query
21
+ request.env['QUERY_STRING'] = body_params.to_query
22
+ request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
23
+
24
+ yield request if block_given?
25
+ OAuth::RequestProxy.proxy(request, :parameters => uri_params)
26
+ end
27
+
28
+ def test_that_proxy_simple_get_request_works_with_query_params
29
+ request_proxy = request_proxy(:get, {'key'=>'value'})
30
+
31
+ expected_parameters = [["key", "value"]]
32
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
33
+ assert_equal 'GET', request_proxy.method
34
+ end
35
+
36
+ def test_that_proxy_simple_post_request_works_with_query_params
37
+ request_proxy = request_proxy(:post, {'key'=>'value'})
38
+
39
+ expected_parameters = [["key", "value"]]
40
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
41
+ assert_equal 'POST', request_proxy.method
42
+ end
43
+
44
+ def test_that_proxy_simple_put_request_works_with_query_params
45
+ request_proxy = request_proxy(:put, {'key'=>'value'})
46
+
47
+ expected_parameters = [["key", "value"]]
48
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
49
+ assert_equal 'PUT', request_proxy.method
50
+ end
51
+
52
+ def test_that_proxy_simple_get_request_works_with_post_params
53
+ request_proxy = request_proxy(:get, {}, {'key'=>'value'})
54
+
55
+ expected_parameters = []
56
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
57
+ assert_equal 'GET', request_proxy.method
58
+ end
59
+
60
+ def test_that_proxy_simple_post_request_works_with_post_params
61
+ request_proxy = request_proxy(:post, {}, {'key'=>'value'})
62
+
63
+ expected_parameters = [["key", "value"]]
64
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
65
+ assert_equal 'POST', request_proxy.method
66
+ end
67
+
68
+ def test_that_proxy_simple_put_request_works_with_post_params
69
+ request_proxy = request_proxy(:put, {}, {'key'=>'value'})
70
+
71
+ expected_parameters = []
72
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
73
+ assert_equal 'PUT', request_proxy.method
74
+ end
75
+
76
+ def test_that_proxy_simple_get_request_works_with_mixed_params
77
+ request_proxy = request_proxy(:get, {'key'=>'value'}, {'key2'=>'value2'})
78
+
79
+ expected_parameters = [["key", "value"]]
80
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
81
+ assert_equal 'GET', request_proxy.method
82
+ end
83
+
84
+ def test_that_proxy_simple_post_request_works_with_mixed_params
85
+ request_proxy = request_proxy(:post, {'key'=>'value'}, {'key2'=>'value2'})
86
+
87
+ expected_parameters = [["key", "value"],["key2", "value2"]]
88
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
89
+ assert_equal 'POST', request_proxy.method
90
+ end
91
+
92
+ def test_that_proxy_simple_put_request_works_with_mixed_params
93
+ request_proxy = request_proxy(:put, {'key'=>'value'}, {'key2'=>'value2'})
94
+
95
+ expected_parameters = [["key", "value"]]
96
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
97
+ assert_equal 'PUT', request_proxy.method
98
+ end
99
+
100
+ def test_parameter_keys_should_preserve_brackets_from_hash
101
+ assert_equal(
102
+ [["message[body]", "This is a test"]],
103
+ request_proxy(:post, { :message => { :body => 'This is a test' }}).parameters_for_signature
104
+ )
105
+ end
106
+
107
+ def test_parameter_values_with_amps_should_not_break_parameter_parsing
108
+ assert_equal(
109
+ [['message[body]', 'http://foo.com/?a=b&c=d']],
110
+ request_proxy(:post, { :message => { :body => 'http://foo.com/?a=b&c=d'}}).parameters_for_signature
111
+ )
112
+ end
113
+
114
+ def test_parameter_keys_should_preserve_brackets_from_array
115
+ assert_equal(
116
+ [["foo[]", "123"], ["foo[]", "456"]],
117
+ request_proxy(:post, { :foo => [123, 456] }).parameters_for_signature.sort
118
+ )
119
+ end
120
+
121
+ # TODO disabled; ActionController::TestRequest does not appear to parse
122
+ # QUERY_STRING
123
+ def x_test_query_string_parameter_values_should_be_cgi_unescaped
124
+ request = request_proxy do |r|
125
+ r.env['QUERY_STRING'] = 'url=http%3A%2F%2Ffoo.com%2F%3Fa%3Db%26c%3Dd'
126
+ end
127
+ assert_equal(
128
+ [['url', 'http://foo.com/?a=b&c=d']],
129
+ request.parameters_for_signature.sort
130
+ )
131
+ end
132
+ end
@@ -0,0 +1,159 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'mocha'
3
+
4
+ require 'stringio'
5
+
6
+ # This performs testing against Andy Smith's test server http://term.ie/oauth/example/
7
+ # Thanks Andy.
8
+ # This also means you have to be online to be able to run these.
9
+ class ConsumerTest < Test::Unit::TestCase
10
+ def setup
11
+ @consumer=OAuth::Consumer.new(
12
+ 'consumer_key_86cad9', '5888bf0345e5d237',
13
+ {
14
+ :site=>"http://blabla.bla",
15
+ :proxy=>"http://user:password@proxy.bla:8080",
16
+ :request_token_path=>"/oauth/example/request_token.php",
17
+ :access_token_path=>"/oauth/example/access_token.php",
18
+ :authorize_path=>"/oauth/example/authorize.php",
19
+ :scheme=>:header,
20
+ :http_method=>:get
21
+ })
22
+ @token = OAuth::ConsumerToken.new(@consumer,'token_411a7f', '3196ffd991c8ebdb')
23
+ @request_uri = URI.parse('http://example.com/test?key=value')
24
+ @request_parameters = { 'key' => 'value' }
25
+ @nonce = 225579211881198842005988698334675835446
26
+ @timestamp = "1199645624"
27
+ @consumer.http=Net::HTTP.new(@request_uri.host, @request_uri.port)
28
+ end
29
+
30
+ def test_initializer
31
+ assert_equal "consumer_key_86cad9",@consumer.key
32
+ assert_equal "5888bf0345e5d237",@consumer.secret
33
+ assert_equal "http://blabla.bla",@consumer.site
34
+ assert_equal "http://user:password@proxy.bla:8080",@consumer.proxy
35
+ assert_equal "/oauth/example/request_token.php",@consumer.request_token_path
36
+ assert_equal "/oauth/example/access_token.php",@consumer.access_token_path
37
+ assert_equal "http://blabla.bla/oauth/example/request_token.php",@consumer.request_token_url
38
+ assert_equal "http://blabla.bla/oauth/example/access_token.php",@consumer.access_token_url
39
+ assert_equal "http://blabla.bla/oauth/example/authorize.php",@consumer.authorize_url
40
+ assert_equal :header,@consumer.scheme
41
+ assert_equal :get,@consumer.http_method
42
+ end
43
+
44
+ def test_defaults
45
+ @consumer=OAuth::Consumer.new(
46
+ "key",
47
+ "secret",
48
+ {
49
+ :site=>"http://twitter.com"
50
+ })
51
+ assert_equal "key",@consumer.key
52
+ assert_equal "secret",@consumer.secret
53
+ assert_equal "http://twitter.com",@consumer.site
54
+ assert_nil @consumer.proxy
55
+ assert_equal "/oauth/request_token",@consumer.request_token_path
56
+ assert_equal "/oauth/access_token",@consumer.access_token_path
57
+ assert_equal "http://twitter.com/oauth/request_token",@consumer.request_token_url
58
+ assert_equal "http://twitter.com/oauth/access_token",@consumer.access_token_url
59
+ assert_equal "http://twitter.com/oauth/authorize",@consumer.authorize_url
60
+ assert_equal :header,@consumer.scheme
61
+ assert_equal :post,@consumer.http_method
62
+ end
63
+
64
+ def test_override_paths
65
+ @consumer=OAuth::Consumer.new(
66
+ "key",
67
+ "secret",
68
+ {
69
+ :site=>"http://twitter.com",
70
+ :request_token_url=>"http://oauth.twitter.com/request_token",
71
+ :access_token_url=>"http://oauth.twitter.com/access_token",
72
+ :authorize_url=>"http://site.twitter.com/authorize"
73
+ })
74
+ assert_equal "key",@consumer.key
75
+ assert_equal "secret",@consumer.secret
76
+ assert_equal "http://twitter.com",@consumer.site
77
+ assert_equal "/oauth/request_token",@consumer.request_token_path
78
+ assert_equal "/oauth/access_token",@consumer.access_token_path
79
+ assert_equal "http://oauth.twitter.com/request_token",@consumer.request_token_url
80
+ assert_equal "http://oauth.twitter.com/access_token",@consumer.access_token_url
81
+ assert_equal "http://site.twitter.com/authorize",@consumer.authorize_url
82
+ assert_equal :header,@consumer.scheme
83
+ assert_equal :post,@consumer.http_method
84
+ end
85
+
86
+ def test_that_token_response_should_be_uri_parameter_format_as_default
87
+ @consumer.expects(:request).returns(create_stub_http_response("oauth_token=token&oauth_token_secret=secret"))
88
+
89
+ hash = @consumer.token_request(:get, "")
90
+
91
+ assert_equal "token", hash[:oauth_token]
92
+ assert_equal "secret", hash[:oauth_token_secret]
93
+ end
94
+
95
+ def test_can_provided_a_block_to_interpret_token_response
96
+ @consumer.expects(:request).returns(create_stub_http_response)
97
+
98
+ hash = @consumer.token_request(:get, '') {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
99
+
100
+ assert_equal 'token', hash[:oauth_token]
101
+ assert_equal 'secret', hash[:oauth_token_secret]
102
+ end
103
+
104
+ def test_that_can_provide_a_block_to_interpret_a_request_token_response
105
+ @consumer.expects(:request).returns(create_stub_http_response)
106
+
107
+ token = @consumer.get_request_token {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
108
+
109
+ assert_equal 'token', token.token
110
+ assert_equal 'secret', token.secret
111
+ end
112
+
113
+ def test_that_block_is_not_mandatory_for_getting_an_access_token
114
+ stub_token = mock
115
+ @consumer.expects(:request).returns(create_stub_http_response("oauth_token=token&oauth_token_secret=secret"))
116
+
117
+ token = @consumer.get_access_token(stub_token)
118
+
119
+ assert_equal 'token', token.token
120
+ assert_equal 'secret', token.secret
121
+ end
122
+
123
+ def test_that_can_provide_a_block_to_interpret_an_access_token_response
124
+ stub_token = mock
125
+ @consumer.expects(:request).returns(create_stub_http_response)
126
+
127
+ token = @consumer.get_access_token(stub_token) {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
128
+
129
+ assert_equal 'token', token.token
130
+ assert_equal 'secret', token.secret
131
+ end
132
+
133
+ def test_that_not_setting_ignore_callback_will_include_oauth_callback_in_request_options
134
+ request_options = {}
135
+ @consumer.stubs(:request).returns(create_stub_http_response)
136
+
137
+ @consumer.get_request_token(request_options) {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
138
+
139
+ assert_equal 'oob', request_options[:oauth_callback]
140
+ end
141
+
142
+ def test_that_setting_ignore_callback_will_exclude_oauth_callback_in_request_options
143
+ request_options = { :exclude_callback=> true }
144
+ @consumer.stubs(:request).returns(create_stub_http_response)
145
+
146
+ @consumer.get_request_token(request_options) {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
147
+
148
+ assert_nil request_options[:oauth_callback]
149
+ end
150
+
151
+ private
152
+
153
+ def create_stub_http_response expected_body=nil
154
+ stub_http_response = stub
155
+ stub_http_response.stubs(:code).returns(200)
156
+ stub_http_response.stubs(:body).tap {|expectation| expectation.returns(expected_body) unless expected_body.nil? }
157
+ return stub_http_response
158
+ end
159
+ end
@@ -0,0 +1,76 @@
1
+ require 'test_helper'
2
+
3
+ begin
4
+ require 'oauth/request_proxy/curb_request'
5
+ require 'curb'
6
+ rescue LoadError => e
7
+ warn "! problems loading curb, skipping these tests: #{e}"
8
+ return
9
+ end
10
+
11
+
12
+ class CurbRequestProxyTest < Test::Unit::TestCase
13
+
14
+ def test_that_proxy_simple_get_request_works
15
+ request = Curl::Easy.new('/test?key=value')
16
+ request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test?key=value'})
17
+
18
+ expected_parameters = {'key' => ['value']}
19
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
20
+ assert_equal 'http://example.com/test', request_proxy.normalized_uri
21
+ end
22
+
23
+ def test_that_proxy_simple_post_request_works_with_arguments
24
+ request = Curl::Easy.new('/test')
25
+ params = {'key' => 'value'}
26
+ request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test', :parameters => params})
27
+
28
+ expected_parameters = {'key' => 'value'}
29
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
30
+ assert_equal 'http://example.com/test', request_proxy.normalized_uri
31
+ end
32
+
33
+ def test_that_proxy_simple_post_request_works_with_form_data
34
+ request = Curl::Easy.new('/test')
35
+ request.post_body = 'key=value'
36
+ request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
37
+
38
+ request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test'})
39
+
40
+ expected_parameters = {'key' => 'value'}
41
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
42
+ assert_equal 'http://example.com/test', request_proxy.normalized_uri
43
+ end
44
+
45
+ def test_that_proxy_simple_put_request_works_with_arguments
46
+ request = Curl::Easy.new('/test')
47
+ params = {'key' => 'value'}
48
+ request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test', :parameters => params})
49
+
50
+ expected_parameters = {'key' => 'value'}
51
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
52
+ assert_equal 'http://example.com/test', request_proxy.normalized_uri
53
+ end
54
+
55
+ def test_that_proxy_simple_put_request_works_with_form_data
56
+ request = Curl::Easy.new('/test')
57
+ request.post_body = 'key=value'
58
+
59
+ request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test'})
60
+
61
+ expected_parameters = {}
62
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
63
+ assert_equal 'http://example.com/test', request_proxy.normalized_uri
64
+ end
65
+
66
+ def test_that_proxy_post_request_works_with_mixed_parameter_sources
67
+ request = Curl::Easy.new('/test?key=value')
68
+ request.post_body = 'key2=value2'
69
+ request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
70
+ request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test?key=value', :parameters => {'key3' => 'value3'}})
71
+
72
+ expected_parameters = {'key' => ['value'], 'key2' => 'value2', 'key3' => 'value3'}
73
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
74
+ assert_equal 'http://example.com/test', request_proxy.normalized_uri
75
+ end
76
+ end
@@ -0,0 +1,79 @@
1
+ require 'test_helper'
2
+ begin
3
+ require 'oauth/client/em_http'
4
+ rescue LoadError => e
5
+ warn "! problem loading em-http, skipping these tests: #{e}"
6
+ return
7
+ end
8
+
9
+ class EmHttpClientTest < Test::Unit::TestCase
10
+
11
+ def setup
12
+ @consumer = OAuth::Consumer.new('consumer_key_86cad9', '5888bf0345e5d237')
13
+ @token = OAuth::Token.new('token_411a7f', '3196ffd991c8ebdb')
14
+ @request_uri = URI.parse('http://example.com/test?key=value')
15
+ @request_parameters = { 'key' => 'value' }
16
+ @nonce = 225579211881198842005988698334675835446
17
+ @timestamp = "1199645624"
18
+ # This is really unneeded I guess.
19
+ @http = Net::HTTP.new(@request_uri.host, @request_uri.port)
20
+ end
21
+
22
+ def test_that_using_auth_headers_on_get_requests_works
23
+ request = create_client
24
+ request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
25
+
26
+ assert_equal 'GET', request.method
27
+ assert_equal '/test', request.normalize_uri.path
28
+ assert_equal "key=value", request.normalize_uri.query
29
+ assert_equal_authz_headers "OAuth oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"1oO2izFav1GP4kEH2EskwXkCRFg%3D\", oauth_version=\"1.0\"", authz_header(request)
30
+ end
31
+
32
+ def test_that_using_auth_headers_on_get_requests_works_with_plaintext
33
+ require 'oauth/signature/plaintext'
34
+ c = OAuth::Consumer.new('consumer_key_86cad9', '5888bf0345e5d237',{
35
+ :signature_method => 'PLAINTEXT'
36
+ })
37
+ request = create_client
38
+ request.oauth!(@http, c, @token, {:nonce => @nonce, :timestamp => @timestamp, :signature_method => 'PLAINTEXT'})
39
+
40
+ assert_equal 'GET', request.method
41
+ assert_equal '/test', request.normalize_uri.path
42
+ assert_equal "key=value", request.normalize_uri.query
43
+ assert_equal_authz_headers "OAuth oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"PLAINTEXT\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"5888bf0345e5d237%263196ffd991c8ebdb\", oauth_version=\"1.0\"", authz_header(request)
44
+ end
45
+
46
+ def test_that_using_auth_headers_on_post_requests_works
47
+ request = create_client(:uri => "http://example.com/test", :method => "POST", :body => @request_parameters, :head => {"Content-Type" => "application/x-www-form-urlencoded"})
48
+ request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
49
+
50
+ assert_equal 'POST', request.method
51
+ assert_equal '/test', request.uri.path
52
+ assert_equal 'key=value', request.normalize_body
53
+ assert_equal_authz_headers "OAuth oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"26g7wHTtNO6ZWJaLltcueppHYiI%3D\", oauth_version=\"1.0\"", authz_header(request)
54
+ end
55
+
56
+ protected
57
+
58
+ def create_client(options = {})
59
+ method = options.delete(:method) || "GET"
60
+ uri = options.delete(:uri) || @request_uri.to_s
61
+ client = EventMachine::HttpClient.new("")
62
+ client.uri = URI.parse(uri)
63
+ client.method = method.to_s.upcase
64
+ client.options = options
65
+ client
66
+ end
67
+
68
+ def authz_header(request)
69
+ headers = request.options[:head] || {}
70
+ headers['Authorization'].to_s
71
+ end
72
+
73
+ def assert_equal_authz_headers(expected, actual)
74
+ assert !actual.nil?
75
+ assert_equal expected[0,6], actual[0, 6]
76
+ assert_equal expected[6..1].split(', ').sort, actual[6..1].split(', ').sort
77
+ end
78
+
79
+ end