async def test_with_challenge(challenge, expected_scope): expected_token = "expected_token" class Requests: count = 0 async def send(request): Requests.count += 1 if Requests.count == 1: # first request should be unauthorized and have no content assert not request.body assert request.headers["Content-Length"] == "0" return challenge elif Requests.count == 2: # second request should be authorized according to challenge and have the expected content assert request.headers["Content-Length"] assert request.body == expected_content assert expected_token in request.headers["Authorization"] return Mock(status_code=200) raise ValueError("unexpected request") async def get_token(*scopes): assert len(scopes) == 1 assert scopes[0] == expected_scope return AccessToken(expected_token, 0) credential = Mock(get_token=Mock(wraps=get_token)) pipeline = AsyncPipeline( policies=[AsyncChallengeAuthPolicy(credential=credential)], transport=Mock(send=send)) request = HttpRequest("POST", get_random_url()) request.set_bytes_body(expected_content) await pipeline.run(request) assert credential.get_token.call_count == 1
def test_request_data(self): request = HttpRequest("GET", "/") data = "Lots of dataaaa" request.set_bytes_body(data) self.assertEqual(request.data, data) self.assertEqual(request.headers.get("Content-Length"), "15")
def test_request_data(): request = HttpRequest("GET", "/") data = "Lots of dataaaa" request.set_bytes_body(data) assert request.data == data assert request.headers.get("Content-Length") == "15"
def test_http_request_serialization(): # Method + Url request = HttpRequest("DELETE", "/container0/blob0") serialized = request.serialize() expected = ( b'DELETE /container0/blob0 HTTP/1.1\r\n' # No headers b'\r\n' ) assert serialized == expected # Method + Url + Headers request = HttpRequest( "DELETE", "/container0/blob0", # Use OrderedDict to get consistent test result on 3.5 where order is not guaranted headers=OrderedDict({ "x-ms-date": "Thu, 14 Jun 2018 16:46:54 GMT", "Authorization": "SharedKey account:G4jjBXA7LI/RnWKIOQ8i9xH4p76pAQ+4Fs4R1VxasaE=", "Content-Length": "0", }) ) serialized = request.serialize() expected = ( b'DELETE /container0/blob0 HTTP/1.1\r\n' b'x-ms-date: Thu, 14 Jun 2018 16:46:54 GMT\r\n' b'Authorization: SharedKey account:G4jjBXA7LI/RnWKIOQ8i9xH4p76pAQ+4Fs4R1VxasaE=\r\n' b'Content-Length: 0\r\n' b'\r\n' ) assert serialized == expected # Method + Url + Headers + Body request = HttpRequest( "DELETE", "/container0/blob0", headers={ "x-ms-date": "Thu, 14 Jun 2018 16:46:54 GMT", }, ) request.set_bytes_body(b"I am groot") serialized = request.serialize() expected = ( b'DELETE /container0/blob0 HTTP/1.1\r\n' b'x-ms-date: Thu, 14 Jun 2018 16:46:54 GMT\r\n' b'Content-Length: 10\r\n' b'\r\n' b'I am groot' ) assert serialized == expected
def test_response_deserialization(): # Method + Url request = HttpRequest("DELETE", "/container0/blob0") body = ( b'HTTP/1.1 202 Accepted\r\n' b'x-ms-request-id: 778fdc83-801e-0000-62ff-0334671e284f\r\n' b'x-ms-version: 2018-11-09\r\n' ) response = _deserialize_response(body, request) assert response.status_code == 202 assert response.reason == "Accepted" assert response.headers == { 'x-ms-request-id': '778fdc83-801e-0000-62ff-0334671e284f', 'x-ms-version': '2018-11-09' } # Method + Url + Headers + Body request = HttpRequest( "DELETE", "/container0/blob0", headers={ "x-ms-date": "Thu, 14 Jun 2018 16:46:54 GMT", }, ) request.set_bytes_body(b"I am groot") body = ( b'HTTP/1.1 200 OK\r\n' b'x-ms-request-id: 778fdc83-801e-0000-62ff-0334671e284f\r\n' b'x-ms-version: 2018-11-09\r\n' b'\r\n' b'I am groot' ) response = _deserialize_response(body, request) assert isinstance(response.status_code, int) assert response.reason == "OK" assert response.headers == { 'x-ms-request-id': '778fdc83-801e-0000-62ff-0334671e284f', 'x-ms-version': '2018-11-09' } assert response.text() == "I am groot"
def post(self, url, params=None, data=None, headers=None, **kwargs): # pylint:disable=unused-argument # type: (str, Optional[Dict[str, str]], RequestData, Optional[Dict[str, str]], **Any) -> MsalResponse request = HttpRequest("POST", url, headers=headers) if params: request.format_parameters(params) if data: if isinstance(data, dict): request.headers["Content-Type"] = "application/x-www-form-urlencoded" request.set_formdata_body(data) elif isinstance(data, six.text_type): body_bytes = six.ensure_binary(data) request.set_bytes_body(body_bytes) else: raise ValueError('expected "data" to be text or a dict') response = self._pipeline.run(request, stream=False, retry_on_methods=_POST) self._store_auth_error(response) return MsalResponse(response)