Esempio n. 1
0
 def _prepare_request(self, request, page, user, lang, use_middlewares, use_toolbar=False):
     request.current_page = SimpleLazyObject(lambda: page)
     if not user:
         if self._login_context:
             user = self._login_context.user
         else:
             user = AnonymousUser()
     request.user = user
     request.session = {}
     request.cookies = SimpleCookie()
     request.errors = StringIO()
     request.LANGUAGE_CODE = lang
     # Let's use middleware in case requested, otherwise just use CMS toolbar if needed
     if use_middlewares:
         handler = BaseHandler()
         handler.load_middleware()
         for middleware_method in handler._request_middleware:
             if middleware_method(request):
                 raise Exception(u'Couldn\'t create request mock object -'
                                 u'request middleware returned a response')
     elif use_toolbar:
         from cms.middleware.toolbar import ToolbarMiddleware
         mid = ToolbarMiddleware()
         mid.process_request(request)
     return request
Esempio n. 2
0
def test_error_handlers(rf):
    """
    Test that SHOOP_FRONT_INSTALL_ERROR_HANDLERS installs error handlers
    without overwriting possible custom ones.
    """
    with override_settings(
            DEBUG=False,
            SHOOP_FRONT_INSTALL_ERROR_HANDLERS=True,
            MIDDLEWARE_CLASSES=[]
    ):
        with replace_urls([
            url("^aaargh/", errorful_view)
        ], {"handler404": four_oh_four}):
            resolver = get_resolver(None)
            urlconf = resolver.urlconf_module
            install_error_handlers()
            assert callable(urlconf.handler500)  # We get a new 500 handler
            assert urlconf.handler404 == four_oh_four  # Our custom 404 handler didn't get overwritten
            handler = BaseHandler()
            handler.load_middleware()
            # Test 500
            response = handler.get_response(rf.get("/aaargh/"))
            assert response.status_code == 500  # Uh oh!
            assert isinstance(response, TemplateResponse)  # Looks good!
            assert response.template_name.startswith("shoop")  # Woop!
            # Test 404
            response = handler.get_response(rf.get("/another_castle/"))
            assert response.status_code == 200  # Our custom 404 handler made it a 200!
            assert b"flesh wound" in response.content
    def test_is_authenticated(self):
        auth = DjangoAuthentication()
        request = self.factory.get("/")
        # load the middleware since django doesnt...
        from django.core.handlers.base import BaseHandler

        handler = BaseHandler()
        handler.load_middleware()
        for middleware_method in handler._request_middleware:
            self.assertIsNone(middleware_method(request))

        # not logged in should fail
        self.assertFalse(auth.is_authenticated(request))
        # not logged in should be AnonymousUser
        self.assertEquals(auth.get_identifier(request), "AnonymousUser")

        # login test user
        from django.contrib.auth import authenticate, login

        user = authenticate(username="******", password="******")
        self.assertIsNotNone(user)
        login(request, user)

        # logged in should succeed
        self.assertTrue(auth.is_authenticated(request))
        # should be janeroe logged in
        self.assertEquals(auth.get_identifier(request), "janeroe")
Esempio n. 4
0
    def request(self, **request):
        """
        Similar to parent class, but returns the request object as soon as it
        has created it.
        """
        environ = {
            'HTTP_COOKIE':       self.cookies.output(header='', sep='; '),
            'PATH_INFO':         '/',
            'QUERY_STRING':      '',
            'REMOTE_ADDR':       '127.0.0.1',
            'REQUEST_METHOD':    'GET',
            'SCRIPT_NAME':       '',
            'SERVER_NAME':       'testserver',
            'SERVER_PORT':       '80',
            'SERVER_PROTOCOL':   'HTTP/1.1',
            'wsgi.version':      (1,0),
            'wsgi.url_scheme':   'http',
            'wsgi.errors':       self.errors,
            'wsgi.multiprocess': True,
            'wsgi.multithread':  False,
            'wsgi.run_once':     False,
        }
        environ.update(self.defaults)
        environ.update(request)
        request = WSGIRequest(environ)

        # Add request.user.
        handler = BaseHandler()
        handler.load_middleware()
        for middleware_method in handler._request_middleware:
            if middleware_method(request):
                raise Exception("Couldn't create request mock object - "
                                "request middleware returned a response")

        return request
Esempio n. 5
0
    def dummy_request(self):
        """
        Construct a HttpRequest object that is, as far as possible, representative of ones that would
        receive this page as a response. Used for previewing / moderation and any other place where we
        want to display a view of this page in the admin interface without going through the regular
        page routing logic.
        """
        url = self.full_url
        if url:
            url_info = urlparse(url)
            hostname = url_info.netloc
            path = url_info.path
            port = url_info.port or 80
        else:
            hostname = 'example.com'
            path = '/'
            port = 80

        request = WSGIRequest({
            'REQUEST_METHOD': 'GET',
            'PATH_INFO': path,
            'SERVER_NAME': hostname,
            'SERVER_PORT': port,
            'wsgi.input': StringIO(),
        })

        # Apply middleware to the request - see http://www.mellowmorning.com/2011/04/18/mock-django-request-for-testing/
        handler = BaseHandler()
        handler.load_middleware()
        for middleware_method in handler._request_middleware:
            if middleware_method(request):
                raise Exception("Couldn't create request mock object - "
                                "request middleware returned a response")
        return request
Esempio n. 6
0
    def request(self, **request):
        """
        Similar to parent class, but returns the request object as soon as it
        has created it.
        """
        environ = {
            'HTTP_COOKIE': self.cookies,
            'PATH_INFO': '/',
            'QUERY_STRING': '',
            'REQUEST_METHOD': 'GET',
            'SCRIPT_NAME': '',
            'SERVER_NAME': 'testserver',
            'SERVER_PORT': 80,
            'SERVER_PROTOCOL': 'HTTP/1.1',
        }
        environ.update(self.defaults)
        environ.update(request)
        request = WSGIRequest(environ)

        # Add request.user.
        handler = BaseHandler()
        handler.load_middleware()
        for middleware_method in handler._request_middleware:
            if middleware_method(request):
                raise Exception("Couldn't create request mock object - "
                                "request middleware returned a response")

        return request
Esempio n. 7
0
    def request(self, **request_args):
        """Constructs a generic request object, INCLUDING middleware modifications."""

        from django.core import urlresolvers


        request = RequestFactory.request(self, **request_args)
        ###pprint.pprint(request)

        handler = BaseHandler()

        handler.load_middleware()

        for middleware_method in handler._request_middleware:
            #print("APPLYING REQUEST MIDDLEWARE ", middleware_method, file=sys.stderr)
            if middleware_method(request):
                raise Exception("Couldn't create request mock object - "
                                "request middleware returned a response")

        urlconf = settings.ROOT_URLCONF
        urlresolvers.set_urlconf(urlconf)
        resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)

        callback, callback_args, callback_kwargs = resolver.resolve(
                            request.path_info)

        # Apply view middleware
        for middleware_method in handler._view_middleware:
            #print("APPLYING VIEW MIDDLEWARE ", middleware_method, file=sys.stderr)
            response = middleware_method(request, callback, callback_args, callback_kwargs)
            if response:
                raise Exception("Couldn't create request mock object - "
                                "view middleware returned a response")

        return request
