Search in sources :

Example 1 with ResponseFacade

use of org.apache.catalina.connector.ResponseFacade in project tomcat70 by apache.

the class ApplicationDispatcher method unwrapResponse.

/**
 * Unwrap the response if we have wrapped it.
 */
private void unwrapResponse(State state) {
    if (state.wrapResponse == null)
        return;
    if (state.outerRequest.isAsyncStarted()) {
        if (!state.outerRequest.getAsyncContext().hasOriginalRequestAndResponse()) {
            return;
        }
    }
    ServletResponse previous = null;
    ServletResponse current = state.outerResponse;
    while (current != null) {
        // If we run into the container response we are done
        if ((current instanceof Response) || (current instanceof ResponseFacade))
            break;
        // Remove the current response if it is our wrapper
        if (current == state.wrapResponse) {
            ServletResponse next = ((ServletResponseWrapper) current).getResponse();
            if (previous == null)
                state.outerResponse = next;
            else
                ((ServletResponseWrapper) previous).setResponse(next);
            break;
        }
        // Advance to the next response in the chain
        previous = current;
        current = ((ServletResponseWrapper) current).getResponse();
    }
}
Also used : HttpServletResponse(javax.servlet.http.HttpServletResponse) Response(org.apache.catalina.connector.Response) ServletResponse(javax.servlet.ServletResponse) HttpServletResponse(javax.servlet.http.HttpServletResponse) ServletResponse(javax.servlet.ServletResponse) ResponseFacade(org.apache.catalina.connector.ResponseFacade) ServletResponseWrapper(javax.servlet.ServletResponseWrapper)

Example 2 with ResponseFacade

use of org.apache.catalina.connector.ResponseFacade in project Payara by payara.

the class ApplicationDispatcher method unwrapResponse.

/**
 * Unwrap the response if we have wrapped it.
 */
private void unwrapResponse(State state) {
    if (state.wrapResponse == null)
        return;
    ServletResponse previous = null;
    ServletResponse current = state.outerResponse;
    while (current != null) {
        // If we run into the container response we are done
        if ((current instanceof org.apache.catalina.Response) || (current instanceof ResponseFacade))
            break;
        // Remove the current response if it is our wrapper
        if (current == state.wrapResponse) {
            ServletResponse next = ((ServletResponseWrapper) current).getResponse();
            if (previous == null)
                state.outerResponse = next;
            else
                ((ServletResponseWrapper) previous).setResponse(next);
            break;
        }
        // Advance to the next response in the chain
        previous = current;
        current = ((ServletResponseWrapper) current).getResponse();
    }
}
Also used : HttpServletResponse(javax.servlet.http.HttpServletResponse) HttpServletResponse(javax.servlet.http.HttpServletResponse) ResponseFacade(org.apache.catalina.connector.ResponseFacade)

Example 3 with ResponseFacade

use of org.apache.catalina.connector.ResponseFacade in project tomcat70 by apache.

the class ApplicationDispatcher method doForward.

