Skip to content

Commit a5ccf49

Browse files
authored
Merge pull request #39 from Mastercard/feature/sign-prepared-request
OAuthSigner.sign_request can sign Request and PreparedRequest objects
2 parents 9b75ff9 + 5a548c4 commit a5ccf49

File tree

3 files changed

+37
-10
lines changed

3 files changed

+37
-10
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ Usage briefly described below, but you can also refer to the test project for ex
9595

9696
#### Requests: HTTP for Humans™ <a name="requests"></a>
9797

98-
You can sign [request](https://2.python-requests.org/en/v1.0.0/user/quickstart/#make-a-request) objects using the `OAuthSigner` class.
98+
You can sign [request](https://docs.python-requests.org/en/latest/user/quickstart#make-a-request) objects using the `OAuthSigner` class.
9999

100100
Usage:
101101
```python

oauth1/signer.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2626
# SUCH DAMAGE.
2727
#
28+
from requests import PreparedRequest
29+
2830
from oauth1.oauth import OAuth
2931

3032

@@ -35,8 +37,9 @@ def __init__(self, consumer_key, signing_key):
3537
self.signing_key = signing_key
3638

3739
def sign_request(self, uri, request):
40+
body = request.body if isinstance(request, PreparedRequest) else request.data
3841
# Generates the OAuth header for the request, adds the header to the request and returns the request object
39-
oauth_key = OAuth.get_authorization_header(uri, request.method, request.data, self.consumer_key,
42+
oauth_key = OAuth.get_authorization_header(uri, request.method, body, self.consumer_key,
4043
self.signing_key)
4144
request.headers["Authorization"] = oauth_key
4245
return request

tests/test_signer.py

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,52 @@
2727
# SUCH DAMAGE.
2828
#
2929
import unittest
30-
from requests import Request
31-
from oauth1.signer import OAuthSigner
30+
from unittest.mock import patch
31+
32+
import requests
33+
from requests import Request, Session
34+
from requests.auth import AuthBase
35+
3236
import oauth1.authenticationutils as authenticationutils
37+
from oauth1.signer import OAuthSigner
3338

3439

3540
class SignerTest(unittest.TestCase):
41+
signing_key = authenticationutils.load_signing_key('./test_key_container.p12', "Password1")
42+
consumer_key = 'dummy'
43+
uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"
3644

3745
def test_sign_request(self):
38-
signing_key = authenticationutils.load_signing_key('./test_key_container.p12', "Password1")
39-
consumer_key = 'dummy'
40-
uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"
41-
4246
request = Request()
4347
request.method = "POST"
4448
request.data = ""
4549

46-
signer = OAuthSigner(consumer_key, signing_key)
47-
request = signer.sign_request(uri, request)
50+
signer = OAuthSigner(SignerTest.consumer_key, SignerTest.signing_key)
51+
request = signer.sign_request(SignerTest.uri, request)
4852
auth_header = request.headers['Authorization']
4953
self.assertTrue("OAuth" in auth_header)
5054
self.assertTrue("dummy" in auth_header)
5155

56+
@patch.object(Session, 'send')
57+
def test_sign_prepared_request(self, mock_send):
58+
class MCSigner(AuthBase):
59+
def __init__(self, consumer_key, signing_key):
60+
self.signer = OAuthSigner(consumer_key, signing_key)
61+
62+
def __call__(self, request):
63+
self.signer.sign_request(request.url, request)
64+
return request
65+
66+
signer = MCSigner(SignerTest.consumer_key, SignerTest.signing_key)
67+
requests.get(SignerTest.uri, auth=signer)
68+
69+
auth_header = (
70+
mock_send.call_args[0][0].headers if isinstance(mock_send.call_args, tuple) else mock_send.call_args.args
71+
[0].headers)['Authorization']
72+
73+
self.assertTrue("OAuth" in auth_header)
74+
self.assertTrue("oauth_consumer_key=\"dummy\"" in auth_header)
75+
5276

5377
if __name__ == '__main__':
5478
unittest.main()

0 commit comments

Comments
 (0)