Esempio n. 8
0
class MessageSenderWorker(QueueProcessingWorker):
    def __init__(self):
        # type: () -> None
        super().__init__()
        self.redis_client = get_redis_client()
        self.handler = BaseHandler()
        self.handler.load_middleware()

    def consume(self, event):
        # type: (Mapping[str, Any]) -> None
        server_meta = event['server_meta']

        environ = {
            'REQUEST_METHOD': 'SOCKET',
            'SCRIPT_NAME': '',
            'PATH_INFO': '/json/messages',
            'SERVER_NAME': '127.0.0.1',
            'SERVER_PORT': 9993,
            'SERVER_PROTOCOL': 'ZULIP_SOCKET/1.0',
            'wsgi.version': (1, 0),
            'wsgi.input': StringIO(),
            'wsgi.errors': sys.stderr,
            'wsgi.multithread': False,
            'wsgi.multiprocess': True,
            'wsgi.run_once': False,
            'zulip.emulated_method': 'POST'
        }

        if 'socket_user_agent' in event['request']:
            environ['HTTP_USER_AGENT'] = event['request']['socket_user_agent']
            del event['request']['socket_user_agent']

        # We're mostly using a WSGIRequest for convenience
        environ.update(server_meta['request_environ'])
        request = WSGIRequest(environ)
        # Note: If we ever support non-POST methods, we'll need to change this.
        request._post = event['request']
        request.csrf_processing_done = True

        user_profile = get_user_profile_by_id(server_meta['user_id'])
        request._cached_user = user_profile

        resp = self.handler.get_response(request)
        server_meta['time_request_finished'] = time.time()
        server_meta['worker_log_data'] = request._log_data

        resp_content = resp.content.decode('utf-8')
        response_data = ujson.loads(resp_content)
        if response_data['result'] == 'error':
            check_and_send_restart_signal()

        result = {'response': response_data, 'req_id': event['req_id'],
                  'server_meta': server_meta}

        redis_key = req_redis_key(event['req_id'])
        self.redis_client.hmset(redis_key, {'status': 'complete',
                                            'response': resp_content})

        queue_json_publish(server_meta['return_queue'], result,
                           respond_send_message)
Esempio n. 9
0
 def request(self, **request):
     request = super(RequestFactory, self).request(**request)
     handler = BaseHandler()
     handler.load_middleware()
     for middleware_method in handler._request_middleware:
         if middleware_method(request):
             raise Exception('request middleware returned a response')
     return request
Esempio n. 10
0
 def request(self, **request):
     handler = BaseHandler()
     handler.load_middleware()
     r = WSGIRequest(self._base_environ(**request))
     for middleware_method in handler._request_middleware:
         if middleware_method(r):
             raise Exception('error on middleware {}'.format(middleware_method))
     return r
Esempio n. 11
0
 def request(self, **request):
     request = RequestFactory.request(self, **request)
     handler = BaseHandler()
     handler.load_middleware()
     for mw in handler._request_middleware:
         if mw(request):
             raise Exception('middleware returned a reponse')
     return request
 def request(self, **request):
     request = RequestFactory.request(self, **request)
     handler = BaseHandler()
     handler.load_middleware()
     for middleware_method in handler._request_middleware:
         if middleware_method(request):
             raise Exception("Couldn't create request mock object - "
                             "request middleware returned a response")
     return request
Esempio n. 13
0
 def request(self, **request):
     # https://gist.github.com/tschellenbach/925270
     request = RequestFactory.request(self, **request)
     handler = BaseHandler()
     handler.load_middleware()
     for middleware_method in handler._request_middleware:
         if middleware_method(request):
             raise Exception("Couldn't create request mock object - "
                             "request middleware returned a response")
     return request
Esempio n. 14
0
 def request(self, **request):
     "Construct a generic request object."
     request["REQUEST"] = dict()
     request = RequestFactory.request(self, **request)
     handler = BaseHandler()
     handler.load_middleware()
     for middleware_method in handler._request_middleware:
         if middleware_method(request):
             raise Exception("Couldn't create request mock object - " "request middleware returned a response")
     return request
Esempio n. 15
0
 def request(self, **request):
     "Construct a generic request object."
     request = RequestFactory.request(self, **request)
     handler = BaseHandler()
     handler.load_middleware()
     for middleware_method in handler._request_middleware:  # pylint: disable=protected-access
         if middleware_method(request):
             raise Exception("Couldn't create request mock object - "
                             "request middleware returned a response")
     return request
Esempio n. 16
0
    def make_request(self, url, with_middleware=False):
        request = self.request_factory.get(url)

        # see comments at http://djangosnippets.org/snippets/963/
        if with_middleware:
            handler = BaseHandler()
            handler.load_middleware()
            for middleware_method in handler._request_middleware:
                if middleware_method(request):
                    raise Exception("Couldn't create request mock object - " "request middleware returned a response")

        return request
Esempio n. 17
0
def get_request_mock():
    """Build a ``request`` mock that can be used for testing."""
    basehandler = BaseHandler()
    basehandler.load_middleware()
    request = WSGIRequest(
        {"REQUEST_METHOD": "GET", "SERVER_NAME": "test", "SERVER_PORT": "8000", "HTTP_HOST": "testhost"}
    )
    # Apply request middleware
    for middleware_method in basehandler._request_middleware:
        # LocaleMiddleware should never be applied a second time because
        # it would broke the current real request language
        if "LocaleMiddleware" not in str(middleware_method.im_class):
            response = middleware_method(request)
    return request
Esempio n. 18
0
 def send(self,
          request,
          stream=False,
          timeout=None,
          verify=True,
          cert=None,
          proxies=None):
     handler = BaseHandler()
     handler.load_middleware()
     wsgi_request = self.prepared_request_to_wsgi_request(request)
     http_response = handler.get_response(wsgi_request)
     requests_response = self.http_response_to_response(
         http_response, request)
     return requests_response
Esempio n. 19
0
def test_jwt_refresh_token_middleware_samesite_none(rf, customer_user,
                                                    settings):
    refresh_token = create_refresh_token(customer_user)
    settings.MIDDLEWARE = [
        "saleor.core.middleware.jwt_refresh_token_middleware",
    ]
    settings.DEBUG = False
    request = rf.request()
    request.refresh_token = refresh_token
    handler = BaseHandler()
    handler.load_middleware()
    response = handler.get_response(request)
    cookie = response.cookies.get(JWT_REFRESH_TOKEN_COOKIE_NAME)
    assert cookie["samesite"] == "None"
Esempio n. 20
0
def initialize_context() -> HttpRequest:
    """Prepare a request object for webhook subscription.

    It creates a dummy request object and initialize middleware on it. It is required
    to process a request in the same way as API logic does.
    return: HttpRequest
    """
    handler = BaseHandler()
    context = RequestFactory().request(SERVER_NAME=SimpleLazyObject(get_host))
    handler.load_middleware()
    response = handler.get_response(context)
    if not response.status_code == 200:
        raise Exception("Unable to initialize context for webhook.")
    return context
Esempio n. 21
0
 def request(self, **request):
     "Construct a generic request object."
     request = RequestFactory.request(self, **request)
     handler = BaseHandler()
     handler.load_middleware()
     # BaseHandler_request_middleware is not set in Django2.0
     # and removed in Django2.1
     if sys.version_info[0] < 2:
         for middleware_method in handler._request_middleware:
             if middleware_method(request):
                 raise Exception(
                     "Couldn't create request mock object - "
                     "request middleware returned a response"
                 )
     return request
Esempio n. 22
0
class UrlConsumer(object):
    """
    Dispatches channel HTTP requests into django's URL system.
    """
    def __init__(self):
        self.handler = BaseHandler()
        self.handler.load_middleware()

    def __call__(self, channel, **kwargs):
        request = HttpRequest.channel_decode(kwargs)
        try:
            response = self.handler.get_response(request)
        except HttpResponse.ResponseLater:
            return
        Channel(request.response_channel).send(**response.channel_encode())