private void doForward(ServletRequest request, ServletResponse response) throws ServletException, IOException {
    // Reset any output that has been buffered, but keep headers/cookies
    if (response.isCommitted()) {
        throw new IllegalStateException(sm.getString("applicationDispatcher.forward.ise"));
    }
    try {
        response.resetBuffer();
    } catch (IllegalStateException e) {
        throw e;
    }
    // Set up to handle the specified request and response
    State state = new State(request, response, false);
    if (WRAP_SAME_OBJECT) {
        // Check SRV.8.2 / SRV.14.2.5.1 compliance
        checkSameObjects(request, response);
    }
    wrapResponse(state);
    // Handle an HTTP named dispatcher forward
    if ((servletPath == null) && (pathInfo == null)) {
        ApplicationHttpRequest wrequest = (ApplicationHttpRequest) wrapRequest(state);
        HttpServletRequest hrequest = state.hrequest;
        wrequest.setRequestURI(hrequest.getRequestURI());
        wrequest.setContextPath(hrequest.getContextPath());
        wrequest.setServletPath(hrequest.getServletPath());
        wrequest.setPathInfo(hrequest.getPathInfo());
        wrequest.setQueryString(hrequest.getQueryString());
        processRequest(request, response, state);
    } else // Handle an HTTP path-based forward
    {
        ApplicationHttpRequest wrequest = (ApplicationHttpRequest) wrapRequest(state);
        String contextPath = context.getPath();
        HttpServletRequest hrequest = state.hrequest;
        if (hrequest.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI) == null) {
            wrequest.setAttribute(RequestDispatcher.FORWARD_REQUEST_URI, hrequest.getRequestURI());
            wrequest.setAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH, hrequest.getContextPath());
            wrequest.setAttribute(RequestDispatcher.FORWARD_SERVLET_PATH, hrequest.getServletPath());
            wrequest.setAttribute(RequestDispatcher.FORWARD_PATH_INFO, hrequest.getPathInfo());
            wrequest.setAttribute(RequestDispatcher.FORWARD_QUERY_STRING, hrequest.getQueryString());
        }
        wrequest.setContextPath(contextPath);
        wrequest.setRequestURI(requestURI);
        wrequest.setServletPath(servletPath);
        wrequest.setPathInfo(pathInfo);
        if (queryString != null) {
            wrequest.setQueryString(queryString);
            wrequest.setQueryParams(queryString);
        }
        processRequest(request, response, state);
    }
    if (request.isAsyncStarted()) {
        // response as it may be written to during the async handling
        return;
    }
    // This is not a real close in order to support error processing
    if (wrapper.getLogger().isDebugEnabled())
        wrapper.getLogger().debug(" Disabling the response for further output");
    if (response instanceof ResponseFacade) {
        ((ResponseFacade) response).finish();
    } else {
        // and may no longer be instance of RequestFacade
        if (wrapper.getLogger().isDebugEnabled()) {
            wrapper.getLogger().debug(" The Response is vehiculed using a wrapper: " + response.getClass().getName());
        }
        // Close anyway
        try {
            PrintWriter writer = response.getWriter();
            writer.close();
        } catch (IllegalStateException e) {
            try {
                ServletOutputStream stream = response.getOutputStream();
                stream.close();
            } catch (IllegalStateException f) {
            // Ignore
            } catch (IOException f) {
            // Ignore
            }
        } catch (IOException e) {
        // Ignore
        }
    }
}
Also used : HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletOutputStream(javax.servlet.ServletOutputStream) ResponseFacade(org.apache.catalina.connector.ResponseFacade) IOException(java.io.IOException) PrintWriter(java.io.PrintWriter)

Example 4 with ResponseFacade

use of org.apache.catalina.connector.ResponseFacade in project tomcat70 by apache.

the class DefaultServlet method serveResource.

/**
 * Serve the specified resource, optionally including the data content.
 *
 * @param request The servlet request we are processing
 * @param response The servlet response we are creating
 * @param content Should the content be included?
 *
 * @exception IOException if an input/output error occurs
 * @exception ServletException if a servlet-specified error occurs
 */
