class DefaultServletRequestDispatcher implements RequestDispatcher {

    @Override
    public void include(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        try (DefaultWebApplicationRequest includedRequest = new DefaultWebApplicationRequest()) {
            HttpServletRequest originalRequest = (HttpServletRequest) servletRequest;

            includedRequest.setWebApplication(servletEnvironment.getWebApplication());
            includedRequest.setContextPath(originalRequest.getContextPath());
            includedRequest.setAttribute(INCLUDE_REQUEST_URI, originalRequest.getRequestURI());
            includedRequest.setAttribute(INCLUDE_CONTEXT_PATH, originalRequest.getContextPath());
            includedRequest.setAttribute(INCLUDE_SERVLET_PATH, originalRequest.getServletPath());
            includedRequest.setAttribute(INCLUDE_PATH_INFO, originalRequest.getPathInfo());
            includedRequest.setAttribute(INCLUDE_QUERY_STRING, originalRequest.getQueryString());
            includedRequest.setServletPath(path);
            includedRequest.setDispatcherType(INCLUDE);
            includedRequest.setPathInfo(null);
            includedRequest.setQueryString(null);

            CurrentRequestHolder currentRequestHolder = updateCurrentRequest(originalRequest, includedRequest);

            invocationFinder.addFilters(INCLUDE, servletInvocation, includedRequest.getServletPath(), "");

            try {
                servletEnvironment.getWebApplication().linkRequestAndResponse(includedRequest, servletResponse);

                servletInvocation.getFilterChain().doFilter(includedRequest, servletResponse);

                servletEnvironment.getWebApplication().unlinkRequestAndResponse(includedRequest, servletResponse);
            } catch (Exception e) {
                rethrow(e);
            } finally {
                restoreCurrentRequest(currentRequestHolder, originalRequest);
            }
        }
    }

    public  DefaultServletRequestDispatcher(DefaultServletInvocation servletInvocation, DefaultWebApplication webApplication);

}