def _validate(self, request):
        """Validate an L{HTTPRequest} before executing it.

        The following conditions are checked:

        - The request contains all the generic parameters.
        - The action specified in the request is a supported one.
        - The signature mechanism is a supported one.
        - The provided signature matches the one calculated using the locally
          stored secret access key for the user.
        - The signature hasn't expired.

        @return: The validated L{Call}, set with its default arguments and the
           the principal of the accessing L{User}.
        """
        call_arguments = self.get_call_arguments(request)
        args = call_arguments["transport_args"]
        rest = call_arguments["handler_args"]
        params = call_arguments["raw_args"]

        self._validate_generic_parameters(args)

        def create_call(principal):
            self._validate_principal(principal, args)
            self._validate_signature(request, principal, args, params)
            return Call(raw_params=rest,
                        principal=principal,
                        action=args["action"],
                        version=args["version"],
                        id=request.id)

        deferred = maybeDeferred(self.get_principal, args["access_key_id"])
        deferred.addCallback(create_call)
        return deferred