private void flushHeadersIfPossible() throws IOException { if (!response.isCommitted()) { response.flushHeaders(); } }
@Test(expected = IllegalStateException.class) public void shouldNotAllowHeadersToBeFlushedTwice() throws IOException { try { httpServletResponseImpl.flushHeaders(); } catch (IllegalStateException e) { fail("Should not throw exception on the first call"); } httpServletResponseImpl.flushHeaders(); }
private void serveFile(final HttpServletResponse response, final File file) throws IOException { response.setContentLength(file.length()); ((HttpServletResponseImpl) response).flushHeaders(); InputStream inputStream = new FileInputStream(file); try { ((HttpServletResponseImpl) response).serveStream(inputStream); ((HttpServletResponseImpl) response).flush(); } finally { IOUtilities.closeSilently(inputStream); } } }
/** * Flushes the output. * * @throws IOException */ public void flush() throws IOException { // It makes no sense to set chunked encoding if there is no print writer if (printWriter != null && printWriter instanceof ChunkedPrintWriter) { getHeaders().setHeader(Headers.HEADER_TRANSFER_ENCODING, TRANSFER_ENCODING_CHUNKED); } if (!isCommitted()) { flushHeaders(); } if (printWriter != null) { printWriter.writeEnd(); printWriter.flush(); } outputStream.flush(); } }
private void loadCompleteContent(final HttpServletRequestImpl request, final HttpServletResponseImpl response, final File file) throws IOException { response.setContentType(mimeTypeMapping.getMimeTypeByExtension(FileUtilities.getExtension(file.getName()))); response.setStatus(HttpServletResponse.STATUS_OK); response.setContentLength(file.length()); response.getHeaders().setHeader(Headers.HEADER_ACCEPT_RANGES, "bytes"); response.flushHeaders(); if (!request.getMethod().equals(HttpServletRequest.METHOD_HEAD)) { InputStream fileInputStream = new FileInputStream(file); try { response.serveStream(fileInputStream); } finally { IOUtilities.closeSilently(fileInputStream); } } response.flush(); }
@Test public void shouldFlushHeadersOnFirstUseForByteSection() throws IOException { OutputStream out = mock(OutputStream.class); byte[] data = "Hello World".getBytes(Charset.defaultCharset()); HttpServletResponseImpl response = mock(HttpServletResponseImpl.class); ServletOutputStreamImpl outW = new ServletOutputStreamImpl(out, response); try { when(response.isCommitted()).thenReturn(false); outW.write(data, 0, 1); when(response.isCommitted()).thenReturn(true); outW.write(data, 0, 1); verify(out, times(2)).write(data, 0, 1); verify(response, times(1)).flushHeaders(); } finally { outW.close(); } }
@Test public void shouldFlushHeadersOnFirstUseForBytes() throws IOException { OutputStream out = mock(OutputStream.class); byte[] data = "Hello World".getBytes(Charset.defaultCharset()); HttpServletResponseImpl response = mock(HttpServletResponseImpl.class); ServletOutputStreamImpl outW = new ServletOutputStreamImpl(out, response); try { when(response.isCommitted()).thenReturn(false); outW.write(data); when(response.isCommitted()).thenReturn(true); outW.write(data); verify(out, times(2)).write(data); verify(response, times(1)).flushHeaders(); } finally { outW.close(); } }
@Test public void shouldFlushHeadersOnFirstUseForInts() throws IOException { OutputStream out = mock(OutputStream.class); int data = 1; HttpServletResponseImpl response = mock(HttpServletResponseImpl.class); ServletOutputStreamImpl outW = new ServletOutputStreamImpl(out, response); try { when(response.isCommitted()).thenReturn(false); outW.write(data); when(response.isCommitted()).thenReturn(true); outW.write(data); verify(out, times(2)).write(data); verify(response, times(1)).flushHeaders(); } finally { outW.close(); } }
/** * {@inheritDoc} */ @Override public void load(final String path, final HttpServletRequestImpl request, final HttpServletResponseImpl response) { String assetPath = getAssetPath(path); InputStream inputStream = null; try { inputStream = getInputStream(assetPath); response.setStatus(HttpServletResponse.STATUS_OK); // This must be done in a separate try catch block as some assets do not have a FD try (AssetFileDescriptor afd = assetManager.openFd(assetPath)) { response.setContentLength(afd.getLength()); } catch (IOException e) { // There is no asset description or we can't read the length of the asset } // TODO Set mime type //response.setContentType(JLWSConfig.MimeTypeMapping.getMimeTypeByExtension(fileExt)); response.flushHeaders(); response.serveStream(inputStream); } catch (IOException e) { throw new UnexpectedSituationException(e); } finally { IOUtilities.closeSilently(inputStream); } }