public Response internalInvocation(HttpRequest request, HttpResponse response, Object entity) {
    // be extra careful in the clean up process. Only pop if there was an
    // equivalent push.
    ResteasyProviderFactory.addContextDataLevel();
    boolean pushedBody = false;
    try {
      MessageBodyParameterInjector.pushBody(entity);
      pushedBody = true;
      ResourceInvoker invoker = getInvoker(request);
      if (invoker != null) {
        pushContextObjects(request, response);
        return getResponse(request, response, invoker);
      }

      // this should never happen, since getInvoker should throw an exception
      // if invoker is null
      return null;
    } finally {
      ResteasyProviderFactory.removeContextDataLevel();
      if (pushedBody) {
        MessageBodyParameterInjector.popBody();
      }
    }
  }