Class ResponseWriter

java.lang.Object
com.vaadin.flow.internal.ResponseWriter
All Implemented Interfaces:
Serializable

public class ResponseWriter extends Object implements Serializable
The class that handles writing the response data into the response.

For internal use only. May be renamed or removed in a future release.

Since:
1.0.
Author:
Vaadin Ltd
See Also:
  • Constructor Details

    • ResponseWriter

      public ResponseWriter(DeploymentConfiguration deploymentConfiguration)
      Create a response writer with the given deployment configuration.
      Parameters:
      deploymentConfiguration - the deployment configuration to use, not null
      Since:
      1.3
  • Method Details

    • writeResponseContents

      public void writeResponseContents(String filenameWithPath, URL resourceUrl, jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws IOException
      Writes the contents and content type (if available) of the given resourceUrl to the response.

      WARNING: note that this should not be used for a resourceUrl that represents a directory! For security reasons, the directory contents should not be ever written into the response, and the implementation which is used for setting the content length relies on URLConnection.getContentLengthLong() method which returns incorrect values for directories.

      Parameters:
      filenameWithPath - the name of the file being sent
      resourceUrl - the URL to the file, reported by the servlet container
      request - the request object to read from
      response - the response object to write to
      Throws:
      IOException - if the servlet container threw an exception while locating the resource
    • parseRanges

      public static List<Pair<Long,Long>> parseRanges(String range, long resourceLength, Object resource)
      Parses the value of a Range request header the same way as writeResponseContents(java.lang.String, java.net.URL, jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse) does for static files.

      Returns null if the header should be ignored and the whole content sent, which RFC 9110 allows: when it is not a valid bytes range, or the length of the resource is unknown. Otherwise returns the requested ranges as inclusive first and last byte positions, clamped to the length. Ranges that start past the end are dropped, so an empty list means that none of them is satisfiable. Ranges beyond the limits on count and overlap are dropped as well.

      Parameters:
      range - the value of the Range request header, not null
      resourceLength - the length of the resource, or -1 if unknown
      resource - the resource, used in log messages
      Returns:
      the ranges to send, or null if the header is ignored
    • writeRanges

      public static void writeRanges(List<Pair<Long,Long>> ranges, long resourceLength, InputStream dataStream, URL resourceUrl, OutputStream outputStream, jakarta.servlet.http.HttpServletResponse response) throws IOException
      Writes a range response for ranges returned by parseRanges(String, long, Object), the same way as writeResponseContents(java.lang.String, java.net.URL, jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse) does for static files: 206 Partial Content with a single range or a multipart/byteranges body, or 416 Range Not Satisfiable if the list is empty.

      The content is read from the given stream, skipping to each range. The resource is opened again from its URL only if the ranges are not in ascending order. The status and headers of a single range are set only after reading its first bytes, so content that ends before the range starts fails before anything is committed.

      Parameters:
      ranges - the ranges to send, not null
      resourceLength - the length of the resource
      dataStream - the content of the resource, positioned at its first byte, not null; not closed by this method
      resourceUrl - the URL of the resource, to read it again for ranges that are not in ascending order, not null
      outputStream - the stream to write the body to, usually the output stream of the response, not null; not flushed or closed by this method
      response - the response to set the status and headers of, not null
      Throws:
      IOException - if reading the resource or writing the response fails, or the resource ends before a range does
    • acceptsGzippedResource

      protected boolean acceptsGzippedResource(jakarta.servlet.http.HttpServletRequest request)
      Returns whether it is ok to serve a gzipped version of the given resource.

      If this method returns true, the browser is ok with receiving a gzipped version of the resource. In other cases, an uncompressed file must be sent.

      Parameters:
      request - the request for the resource
      Returns:
      true if the servlet should attempt to serve a gzipped version of the resource, false otherwise
    • acceptsBrotliResource

      protected boolean acceptsBrotliResource(jakarta.servlet.http.HttpServletRequest request)
      Returns whether it is ok to serve a Brotli version of the given resource.

      If this method returns true, the browser is ok with receiving a Brotli version of the resource. In other cases, an uncompressed or gzipped file must be sent.

      Parameters:
      request - the request for the resource
      Returns:
      true if the servlet should attempt to serve a Brotli version of the resource, false otherwise
      Since:
      1.3