def auth_flow(self, request: Request) -> Generator[Request, Response, None]: """ Update the request. :param request: A request to be updated with OAuth parameters. """ oauth_parameters = self.oauth_base_parameters hmac_message_query_string = str( QueryParams( sorted( chain( QueryParams(request.url.query).items(), (QueryParams(request.content.decode()).items() if request.method == 'POST' and request.headers.get('content-type') == 'application/x-www-form-urlencoded' else []), oauth_parameters.items(), )))) oauth_parameters['oauth_signature'] = b64encode(s=hmac_new( key='&'.join([ quote(string=self.consumer_secret, safe=b"~"), quote(string=self.oauth_access_token_secret or '', safe=b"~") ]).encode(), msg='&'.join( quote(string=element, safe=b'~') for element in (request.method.upper(), f'{request.url.scheme}://{request.url.host}{request.url.path}', hmac_message_query_string)).encode(), digestmod=sha1).digest()).decode() # The OAuth parameters are added to the query. request.url = URL(url=request.url, params=oauth_parameters) # request.headers['Authorization'] = 'OAuth ' + ', '.join([ # f'{key}="{value}"' for key, value in oauth_parameters.items()] # ) yield request
def _patch_dispatcher( self, dispatch: typing.Union[SyncDispatcher, AsyncDispatcher], request: Request) -> typing.Iterator[typing.Callable]: patchers = [] # 1. Match request against added patterns httpx_mock, pattern, response = self._match(request) if response is not None: # 2. Patch request url with response for later pickup in patched dispatcher request.url = URLResponse(request.url, response) backend = getattr(dispatch, "backend", None) if isinstance(backend, ConcurrencyBackend): # 3A. Concurrency dispatcher -> Patch backend streams mockers: typing.List[typing.Tuple[ typing.Any, str, typing.Callable]] = [ (backend, "open_tcp_stream", self.__Backend__open_tcp_stream__mock), (backend, "open_uds_stream", self.__Backend__open_uds_stream__mock), ] elif isinstance(dispatch, SyncDispatcher): # 3B. Synchronous dispatcher -> Patch send() mockers = [(dispatch, "send", self.__SyncDispatcher__send__mock)] else: # 3C. Asyncronous dispatcher -> Patch send() mockers = [(dispatch, "send", self.__AsyncDispatcher__send__mock)] for obj, target, mocker in mockers: patcher = asynctest.mock.patch.object(obj, target, mocker) patcher.start() patchers.append(patcher) try: yield partial(httpx_mock._capture, pattern=pattern) finally: # 4. Stop patching for patcher in patchers: patcher.stop()