Esempio n. 23
0
class MessageSenderWorker(QueueProcessingWorker):
    def __init__(self):
        # type: () -> None
        super(MessageSenderWorker, self).__init__()
        self.redis_client = get_redis_client()
        self.handler = BaseHandler()
        self.handler.load_middleware()

    def consume(self, event):
        # type: (Mapping[str, Any]) -> None
        server_meta = event['server_meta']

        environ = {'REQUEST_METHOD': 'SOCKET',
                   'SCRIPT_NAME': '',
                   'PATH_INFO': '/json/messages',
                   'SERVER_NAME': '127.0.0.1',
                   'SERVER_PORT': 9993,
                   'SERVER_PROTOCOL': 'ZULIP_SOCKET/1.0',
                   'wsgi.version': (1, 0),
                   'wsgi.input': StringIO(),
                   'wsgi.errors': sys.stderr,
                   'wsgi.multithread': False,
                   'wsgi.multiprocess': True,
                   'wsgi.run_once': False,
                   'zulip.emulated_method': 'POST'}
        # We're mostly using a WSGIRequest for convenience
        environ.update(server_meta['request_environ'])
        request = WSGIRequest(environ)
        # Note: If we ever support non-POST methods, we'll need to change this.
        request._post = event['request']
        request.csrf_processing_done = True

        user_profile = get_user_profile_by_id(server_meta['user_id'])
        request._cached_user = user_profile

        resp = self.handler.get_response(request)
        server_meta['time_request_finished'] = time.time()
        server_meta['worker_log_data'] = request._log_data

        resp_content = resp.content.decode('utf-8')
        result = {'response': ujson.loads(resp_content), 'req_id': event['req_id'],
                  'server_meta': server_meta}

        redis_key = req_redis_key(event['req_id'])
        self.redis_client.hmset(redis_key, {'status': 'complete',
                                            'response': resp_content})

        queue_json_publish(server_meta['return_queue'], result, lambda e: None)
Esempio n. 24
0
class UrlConsumer(object):
    """
    Dispatches channel HTTP requests into django's URL system.
    """

    def __init__(self):
        self.handler = BaseHandler()
        self.handler.load_middleware()

    def __call__(self, message):
        request = HttpRequest.channel_decode(message.content)
        try:
            response = self.handler.get_response(request)
        except HttpResponse.ResponseLater:
            return
        message.reply_channel.send(response.channel_encode())
Esempio n. 25
0
def test_plugins_middleware_requestor_in_plugin_when_no_app_and_user_in_req_is_none(
        rf, settings):
    settings.MIDDLEWARE = [
        "saleor.core.middleware.plugins",
    ]
    settings.PLUGINS = ["saleor.plugins.tests.sample_plugins.ActivePlugin"]
    request = rf.request()
    request.user = None
    request.app = None

    handler = BaseHandler()
    handler.load_middleware()
    handler.get_response(request)
    plugin = request.plugins.all_plugins.pop()

    assert not plugin.requestor
Esempio n. 26
0
class UrlConsumer(object):
    """
    Dispatches channel HTTP requests into django's URL system.
    """

    def __init__(self):
        self.handler = BaseHandler()
        self.handler.load_middleware()

    def __call__(self, channel, **kwargs):
        request = HttpRequest.channel_decode(kwargs)
        try:
            response = self.handler.get_response(request)
        except HttpResponse.ResponseLater:
            return
        Channel(request.response_channel).send(**response.channel_encode())
Esempio n. 27
0
def get_request_mock():
    """Build a request mock that can be used for testing."""
    bh = BaseHandler()
    bh.load_middleware()
    request = WSGIRequest({
        'REQUEST_METHOD': 'GET',
        'SERVER_NAME': 'test',
        'SERVER_PORT': '8000',
    })
    # Apply request middleware
    for middleware_method in bh._request_middleware:
        # LocaleMiddleware should never be applied a second time because
        # it would broke the current real request language
        if 'LocaleMiddleware' not in str(middleware_method.im_class):
            response = middleware_method(request)
    return request
Esempio n. 28
0
class CommonMiddlewareAppendSlashWithoutRedirect(CommonMiddleware):
    """ This class converts HttpSmartRedirectResponse to the common response
        of Django view, without redirect. This is necessary to match status_codes
        for urls like /url?q=1 and /url/?q=1. If you don't use it, you will have 302
        code always on pages without slash.
    """
    response_redirect_class = HttpSmartRedirectResponse

    def __init__(self, *args, **kwargs):
        # create django request resolver
        self.handler = BaseHandler()

        # prevent recursive includes
        old = settings.MIDDLEWARE
        name = self.__module__ + '.' + self.__class__.__name__
        settings.MIDDLEWARE = [i for i in settings.MIDDLEWARE if i != name]

        self.handler.load_middleware()

        settings.MIDDLEWARE = old
        super(CommonMiddlewareAppendSlashWithoutRedirect, self).__init__(*args, **kwargs)

    def get_full_path_with_slash(self, request):
        """ Return the full path of the request with a trailing slash appended
            without Exception in Debug mode
        """
        new_path = request.get_full_path(force_append_slash=True)
        # Prevent construction of scheme relative urls.
        new_path = escape_leading_slashes(new_path)
        return new_path

    def process_response(self, request, response):
        response = super(CommonMiddlewareAppendSlashWithoutRedirect, self).process_response(request, response)

        request.editor_keymap = settings.EDITOR_KEYMAP

        if isinstance(response, HttpSmartRedirectResponse):
            if not request.path.endswith('/'):
                # remove prefix SCRIPT_NAME
                path = request.path[len(settings.FORCE_SCRIPT_NAME):] if settings.FORCE_SCRIPT_NAME \
                    else request.path
                request.path = path + '/'
            # we don't need query string in path_info because it's in request.GET already
            request.path_info = request.path
            response = self.handler.get_response(request)

        return response
Esempio n. 29
0
class MessageSenderWorker(QueueProcessingWorker):
    def __init__(self):
        # type: () -> None
        super(MessageSenderWorker, self).__init__()
        self.redis_client = get_redis_client()
        self.handler = BaseHandler()
        self.handler.load_middleware()

    def consume(self, event):
        # type: (Mapping[str, Any]) -> None
        server_meta = event['server_meta']

        environ = {'REQUEST_METHOD': 'SOCKET',
                   'SCRIPT_NAME': '',
                   'PATH_INFO': '/json/messages',
                   'SERVER_NAME': 'localhost',
                   'SERVER_PORT': 9993,
                   'SERVER_PROTOCOL': 'ZULIP_SOCKET/1.0',
                   'wsgi.version': (1, 0),
                   'wsgi.input': StringIO(),
                   'wsgi.errors': sys.stderr,
                   'wsgi.multithread': False,
                   'wsgi.multiprocess': True,
                   'wsgi.run_once': False,
                   'zulip.emulated_method': 'POST'}
        # We're mostly using a WSGIRequest for convenience
        environ.update(server_meta['request_environ'])
        request = WSGIRequest(environ)
        request._request = event['request']
        request.csrf_processing_done = True

        user_profile = get_user_profile_by_id(server_meta['user_id'])
        request._cached_user = user_profile

        resp = self.handler.get_response(request)
        server_meta['time_request_finished'] = time.time()
        server_meta['worker_log_data'] = request._log_data

        resp_content = resp.content.decode('utf-8')
        result = {'response': ujson.loads(resp_content), 'req_id': event['req_id'],
                  'server_meta': server_meta}

        redis_key = req_redis_key(event['req_id'])
        self.redis_client.hmset(redis_key, {'status': 'complete',
                                            'response': resp_content});

        queue_json_publish(server_meta['return_queue'], result, lambda e: None)
Esempio n. 30
0
def test_plugins_middleware_loads_requestor_in_plugin(rf, customer_user,
                                                      settings):
    settings.MIDDLEWARE = [
        "saleor.core.middleware.plugins",
    ]
    settings.PLUGINS = ["saleor.plugins.tests.sample_plugins.ActivePlugin"]
    request = rf.request()
    request.user = customer_user
    request.app = None

    handler = BaseHandler()
    handler.load_middleware()
    handler.get_response(request)
    plugin = request.plugins.all_plugins.pop()

    assert isinstance(plugin.requestor, type(customer_user))
    assert plugin.requestor.id == customer_user.id
