Skip to content

Commit

Permalink
Allow HTTP headers to be supplied for outcome request
Browse files Browse the repository at this point in the history
  • Loading branch information
hmoffatt committed Aug 18, 2021
1 parent f7ca2af commit 02d4d86
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
14 changes: 9 additions & 5 deletions src/lti/outcome_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import requests
from requests_oauthlib import OAuth1
from requests_oauthlib.oauth1_auth import SIGNATURE_TYPE_AUTH_HEADER
from requests.structures import CaseInsensitiveDict

from .outcome_response import OutcomeResponse
from .utils import InvalidLTIConfigError
Expand Down Expand Up @@ -37,7 +38,7 @@ class OutcomeRequest(object):
they each use it differently. The TP will use it to POST an OAuth-signed
request to the TC. A TC will use it to parse such a request from a TP.
'''
def __init__(self, opts=defaultdict(lambda: None)):
def __init__(self, opts=defaultdict(lambda: None), headers=None):
# Initialize all our accessors to None
for attr in VALID_ATTRIBUTES:
setattr(self, attr, None)
Expand All @@ -51,15 +52,19 @@ def __init__(self, opts=defaultdict(lambda: None)):
"Invalid outcome request option: {}".format(key)
)

self.headers = CaseInsensitiveDict(headers or {})
if "Content-Type" not in self.headers:
self.headers['Content-type'] = 'application/xml'

@staticmethod
def from_post_request(post_request):
def from_post_request(post_request, headers=None):
'''
Convenience method for creating a new OutcomeRequest from a request
object.
post_request is assumed to be a Django HttpRequest object
'''
request = OutcomeRequest()
request = OutcomeRequest(headers=headers)
request.post_request = post_request
request.process_xml(post_request.body)
return request
Expand Down Expand Up @@ -140,10 +145,9 @@ def post_outcome_request(self, **kwargs):
signature_type=SIGNATURE_TYPE_AUTH_HEADER,
force_include_body=True, **kwargs)

headers = {'Content-type': 'application/xml'}
resp = requests.post(self.lis_outcome_service_url, auth=header_oauth,
data=self.generate_request_xml(),
headers=headers)
headers=self.headers)
outcome_resp = OutcomeResponse.from_post_response(resp, resp.content)
self.outcome_response = outcome_resp
return self.outcome_response
Expand Down
10 changes: 8 additions & 2 deletions tests/test_outcome_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ def test_has_required_attributes(self):
self.assertTrue(request.has_required_attributes())

def test_post_outcome_request(self):
request = OutcomeRequest()
request_headers = {"User-Agent": "unit-test"}
request = OutcomeRequest(headers=request_headers)
self.assertRaises(InvalidLTIConfigError, request.post_outcome_request)
request.consumer_key = 'consumer'
request.consumer_secret = 'secret'
Expand All @@ -126,6 +127,8 @@ def test_post_outcome_request(self):
self.assertIsInstance(resp, OutcomeResponse)
request = resp.post_response.request
self.assertTrue('authorization' in request.headers)
self.assertEqual(request.headers.get('user-agent'), b"unit-test")
self.assertEqual(request.headers.get('content-type'), b"application/xml")
auth_header = unquote(request.headers['authorization'].decode('utf-8'))
correct = ('OAuth '
'oauth_nonce="my_nonce", oauth_timestamp="1234567890", '
Expand All @@ -141,8 +144,11 @@ def test_from_post_request(self):
data=REPLACE_RESULT_XML,
content_type='application/xml'
)
request = OutcomeRequest.from_post_request(post_request)
request_headers = {"User-Agent": "post-request", "Content-Type": "text/xml"}
request = OutcomeRequest.from_post_request(post_request, request_headers)
self.assertEqual(request.operation, 'replaceResult')
self.assertEqual(request.lis_result_sourcedid, '261-154-728-17-784')
self.assertEqual(request.message_identifier, '123456789')
self.assertEqual(request.score, '5')
self.assertEqual(request.headers.get('User-Agent'), "post-request")
self.assertEqual(request.headers.get('Content-Type'), "text/xml")

0 comments on commit 02d4d86

Please sign in to comment.