public void close() { close(NOOP_COMPLETION_HANDLER); }
@Override public void close(CompletionHandler handler) { commitResponse(); servletOutputStreamWriter.close(handlerOrNoopHandler(handler)); }
/** * Async version of {@link org.eclipse.jetty.server.Response#sendError(int, String)}. */ private void sendErrorAsync(int statusCode, String reasonPhrase) { servletResponse.setHeader(HttpHeaders.Names.EXPIRES, null); servletResponse.setHeader(HttpHeaders.Names.LAST_MODIFIED, null); servletResponse.setHeader(HttpHeaders.Names.CACHE_CONTROL, null); servletResponse.setHeader(HttpHeaders.Names.CONTENT_TYPE, null); servletResponse.setHeader(HttpHeaders.Names.CONTENT_LENGTH, null); setStatus(servletResponse, statusCode, Optional.of(reasonPhrase)); // If we are allowed to have a body if (statusCode != HttpServletResponse.SC_NO_CONTENT && statusCode != HttpServletResponse.SC_NOT_MODIFIED && statusCode != HttpServletResponse.SC_PARTIAL_CONTENT && statusCode >= HttpServletResponse.SC_OK) { servletResponse.setHeader(HttpHeaders.Names.CACHE_CONTROL, "must-revalidate,no-cache,no-store"); servletResponse.setContentType(MimeTypes.Type.TEXT_HTML_8859_1.toString()); byte[] errorContent = errorResponseContentCreator .createErrorContent(servletRequest.getRequestURI(), statusCode, Optional.ofNullable(reasonPhrase)); servletResponse.setContentLength(errorContent.length); servletOutputStreamWriter.sendErrorContentAndCloseAsync(ByteBuffer.wrap(errorContent)); } else { servletResponse.setContentLength(0); servletOutputStreamWriter.close(); } }
private void setResponse(Response jdiscResponse) { synchronized (monitor) { if (responseCommitted) { log.log(Level.FINE, jdiscResponse.getError(), () -> "Response already committed, can't change response code. " + "From: " + servletResponse.getStatus() + ", To: " + jdiscResponse.getStatus()); //TODO: should throw an exception here, but this breaks unit tests. //The failures will now instead happen when writing buffers. servletOutputStreamWriter.close(); return; } setStatus_holdingLock(jdiscResponse, servletResponse); setHeaders_holdingLock(jdiscResponse, servletResponse); } }
public void trySendError(Throwable t) { final boolean responseWasCommitted; try { synchronized (monitor) { String reasonPhrase = getReasonPhrase(t, developerMode); int statusCode = getStatusCode(t); responseWasCommitted = responseCommitted; if (!responseCommitted) { responseCommitted = true; sendErrorAsync(statusCode, reasonPhrase); } } } catch (Throwable e) { servletOutputStreamWriter.fail(t); return; } //Must be evaluated after state transition for test purposes(See ConformanceTestException) //Done outside the monitor since it causes a callback in tests. if (responseWasCommitted) { RuntimeException exceptionWithStackTrace = new RuntimeException(t); log.log(Level.FINE, "Response already committed, can't change response code", exceptionWithStackTrace); // TODO: should always have failed here, but that breaks test assumptions. Doing soft close instead. //assert !Thread.holdsLock(monitor); //servletOutputStreamWriter.fail(t); servletOutputStreamWriter.close(); } }