Esempio n. 31
0
class Middleware404View(Buildable404View):
    def __init__(self, **kwargs):
        self.handler = BaseHandler()
        self.handler.load_middleware()
        super().__init__(**kwargs)

    def get(self, request):
        return self.handler.get_response(request)

    def get_content(self):
        response = self.get(self.request)
        if hasattr(response, 'render'):
            return response.render().content
        if hasattr(response, 'content'):
            return response.content
        raise AttributeError(
            "'%s' object has no attribute 'render' or 'content'" % response)
Esempio n. 32
0
    def get_request_from_message(self, message, widget, user):
        """returns inicialized request
        """

        request = AsgiHandler.request_class(message)

        request.user = user
        request.path = widget.parent.get_absolute_url()
        request.frontend_editing = True

        if not hasattr(request, '_feincms_extra_context'):
            request._feincms_extra_context = {}

        # call processors
        for fn in reversed(list(widget.parent.request_processors.values())):
            fn(widget.parent, request)

        request.LEONARDO_CONFIG = ContextConfig(request)

        # this breaks all get_absolute_uri calls
        request.META['SERVER_NAME'] = 'localhost'
        request.META['SERVER_PORT'] = 80

        handler = BaseHandler()
        handler.load_middleware()

        # Apply request middleware
        for middleware_method in handler._request_middleware:
            try:
                middleware_method(request)
            except:
                pass

        # we know that we are in editing mode and user is logged in
        request.frontend_editing = True
        request.user = user

        # call processors
        for fn in reversed(list(widget.parent.request_processors.values())):
            fn(widget.parent, request)

        if hasattr(widget, 'process') and callable(widget.process):
            widget.process(request, view=self)

        return request
Esempio n. 33
0
class MessageSenderWorker(QueueProcessingWorker):
    def __init__(self):
        super(MessageSenderWorker, self).__init__()
        self.redis_client = get_redis_client()
        self.handler = BaseHandler()
        self.handler.load_middleware()

    def consume(self, event):
        server_meta = event["server_meta"]

        environ = {
            "REQUEST_METHOD": "SOCKET",
            "SCRIPT_NAME": "",
            "PATH_INFO": "/json/messages",
            "SERVER_NAME": "localhost",
            "SERVER_PORT": 9993,
            "SERVER_PROTOCOL": "ZULIP_SOCKET/1.0",
            "wsgi.version": (1, 0),
            "wsgi.input": StringIO(),
            "wsgi.errors": sys.stderr,
            "wsgi.multithread": False,
            "wsgi.multiprocess": True,
            "wsgi.run_once": False,
            "zulip.emulated_method": "POST",
        }
        # We're mostly using a WSGIRequest for convenience
        environ.update(server_meta["request_environ"])
        request = WSGIRequest(environ)
        request._request = event["request"]
        request.csrf_processing_done = True

        user_profile = get_user_profile_by_id(server_meta["user_id"])
        request._cached_user = user_profile

        resp = self.handler.get_response(request)
        server_meta["time_request_finished"] = time.time()
        server_meta["worker_log_data"] = request._log_data

        resp_content = resp.content
        result = {"response": ujson.loads(resp_content), "req_id": event["req_id"], "server_meta": server_meta}

        redis_key = req_redis_key(event["req_id"])
        self.redis_client.hmset(redis_key, {"status": "complete", "response": resp_content})

        queue_json_publish(server_meta["return_queue"], result, lambda e: None)
Esempio n. 34
0
    def _prepare_request(self, request, page, user, lang, use_middlewares, use_toolbar=False,
                         secure=False):
        from django.contrib.auth.models import AnonymousUser
        try:
            from importlib import import_module
        except ImportError:
            from django.utils.importlib import import_module

        engine = import_module(settings.SESSION_ENGINE)

        request.current_page = SimpleLazyObject(lambda: page)
        if not user:
            if self._login_context:
                user = self._login_context.user
            else:
                user = AnonymousUser()
        if user.is_authenticated():
            session_key = user._meta.pk.value_to_string(user)
        else:
            session_key = 'session_key'

        request.user = user
        request._cached_user = user
        request.session = engine.SessionStore(session_key)
        if secure:
            request.environ['SERVER_PORT'] = str('443')
            request.environ['wsgi.url_scheme'] = str('https')
        request.cookies = SimpleCookie()
        request.errors = StringIO()
        request.LANGUAGE_CODE = lang
        if request.method == 'POST':
            request._dont_enforce_csrf_checks = True
        # Let's use middleware in case requested, otherwise just use CMS toolbar if needed
        if use_middlewares:
            handler = BaseHandler()
            handler.load_middleware()
            for middleware_method in handler._request_middleware:
                if middleware_method(request):
                    raise Exception('Couldn\'t create request mock object -'
                                    'request middleware returned a response')
        elif use_toolbar:
            from cms.middleware.toolbar import ToolbarMiddleware
            mid = ToolbarMiddleware()
            mid.process_request(request)
        return request
 def test_kwargs_redirect(self):
     """if kwargs['next'] is supplied to the view then this
     is where the redirect goes"""
     # set up the data
     post_data = {
         'next': 'http://duckduckgo.com/',
         'contenttype_pk' : self.ctype.pk,
         'object_pk': self.item.pk,
     }
     # make a request and hook up the basket
     request = self.factory.post('/customer/details', post_data)
     # all the jiggery pokery
     handler = BaseHandler()
     handler.load_middleware()
     for middleware_method in handler._request_middleware:
         middleware_method(request)
     r = basket(request, next='http://jamiecurle.com/')
     self.assertEqual(r['location'], 'http://jamiecurle.com/')
Esempio n. 36
0
def build_dummy_request(newsitem):
    """
    Construct a HttpRequest object that is, as far as possible,
    representative of ones that would receive this page as a response. Used
    for previewing / moderation and any other place where we want to
    display a view of this page in the admin interface without going
    through the regular page routing logic.
    """
    url = newsitem.full_url
    if url:
        url_info = urlparse(url)
        hostname = url_info.hostname
        path = url_info.path
        port = url_info.port or 80
    else:
        # Cannot determine a URL to this page - cobble one together based on
        # whatever we find in ALLOWED_HOSTS
        try:
            hostname = settings.ALLOWED_HOSTS[0]
        except IndexError:
            hostname = 'localhost'
        path = '/'
        port = 80

    request = WSGIRequest({
        'REQUEST_METHOD': 'GET',
        'PATH_INFO': path,
        'SERVER_NAME': hostname,
        'SERVER_PORT': port,
        'HTTP_HOST': hostname,
        'wsgi.input': StringIO(),
    })

    # Apply middleware to the request - see http://www.mellowmorning.com/2011/04/18/mock-django-request-for-testing/
    handler = BaseHandler()
    handler.load_middleware()
    # call each middleware in turn and throw away any responses that they might return
    if hasattr(handler, '_request_middleware'):
        for middleware_method in handler._request_middleware:
            middleware_method(request)
    else:
        handler.get_response(request)

    return request
