Exemple #1
0
    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
Exemple #2
0
    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()