protected void serveResource(HttpServletRequest request, HttpServletResponse response, boolean content) throws IOException, ServletException {
    boolean serveContent = content;
    // Identify the requested resource path
    String path = getRelativePath(request, true);
    if (debug > 0) {
        if (serveContent)
            log("DefaultServlet.serveResource:  Serving resource '" + path + "' headers and data");
        else
            log("DefaultServlet.serveResource:  Serving resource '" + path + "' headers only");
    }
    if (path.length() == 0) {
        // Context root redirect
        doDirectoryRedirect(request, response);
        return;
    }
    CacheEntry cacheEntry = resources.lookupCache(path);
    boolean isError = DispatcherType.ERROR == request.getDispatcherType();
    if (!cacheEntry.exists) {
        // Check if we're included so we can return the appropriate
        // missing resource name in the error
        String requestUri = (String) request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI);
        if (requestUri == null) {
            requestUri = request.getRequestURI();
        } else {
            // SRV.9.3 says we must throw a FNFE
            throw new FileNotFoundException(sm.getString("defaultServlet.missingResource", requestUri));
        }
        if (isError) {
            response.sendError(((Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE)).intValue());
        } else {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, requestUri);
        }
        return;
    }
    // satisfied.
    if (cacheEntry.context == null) {
        // Checking If headers
        boolean included = (request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH) != null);
        if (!included && !isError && !checkIfHeaders(request, response, cacheEntry.attributes)) {
            return;
        }
    }
    // Find content type.
    String contentType = cacheEntry.attributes.getMimeType();
    if (contentType == null) {
        contentType = getServletContext().getMimeType(cacheEntry.name);
        cacheEntry.attributes.setMimeType(contentType);
    }
    ArrayList<Range> ranges = null;
    long contentLength = -1L;
    if (cacheEntry.context != null) {
        if (!path.endsWith("/")) {
            doDirectoryRedirect(request, response);
            return;
        }
        // suppress them
        if (!listings) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, request.getRequestURI());
            return;
        }
        contentType = "text/html;charset=UTF-8";
    } else {
        if (!isError) {
            if (useAcceptRanges) {
                // Accept ranges header
                response.setHeader("Accept-Ranges", "bytes");
            }
            // Parse range specifier
            ranges = parseRange(request, response, cacheEntry.attributes);
            // ETag header
            response.setHeader("ETag", cacheEntry.attributes.getETag());
            // Last-Modified header
            response.setHeader("Last-Modified", cacheEntry.attributes.getLastModifiedHttp());
        }
        // Get content length
        contentLength = cacheEntry.attributes.getContentLength();
        // (silent) ISE when setting the output buffer size
        if (contentLength == 0L) {
            serveContent = false;
        }
    }
    ServletOutputStream ostream = null;
    PrintWriter writer = null;
    if (serveContent) {
        try {
            ostream = response.getOutputStream();
        } catch (IllegalStateException e) {
            // trying to serve a text file
            if ((contentType == null) || (contentType.startsWith("text")) || (contentType.endsWith("xml")) || (contentType.contains("/javascript"))) {
                writer = response.getWriter();
                // Cannot reliably serve partial content with a Writer
                ranges = FULL;
            } else {
                throw e;
            }
        }
    }
    // Check to see if a Filter, Valve of wrapper has written some content.
    // If it has, disable range requests and setting of a content length
    // since neither can be done reliably.
    ServletResponse r = response;
    long contentWritten = 0;
    while (r instanceof ServletResponseWrapper) {
        r = ((ServletResponseWrapper) r).getResponse();
    }
    if (r instanceof ResponseFacade) {
        contentWritten = ((ResponseFacade) r).getContentWritten();
    }
    if (contentWritten > 0) {
        ranges = FULL;
    }
    if ((cacheEntry.context != null) || isError || (((ranges == null) || (ranges.isEmpty())) && (request.getHeader("Range") == null)) || (ranges == FULL)) {
        // Set the appropriate output headers
        if (contentType != null) {
            if (debug > 0)
                log("DefaultServlet.serveFile:  contentType='" + contentType + "'");
            response.setContentType(contentType);
        }
        if ((cacheEntry.resource != null) && (contentLength >= 0) && (!serveContent || ostream != null)) {
            if (debug > 0)
                log("DefaultServlet.serveFile:  contentLength=" + contentLength);
            // written to the response.
            if (contentWritten == 0) {
                if (contentLength < Integer.MAX_VALUE) {
                    response.setContentLength((int) contentLength);
                } else {
                    // Set the content-length as String to be able to use a
                    // long
                    response.setHeader("content-length", "" + contentLength);
                }
            }
        }
        InputStream renderResult = null;
        if (cacheEntry.context != null) {
            if (serveContent) {
                // Serve the directory browser
                renderResult = render(getPathPrefix(request), cacheEntry);
            }
        }
        // Copy the input stream to our output stream (if requested)
        if (serveContent) {
            try {
                response.setBufferSize(output);
            } catch (IllegalStateException e) {
            // Silent catch
            }
            if (ostream != null) {
                if (!checkSendfile(request, response, cacheEntry, contentLength, null))
                    copy(cacheEntry, renderResult, ostream);
            } else {
                copy(cacheEntry, renderResult, writer);
            }
        }
    } else {
        if ((ranges == null) || (ranges.isEmpty()))
            return;
        // Partial content response.
        response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
        if (ranges.size() == 1) {
            Range range = ranges.get(0);
            response.addHeader("Content-Range", "bytes " + range.start + "-" + range.end + "/" + range.length);
            long length = range.end - range.start + 1;
            if (length < Integer.MAX_VALUE) {
                response.setContentLength((int) length);
            } else {
                // Set the content-length as String to be able to use a long
                response.setHeader("content-length", "" + length);
            }
            if (contentType != null) {
                if (debug > 0)
                    log("DefaultServlet.serveFile:  contentType='" + contentType + "'");
                response.setContentType(contentType);
            }
            if (serveContent) {
                try {
                    response.setBufferSize(output);
                } catch (IllegalStateException e) {
                // Silent catch
                }
                if (ostream != null) {
                    if (!checkSendfile(request, response, cacheEntry, range.end - range.start + 1, range))
                        copy(cacheEntry, ostream, range);
                } else {
                    // we should not get here
                    throw new IllegalStateException();
                }
            }
        } else {
            response.setContentType("multipart/byteranges; boundary=" + mimeSeparation);
            if (serveContent) {
                try {
                    response.setBufferSize(output);
                } catch (IllegalStateException e) {
                // Silent catch
                }
                if (ostream != null) {
                    copy(cacheEntry, ostream, ranges.iterator(), contentType);
                } else {
                    // we should not get here
                    throw new IllegalStateException();
                }
            }
        }
    }
}
Also used : ServletResponse(javax.servlet.ServletResponse) HttpServletResponse(javax.servlet.http.HttpServletResponse) ServletOutputStream(javax.servlet.ServletOutputStream) BufferedInputStream(java.io.BufferedInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) FileNotFoundException(java.io.FileNotFoundException) CacheEntry(org.apache.naming.resources.CacheEntry) ResponseFacade(org.apache.catalina.connector.ResponseFacade) ServletResponseWrapper(javax.servlet.ServletResponseWrapper) PrintWriter(java.io.PrintWriter)