Esempio n. 37
0
def test_error_handlers(rf):
    """
    Test that SHUUP_FRONT_INSTALL_ERROR_HANDLERS installs error handlers
    without overwriting possible custom ones.
    """
    with override_settings(
            DEBUG=False,
            SHUUP_FRONT_INSTALL_ERROR_HANDLERS=True,
            MIDDLEWARE_CLASSES=[],
            TEMPLATES=
        [  # Overriden to be sure about the contents of our 500.jinja
            {
                "BACKEND":
                "django_jinja.backend.Jinja2",
                "DIRS": [
                    os.path.realpath(
                        os.path.join(os.path.dirname(__file__), "templates"))
                ],
                "OPTIONS": {
                    "match_extension": ".jinja",
                    "newstyle_gettext": True,
                },
                "NAME":
                "jinja2",
            }
        ]):
        with replace_urls([url("^aaargh/", errorful_view)],
                          {"handler404": four_oh_four}):
            resolver = get_resolver(None)
            urlconf = resolver.urlconf_module
            install_error_handlers()
            assert callable(urlconf.handler500)  # We get a new 500 handler
            assert urlconf.handler404 == four_oh_four  # Our custom 404 handler didn't get overwritten
            handler = BaseHandler()
            handler.load_middleware()
            # Test 500
            response = handler.get_response(rf.get("/aaargh/"))
            assert response.status_code == 500  # Uh oh!
            assert "intergalactic testing 500" in force_text(response.content)
            # Test 404
            response = handler.get_response(rf.get("/another_castle/"))
            assert response.status_code == 200  # Our custom 404 handler made it a 200!
            assert b"flesh wound" in response.content
Esempio n. 38
0
def get_fake_request(meta):
  '''Retrieves a fake request using the given request.META.  This allows celery tasks to have a "request" to use in code.'''
  # if the body was cached in the meta, put it back as the wsgi.input
  if BODY_KEY in meta:
    meta['wsgi.input'] = FakePayload(meta[BODY_KEY])
  
  # create a basic request using the Django testing framework
  request = RequestFactory().request(**meta)
  
  # run middleware on it
  handler = BaseHandler()  
  handler.load_middleware()  
  for middleware_method in handler._request_middleware:  
    response = middleware_method(request)
    if response:
      raise Exception("Middleware cannot return a response with a FakeRequest.")  
      
  # return the request
  return request   
Esempio n. 39
0
    def _prepare_request(self,
                         request,
                         page,
                         user,
                         lang,
                         use_middlewares,
                         use_toolbar=False,
                         secure=False):
        from django.contrib.auth.models import AnonymousUser

        request.current_page = SimpleLazyObject(lambda: page)
        if not user:
            if self._login_context:
                user = self._login_context.user
            else:
                user = AnonymousUser()
        request.user = user
        request._cached_user = user
        request.session = {}
        if secure:
            request.environ['SERVER_PORT'] = str('443')
            request.environ['wsgi.url_scheme'] = str('https')
        if user.is_authenticated():
            request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
        request.cookies = SimpleCookie()
        request.errors = StringIO()
        request.LANGUAGE_CODE = lang
        if request.method == 'POST':
            request._dont_enforce_csrf_checks = True
        # Let's use middleware in case requested, otherwise just use CMS toolbar if needed
        if use_middlewares:
            handler = BaseHandler()
            handler.load_middleware()
            for middleware_method in handler._request_middleware:
                if middleware_method(request):
                    raise Exception('Couldn\'t create request mock object -'
                                    'request middleware returned a response')
        elif use_toolbar:
            from cms.middleware.toolbar import ToolbarMiddleware
            mid = ToolbarMiddleware()
            mid.process_request(request)
        return request
Esempio n. 40
0
def get_request_mock():
    """Build a ``request`` mock up that is used in to render
    the templates in the most fidel environement as possible.

    This fonction is used in the get_placeholders method to
    render the input template and search for the placeholder
    within.
    """
    basehandler = BaseHandler()
    basehandler.load_middleware()
    
    request = FACTORY.get('/')
    # Apply request middleware
    for middleware_method in basehandler._request_middleware:
        # LocaleMiddleware should never be applied a second time because
        # it would broke the current real request language
        if 'LocaleMiddleware' not in str(middleware_method.im_class):
            response = middleware_method(request)
    
    return request
Esempio n. 41
0
def get_fake_request(meta):
    '''Retrieves a fake request using the given request.META.  This allows celery tasks to have a "request" to use in code.'''
    # if the body was cached in the meta, put it back as the wsgi.input
    if BODY_KEY in meta:
        meta['wsgi.input'] = FakePayload(meta[BODY_KEY])

    # create a basic request using the Django testing framework
    request = RequestFactory().request(**meta)

    # run middleware on it
    handler = BaseHandler()
    handler.load_middleware()
    for middleware_method in handler._request_middleware:
        response = middleware_method(request)
        if response:
            raise Exception(
                "Middleware cannot return a response with a FakeRequest.")

    # return the request
    return request
Esempio n. 42
0
def test_jwt_refresh_token_middleware_token_without_expire(rf, customer_user, settings):
    settings.JWT_EXPIRE = True
    payload = jwt_user_payload(
        customer_user,
        JWT_REFRESH_TYPE,
        settings.JWT_TTL_REFRESH,
    )
    del payload["exp"]

    refresh_token = jwt_encode(payload)
    settings.MIDDLEWARE = [
        "saleor.core.middleware.jwt_refresh_token_middleware",
    ]
    request = rf.request()
    request.refresh_token = refresh_token
    handler = BaseHandler()
    handler.load_middleware()
    response = handler.get_response(request)
    cookie = response.cookies.get(JWT_REFRESH_TOKEN_COOKIE_NAME)
    assert cookie.value == refresh_token
Esempio n. 43
0
    def consume_request(self,
                        request,
                        start_callback=None,
                        success_callback=None,
                        fail_callback=None):
        start_callback() if start_callback else None

        handler = BaseHandler()
        handler.load_middleware()

        response = handler.get_response(request)

        if is_success(response.status_code):
            success_callback() if success_callback else None
        else:
            fail_callback() if fail_callback else None

        self.responses[request] = response

        return True
Esempio n. 44
0
def test_error_handlers(rf):
    """
    Test that SHUUP_FRONT_INSTALL_ERROR_HANDLERS installs error handlers
    without overwriting possible custom ones.
    """
    with override_settings(
        DEBUG=False,
        SHUUP_FRONT_INSTALL_ERROR_HANDLERS=True,
        MIDDLEWARE_CLASSES=[],
        TEMPLATES=[  # Overriden to be sure about the contents of our 500.jinja
            {
                "BACKEND": "django_jinja.backend.Jinja2",
                "DIRS": [
                    os.path.realpath(os.path.join(os.path.dirname(__file__), "templates"))
                ],
                "OPTIONS": {
                    "match_extension": ".jinja",
                    "newstyle_gettext": True,
                },
                "NAME": "jinja2",
            }
        ]
    ):
        with replace_urls([
            url("^aaargh/", errorful_view)
        ], {"handler404": four_oh_four}):
            resolver = get_resolver(None)
            urlconf = resolver.urlconf_module
            install_error_handlers()
            assert callable(urlconf.handler500)  # We get a new 500 handler
            assert urlconf.handler404 == four_oh_four  # Our custom 404 handler didn't get overwritten
            handler = BaseHandler()
            handler.load_middleware()
            # Test 500
            response = handler.get_response(rf.get("/aaargh/"))
            assert response.status_code == 500  # Uh oh!
            assert "intergalactic testing 500" in force_text(response.content)
            # Test 404
            response = handler.get_response(rf.get("/another_castle/"))
            assert response.status_code == 200  # Our custom 404 handler made it a 200!
            assert b"flesh wound" in response.content