Example 5 with ResponseFacade

use of org.apache.catalina.connector.ResponseFacade in project tomcat by apache.

the class ApplicationDispatcher method unwrapResponse.

/**
 * Unwrap the response if we have wrapped it.
 */
private void unwrapResponse(State state) {
    if (state.wrapResponse == null) {
        return;
    }
    if (state.outerRequest.isAsyncStarted()) {
        if (!state.outerRequest.getAsyncContext().hasOriginalRequestAndResponse()) {
            return;
        }
    }
    ServletResponse previous = null;
    ServletResponse current = state.outerResponse;
    while (current != null) {
        // If we run into the container response we are done
        if ((current instanceof Response) || (current instanceof ResponseFacade)) {
            break;
        }
        // Remove the current response if it is our wrapper
        if (current == state.wrapResponse) {
            ServletResponse next = ((ServletResponseWrapper) current).getResponse();
            if (previous == null) {
                state.outerResponse = next;
            } else {
                ((ServletResponseWrapper) previous).setResponse(next);
            }
            break;
        }
        // Advance to the next response in the chain
        previous = current;
        current = ((ServletResponseWrapper) current).getResponse();
    }
}
Also used : Response(org.apache.catalina.connector.Response) ServletResponse(jakarta.servlet.ServletResponse) HttpServletResponse(jakarta.servlet.http.HttpServletResponse) ServletResponse(jakarta.servlet.ServletResponse) HttpServletResponse(jakarta.servlet.http.HttpServletResponse) ResponseFacade(org.apache.catalina.connector.ResponseFacade) ServletResponseWrapper(jakarta.servlet.ServletResponseWrapper)

Aggregations

ResponseFacade (org.apache.catalina.connector.ResponseFacade)8 PrintWriter (java.io.PrintWriter)5 HttpServletResponse (javax.servlet.http.HttpServletResponse)4 BufferedInputStream (java.io.BufferedInputStream)3 ByteArrayInputStream (java.io.ByteArrayInputStream)3 FileInputStream (java.io.FileInputStream)3 FileNotFoundException (java.io.FileNotFoundException)3 InputStream (java.io.InputStream)3 ServletOutputStream (javax.servlet.ServletOutputStream)3 ServletResponse (javax.servlet.ServletResponse)3 ServletResponseWrapper (javax.servlet.ServletResponseWrapper)3 ServletOutputStream (jakarta.servlet.ServletOutputStream)2 ServletResponse (jakarta.servlet.ServletResponse)2 ServletResponseWrapper (jakarta.servlet.ServletResponseWrapper)2 HttpServletResponse (jakarta.servlet.http.HttpServletResponse)2 IOException (java.io.IOException)2 OutputStreamWriter (java.io.OutputStreamWriter)2 Charset (java.nio.charset.Charset)2 WebResource (org.apache.catalina.WebResource)2 Response (org.apache.catalina.connector.Response)2