Esempio n. 45
0
    def dummy_request(self):
        """
        Construct a HttpRequest object that is, as far as possible, representative of ones that would
        receive this page as a response. Used for previewing / moderation and any other place where we
        want to display a view of this page in the admin interface without going through the regular
        page routing logic.
        """
        url = self.full_url
        if url:
            url_info = urlparse(url)
            hostname = url_info.hostname
            path = url_info.path
            port = url_info.port or 80
        else:
            # Cannot determine a URL to this page - cobble one together based on
            # whatever we find in ALLOWED_HOSTS
            try:
                hostname = settings.ALLOWED_HOSTS[0]
            except IndexError:
                hostname = "localhost"
            path = "/"
            port = 80

        request = WSGIRequest(
            {
                "REQUEST_METHOD": "GET",
                "PATH_INFO": path,
                "SERVER_NAME": hostname,
                "SERVER_PORT": port,
                "wsgi.input": StringIO(),
            }
        )

        # Apply middleware to the request - see http://www.mellowmorning.com/2011/04/18/mock-django-request-for-testing/
        handler = BaseHandler()
        handler.load_middleware()
        for middleware_method in handler._request_middleware:
            if middleware_method(request):
                raise Exception("Couldn't create request mock object - " "request middleware returned a response")
        return request
Esempio n. 46
0
def get_request_mock():
    """Build a ``request`` mock up that is used in to render
    the templates in the most fidel environement as possible.

    This fonction is used in the get_placeholders method to
    render the input template and search for the placeholder
    within.
    """
    basehandler = BaseHandler()
    basehandler.load_middleware()
    # http://www.python.org/dev/peps/pep-0333/
    request = WSGIRequest({
        'HTTP_COOKIE': '',
        'PATH_INFO': '/',
        'QUERY_STRING': '',
        'REMOTE_ADDR': '127.0.0.1',
        'REQUEST_METHOD': 'GET',
        'SERVER_NAME': 'page-request-mock',
        'SCRIPT_NAME': '',
        'SERVER_PORT': '80',
        'SERVER_PROTOCOL': 'HTTP/1.1',
        'HTTP_HOST': 'page-request-host',
        'CONTENT_TYPE': 'text/html; charset=utf-8',
        'wsgi.version': (1, 0),
        'wsgi.url_scheme': 'http',
        'wsgi.multiprocess': True,
        'wsgi.multithread':  False,
        'wsgi.run_once':     False,
        'wsgi.input': StringIO("")
    })
    # Apply request middleware
    for middleware_method in basehandler._request_middleware:
        # LocaleMiddleware should never be applied a second time because
        # it would broke the current real request language
        if 'LocaleMiddleware' not in str(middleware_method.im_class):
            response = middleware_method(request)

    return request
Esempio n. 47
0
def get_request_mock():
    """Build a ``request`` mock up that is used in to render
    the templates in the most fidel environement as possible.

    This fonction is used in the get_placeholders method to
    render the input template and search for the placeholder
    within.
    """
    basehandler = BaseHandler()
    basehandler.load_middleware()
    # http://www.python.org/dev/peps/pep-0333/
    request = WSGIRequest({
        'HTTP_COOKIE': '',
        'PATH_INFO': '/',
        'QUERY_STRING': '',
        'REMOTE_ADDR': '127.0.0.1',
        'REQUEST_METHOD': 'GET',
        'SERVER_NAME': 'page-request-mock',
        'SCRIPT_NAME': '',
        'SERVER_PORT': '80',
        'SERVER_PROTOCOL': 'HTTP/1.1',
        'HTTP_HOST': 'page-request-host',
        'CONTENT_TYPE': 'text/html; charset=utf-8',
        'wsgi.version': (1, 0),
        'wsgi.url_scheme': 'http',
        'wsgi.multiprocess': True,
        'wsgi.multithread':  False,
        'wsgi.run_once':     False,
        'wsgi.input': StringIO("")
    })
    # Apply request middleware
    for middleware_method in basehandler._request_middleware:
        # LocaleMiddleware should never be applied a second time because
        # it would broke the current real request language
        if 'LocaleMiddleware' not in str(middleware_method.im_class):
            response = middleware_method(request)

    return request
Esempio n. 48
0
def get_request_mock():
    """Build a ``request`` mock up that is used in to render
    the templates in the most fidel environement as possible.

    This fonction is used in the get_placeholders method to
    render the input template and search for the placeholder
    within.
    """
    from django.test.client import RequestFactory
    from django.core.handlers.base import BaseHandler
    factory = RequestFactory()
    basehandler = BaseHandler()
    basehandler.load_middleware()

    request = factory.get('/')
    # Apply request middleware
    for middleware_method in basehandler._request_middleware:
        # LocaleMiddleware should never be applied a second time because
        # it would broke the current real request language
        if 'LocaleMiddleware' not in str(middleware_method.__self__.__class__):
            middleware_method(request)

    return request
Esempio n. 49
0
    def request(self, **request):
        """
        Similar to parent class, but returns the request object as soon as it
        has created it.
        """
        environ = {
            'HTTP_COOKIE': self.cookies,
            'PATH_INFO': '/',
            'QUERY_STRING': '',
            'REQUEST_METHOD': 'GET',
            'SCRIPT_NAME': '',
            'SERVER_NAME': 'testserver',
            'SERVER_PORT': 80,
            'SERVER_PROTOCOL': 'HTTP/1.1',
        }
        environ.update(self.defaults)
        environ.update(request)
        request = WSGIRequest(environ)
        handler = BaseHandler()
        handler.load_middleware()
        for middleware_method in handler._request_middleware:
            middleware_method(request)

        return request
Esempio n. 50
0
def test_front_error_handlers(rf):
    """
    Test that `SHUUP_ERROR_PAGE_HANDLERS_SPEC` installs error handlers that are overwriting custom ones.
    """
    with override_settings(
            DEBUG=False,
            SHUUP_ERROR_PAGE_HANDLERS_SPEC=[
                "shuup.front.error_handlers.FrontPageErrorHandler"
            ],
            MIDDLEWARE_CLASSES=[],  # For Django < 2
            MIDDLEWARE=[],
            TEMPLATES=
        [  # Overriden to be sure about the contents of our 500.jinja
            {
                "BACKEND":
                "django_jinja.backend.Jinja2",
                "DIRS": [
                    os.path.realpath(
                        os.path.join(os.path.dirname(__file__), "templates"))
                ],
                "OPTIONS": {
                    "match_extension": ".jinja",
                    "newstyle_gettext": True,
                },
                "NAME":
                "jinja2",
            }
        ]):
        with replace_urls([
                url("^aaargh/", errorful_view),
                url("^notfound/", notfound_view),
                url("^dash/", DashboardView.as_view()),
                url("^index/", IndexView.as_view()),
        ], {
                "handler404": four_oh_four,
                "handler500": handler500
        }):
            resolver = get_resolver(None)
            urlconf = resolver.urlconf_module
            handler = BaseHandler()
            handler.load_middleware()

            # test without installing the handler
            assert urlconf.handler404 == four_oh_four
            assert urlconf.handler500 == handler500

            # Test 500
            response = handler.get_response(rf.get("/aaargh/"))
            assert response.status_code == 500
            assert b"The best error" in response.content
            # Test 404
            response = handler.get_response(rf.get("/another_castle/"))
            assert response.status_code == 404
            assert b"flesh wound" in response.content

            # inject our custom error handlers
            install_error_handlers()
            assert urlconf.handler404 != four_oh_four
            assert urlconf.handler500 != handler500
            assert "miss something? 404" in force_text(
                urlconf.handler404(rf.get("/notfound/")).content)
            assert "intergalactic testing 500" in force_text(
                urlconf.handler500(rf.get("/aaargh/")).content)

            # Front must handle all possible apps
            error_handler = FrontPageErrorHandler()

            response = handler.get_response(rf.get("/aaargh/"))
            assert "intergalactic testing 500" in force_text(response.content)

            # simulate a view to check whether the handler can handle an
            # error of a non-front view, a front view and a admin view
            for path in ("/aaargh/", "/index/", "/dash/"):
                request = rf.get(path)
                assert error_handler.can_handle_error(request, 500)
                assert error_handler.can_handle_error(request, 400)
                assert error_handler.can_handle_error(request, 403)
                assert error_handler.can_handle_error(request, 404)

                # check the error handlers return the correct status and text
                for status, content in [
                    (500, "intergalactic testing 500"),
                    (400, "about 400"),
                    (403, "get out 403"),
                    (404, "miss something? 404"),
                ]:
                    response = error_handler.handle_error(request, status)
                    assert response.status_code == status
                    assert content in force_text(response.content)

            from django.conf import settings
            # front can't handle static and media paths
            for path in (settings.STATIC_URL + "mystaticfile",
                         settings.MEDIA_URL + "mymediafile"):
                request = rf.get(path)
                assert error_handler.can_handle_error(request, 500) is False
                assert error_handler.can_handle_error(request, 400) is False
                assert error_handler.can_handle_error(request, 403) is False
                assert error_handler.can_handle_error(request, 404) is False
Esempio n. 51
0
def test_install_error_handlers(rf):
    # no error handler set
    with override_settings(DEBUG=False,
                           SHUUP_ERROR_PAGE_HANDLERS_SPEC=[],
                           MIDDLEWARE_CLASSES=[],
                           MIDDLEWARE=[]):

        def intact_view(request, *args, **kwargs):
            return HttpResponse("OK")

        # set handlers in root urlconf
        with replace_urls(
            [
                url("^/", intact_view),
            ], {
                "handler400": intact_view,
                "handler403": intact_view,
                "handler404": intact_view,
                "handler500": intact_view
            }):
            # install error handlers - as soon as no spec was set,
            # the handlers must return the same as the default handlers
            install_error_handlers()

            resolver = get_resolver(None)
            urlconf = resolver.urlconf_module

            assert urlconf.handler500 != intact_view
            assert urlconf.handler400 != intact_view
            assert urlconf.handler403 != intact_view
            assert urlconf.handler404 != intact_view

            request = rf.get("/")
            assert urlconf.handler400(request).content == intact_view(
                request).content
            assert urlconf.handler403(request).content == intact_view(
                request).content
            assert urlconf.handler404(request).content == intact_view(
                request).content
            assert urlconf.handler500(request).content == intact_view(
                request).content

        # force clear again
        import shuup.core.error_handling as error_handling
        error_handling._URLCONF_ERROR_HANDLERS.clear()

        # NO handler set in root urlconf
        with replace_urls([
                url("^aaargh/", errorful_view),
                url("^notfound/", notfound_view),
        ], {}):
            # install error handlers - as soon as no spec was set,
            # neither handlers set in urlconf, must return blank http responses with errors
            install_error_handlers()

            resolver = get_resolver(None)
            urlconf = resolver.urlconf_module

            request = rf.get("/")
            assert urlconf.handler400(request).status_code == 400
            assert urlconf.handler403(request).status_code == 403
            assert urlconf.handler404(request).status_code == 404
            assert urlconf.handler500(request).status_code == 500

            handler = BaseHandler()
            handler.load_middleware()

            response = handler.get_response(rf.get("/aaargh/"))
            assert response.status_code == 500

            response = handler.get_response(rf.get("/notfound/"))
            assert response.status_code == 404
Esempio n. 52
0
def test_admin_error_handlers(rf):
    """
    Test that SHUUP_ERROR_PAGE_HANDLERS_SPEC installs error handlers that are overwriting custom ones.
    """
    with override_settings(
            DEBUG=False,
            SHUUP_ERROR_PAGE_HANDLERS_SPEC=[
                "shuup.admin.error_handlers.AdminPageErrorHandler"
            ],
            MIDDLEWARE_CLASSES=[],  # For Django 2
            MIDDLEWARE=[],
            TEMPLATES=
        [  # Overriden to be sure about the contents of our 500.jinja
            {
                "BACKEND":
                "django_jinja.backend.Jinja2",
                "DIRS": [
                    os.path.realpath(
                        os.path.join(os.path.dirname(__file__), "templates"))
                ],
                "OPTIONS": {
                    "match_extension": ".jinja",
                    "newstyle_gettext": True,
                },
                "NAME":
                "jinja2",
            }
        ]):
        with replace_urls([
                url("^aaargh/", errorful_view),
                url("^index/", IndexView.as_view()),
                url("^dash/", DashboardView.as_view()),
        ], {
                "handler404": four_oh_four,
                "handler500": handler500
        }):
            resolver = get_resolver(None)
            urlconf = resolver.urlconf_module
            handler = BaseHandler()
            handler.load_middleware()

            # test without installing the handler
            assert urlconf.handler404 == four_oh_four
            assert urlconf.handler500 == handler500

            # Test 500
            response = handler.get_response(rf.get("/aaargh/"))
            assert response.status_code == 500
            assert b"The best error" in response.content
            # Test 404
            response = handler.get_response(rf.get("/another_castle/"))
            assert response.status_code == 404
            assert b"flesh wound" in response.content

            # inject our custom error handlers
            install_error_handlers()

            # here the urlconfs will be the default handlers
            # because admin can't handle such requests
            # but the functions of the handlers are pointing to our factory view
            assert urlconf.handler404 != four_oh_four
            assert urlconf.handler500 != handler500
            assert "flesh wound" in force_text(
                urlconf.handler404(rf.get("/notfound/")).content)
            assert "The best error" in force_text(
                urlconf.handler500(rf.get("/aaargh/")).content)

            # Admin must handle only admin app errors
            error_handler = AdminPageErrorHandler()

            # simulate a view to check whether the handler can handle an error of a non-front view
            # Admin handler will check for the resolver_match and admin app only
            response = handler.get_response(rf.get("/aaargh/"))
            assert b"The best error" in response.content

            # can't handle non admin views neither media or static files
            from django.conf import settings
            for path in ("/aaargh/", "/index/",
                         settings.STATIC_URL + "mystaticfile",
                         settings.MEDIA_URL + "mymediafile"):
                request = rf.get(path)
                assert error_handler.can_handle_error(request, 500) is False
                assert error_handler.can_handle_error(request, 400) is False
                assert error_handler.can_handle_error(request, 403) is False
                assert error_handler.can_handle_error(request, 404) is False

            # simulate a view to check whether the handler can handle an error of an admin view
            request = rf.get("/dash/")
            assert error_handler.can_handle_error(request, 500) is False
            assert error_handler.can_handle_error(request, 400) is False
            assert error_handler.can_handle_error(request, 403) is False
            assert error_handler.can_handle_error(request, 404) is False

            # check the error handlers return the correct status and text
            for status, content in [
                (500, "admin 500"),
                (400, "admin 400"),
                (403, "admin 403"),
                (404, "admin 404"),
            ]:
                response = error_handler.handle_error(request, status)
                assert response.status_code == status
                assert content in force_text(response.content)
Esempio n. 53
0
 def __init__(self):
     handler = BaseHandler()
     handler.load_middleware()
     self.request_factory = RequestFactory()
     self.middleware = handler._request_middleware
Esempio n. 54
0
class WagtailBakeryView(BuildableDetailView):
    """
    An abstract class that can be inherited to create a buildable view that can
    be added to BAKERY_VIEWS setting.
    """
    def __init__(self, *args, **kwargs):
        self.handler = BaseHandler()
        self.handler.load_middleware()

        self.site = self.get_site()

        super(WagtailBakeryView, self).__init__(*args, **kwargs)

    def get(self, request):
        response = self.handler.get_response(request)
        return response

    def get_site(self):
        """Return the site were to build the static pages from.

        By default this is the site marked as default with `is_default_site`
        set to `true`.

        In case of a multisite setup this site object will be ignored.

        Example:
            def get_site(self):
                return Site.objects.get(hostname='website.com')
        """
        return Site.objects.get(is_default_site=True)

    def get_build_path(self, obj):
        url = self.get_url(obj)

        if url.startswith('http'):
            url_parsed = urlparse(url)
            path = url_parsed.path
            hostname = url_parsed.hostname
            build_path = os.path.join(settings.BUILD_DIR, hostname, path[1:])
        else:
            build_path = os.path.join(settings.BUILD_DIR, url[1:])

        # Make sure the (deeply) directories are created
        os.path.exists(build_path) or os.makedirs(build_path)

        # Always append index.html at the end of the path
        return os.path.join(build_path, 'index.html')

    def get_url(self, obj):
        """Return Wagtail page url instead of Django's get_absolute_url."""
        return obj.url

    def get_path(self, obj):
        """Return Wagtail path to page."""
        return obj.path

    def build_queryset(self):
        for item in self.get_queryset().all():
            if self.get_url(item) is not None:
                self.build_object(item)

    class Meta:
        abstract = True
Esempio n. 55
0
def invokeResolverMatch(request, match):
    global current_requests
    from dtx.web import server
    with log.enter() as tm:
        base_handler = BaseHandler()
        try:
            base_handler.load_middleware()
            # META
            request.META = {}
            request.META['REQUEST_METHOD'] = request.method
            # Cookies
            request.COOKIES = {}
            session_id = getattr(settings, 'SESSION_COOKIE_NAME', 'sessionid')
            request.COOKIES[session_id] = request.getCookie(session_id)
            # Arguments
            request.GET = request.args
            # Accept
            accept = request.getHeader('accept')
            if (accept):
                log.debug(u'Accept: {}'.format(accept))
                request.accept = parse_accept_header(accept)
                request.META['HTTP_ACCEPT'] = accept
            # Args
            content_type = request.getHeader('content-type')
            if (content_type):
                log.debug(u'Content-Type: {}'.format(content_type))
                request.META['CONTENT_TYPE'] = content_type
                request.content_type = content_type.split(';')
            else:
                request.content_type = []
            request.content_type_name = request.content_type[0] if (
                len(request.content_type) >= 1) else None
            request.content_type_args = request.content_type[1] if (
                len(request.content_type) >= 2) else None
            form = {}
            # TODO: Make decoders registry
            if (request.content_type_name == 'application/python-pickle'):
                content = request.content.read()
                form = pickle.loads(content)
            elif (request.content_type_name == 'application/json'):
                content = request.content.read()
                form = json.loads(content)
            elif (request.content_type_name == 'application/x-yaml'):
                content = request.content.read()
                form = yaml.load(content)
            request.POST = form
            request.REQUEST = dict(
                chain(request.GET.iteritems(), request.POST.iteritems()))
            # Parameters
            kwargs = match.kwargs
            params = dict(chain(kwargs.iteritems(), form.iteritems()))
            # Language
            accept_language = request.getHeader('accept-language')
            accept_language = accept_language if (
                accept_language) else 'en-US,en;q=0.8'
            request.META['HTTP_ACCEPT_LANGUAGE'] = accept_language
            from django.utils.translation.trans_real import parse_accept_lang_header
            langs = parse_accept_lang_header(accept_language)
            log.debug(u'Accept-Language: {}'.format(unicode(langs)))
            request.language = langs[0][0] if (
                langs) else settings.LANGUAGE_CODE
            log.debug(u'Activating language: {}'.format(request.language))
            translation.activate(request.language)
            # Middleware
            for middleware_method in base_handler._request_middleware:
                try:
                    response = middleware_method(request)
                except:
                    pass
            # Invoke
            server.currentRequest = request
            with RequestInvocationContext.create(match.func, request,
                                                 match.args, params) as ctx:
                #RequestInvocationContext.dump_all(ctx, u'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
                try:
                    response = yield maybeDeferred(match.func, request,
                                                   *match.args, **params)
                except Exception:
                    Failure().printTraceback()
                    raise
                #RequestInvocationContext.dump_all(ctx, u'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
            if (issubclass(response.__class__, HttpResponse)):
                log.debug('Response: HttpResponse')
                cls = response.__class__
                try:
                    content_type = response['content-type']
                    log.debug(u'Content-Type: {}'.format(content_type))
                    request.setHeader("Content-Type", content_type)
                except:
                    log.debug(u'Using default content type')
                for key, value in response.items():
                    request.setHeader(key, value)
                status_code = response.__dict__.get(
                    'status_code', response.__class__.status_code)
                log.debug(u'Status-Code: {}'.format(status_code))
                request.setResponseCode(status_code)
                content = response.content
                if (content):
                    request.write(content)
            elif (isinstance(response, (unicode))):
                log.debug('Response: UTF-8')
                request.write(response.encode('utf-8'))
            elif (isinstance(response, (str))):
                log.debug('Response: Binary')
                request.write(response)
            else:
                log.debug(u'Response: Unknown ({})'.format(type(response)))
                request.setHeader("Content-Type", 'application/python-pickle')
                request.write(pickle.dumps(response))
            request.finish()
        except Exception, ex:
            log.err(traceback.format_exc())
            log.debug(u'Response-Code: {}'.format(500))
            request.setResponseCode(500)
            request.write('500')
            request.finish()
Esempio n. 56
0
 def test_middleware_loads_on_django_1_10s_new_style_middleware(self):
     handler = BaseHandler()
     handler.load_middleware()
Esempio n. 57
0
class WagtailBakeryView(BuildableDetailView):
    """
    An abstract class that can be inherited to create a buildable view that can
    be added to BAKERY_VIEWS setting.
    """
    def __init__(self, *args, **kwargs):
        self.handler = BaseHandler()
        self.handler.load_middleware()

        super(WagtailBakeryView, self).__init__(*args, **kwargs)

    def get(self, request):
        response = self.handler.get_response(request)
        return response

    def get_content(self, obj):
        response = self.get(self.request)
        if isinstance(response, HttpResponseRedirect):
            return self.get_redirect_content(response, obj)
        if hasattr(response, 'render'):
            return response.render().content
        if hasattr(response, 'content'):
            return response.content
        raise AttributeError(
            "'%s' object has no attribute 'render' or 'content'" % response)

    def get_redirect_content(self, response, obj):
        context = {
            'page': obj,
            'self': obj,
            'redirect_url': response.url,
        }
        content = render(
            self.request, 'wagtailbakery/redirect.html', context).content
        return response.make_bytes(content)

    def get_build_path(self, obj):
        url = self.get_url(obj)

        if url.startswith('http'):
            # Multisite has absolute urls
            url_parsed = urlparse(url)
            path = url_parsed.path
            hostname = url_parsed.hostname

            if getattr(settings, 'BAKERY_MULTISITE', False):
                build_path = os.path.join(
                    settings.BUILD_DIR, hostname, path[1:])
            else:
                build_path = os.path.join(settings.BUILD_DIR, path[1:])
        else:
            # Single site has relative urls
            build_path = os.path.join(settings.BUILD_DIR, url[1:])

        # Make sure the (deeply) directories are created
        os.path.exists(build_path) or os.makedirs(build_path)

        # Always append index.html at the end of the path
        return os.path.join(build_path, 'index.html')

    def get_url(self, obj):
        """Return Wagtail page url instead of Django's get_absolute_url."""
        return obj.url

    def get_path(self, obj):
        """Return Wagtail path to page."""
        return obj.path

    def build_object(self, obj):
        """
        Build wagtail page and set SERVER_NAME to retrieve corresponding site
        object.
        """
        site = obj.get_site()
        logger.debug("Building %s" % obj)
        self.request = RequestFactory(
            SERVER_NAME=site.hostname).get(self.get_url(obj))
        self.set_kwargs(obj)
        path = self.get_build_path(obj)
        self.build_file(path, self.get_content(obj))

    def build_queryset(self):
        for item in self.get_queryset().all():
            url = self.get_url(item)
            if url is not None:
                self.build_object(item)

    class Meta:
        abstract = True