@Override public void addCookie(final Cookie cookie) { httpServletResponse.addCookie(cookie); }
@Override public void addHeader(final String name, final String value) { httpServletResponse.addHeader(name, value); }
public void closeStreamAndWriter() throws IOException { httpServletResponse.closeStreamAndWriter(); }
@Override public void setCharacterEncoding(final String charset) { if (insideInclude || responseStarted() || writer != null || isCommitted()) { return; } charsetSet = charset != null; this.charset = charset; if (contentType != null) { exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, getContentType()); } }
public void handleNormalRequest(HttpServerExchange undertowExchange) throws Exception { HttpServletResponseImpl response = new HttpServletResponseImpl(undertowExchange, (ServletContextImpl)servletContext); HttpServletRequestImpl request = new HttpServletRequestImpl(undertowExchange, (ServletContextImpl)servletContext); ServletRequestContext servletRequestContext = new ServletRequestContext(((ServletContextImpl)servletContext) .getDeployment(), request, response, null); undertowExchange.putAttachment(ServletRequestContext.ATTACHMENT_KEY, servletRequestContext); doService(request, response); }
response.sendError(HttpServletResponse.SC_FORBIDDEN); done = true; break; response.sendError(HttpServletResponse.SC_GONE); done = true; break; urlString.insert(0, request.getContextPath()); response.sendRedirect(urlString.toString()); response.setStatus(rules[i].getRedirectCode()); done = true; break; cookie.setSecure(rules[i].isCookieSecure()); cookie.setHttpOnly(rules[i].isCookieHttpOnly()); response.addCookie(cookie);
if (anyAreSet(state, FLAG_CLOSED) || servletRequestContext.getOriginalResponse().isTreatAsCommitted()) { return; if (allAreClear(state, FLAG_WRITE_STARTED) && channel == null) { if (servletRequestContext.getOriginalResponse().getHeader(Headers.TRANSFER_ENCODING_STRING) == null) { if (buffer == null) { servletRequestContext.getOriginalResponse().setHeader(Headers.CONTENT_LENGTH, "0"); } else { servletRequestContext.getOriginalResponse().setHeader(Headers.CONTENT_LENGTH, Integer.toString(buffer.position()));
@Override public PrintWriter getWriter() throws IOException { if (writer == null) { if (!charsetSet) { //servet 5.5 setCharacterEncoding(getCharacterEncoding()); } if (responseState == ResponseState.STREAM) { throw UndertowServletMessages.MESSAGES.getOutputStreamAlreadyCalled(); } responseState = ResponseState.WRITER; createOutputStream(); final ServletPrintWriter servletPrintWriter = new ServletPrintWriter(servletOutputStream, getCharacterEncoding()); writer = ServletPrintWriterDelegate.newInstance(servletPrintWriter); } return writer; }
/** * {@inheritDoc} */ public void flush() throws IOException { //according to the servlet spec we ignore a flush from within an include if (servletRequestContext.getOriginalRequest().getDispatcherType() == DispatcherType.INCLUDE || servletRequestContext.getOriginalResponse().isTreatAsCommitted()) { return; } if (servletRequestContext.getDeployment().getDeploymentInfo().isIgnoreFlush() && servletRequestContext.getExchange().isRequestComplete() && servletRequestContext.getOriginalResponse().getHeader(Headers.TRANSFER_ENCODING_STRING) == null) { //we mark the stream as flushed, but don't actually flush //because in most cases flush just kills performance //we only do this if the request is fully read, so that http tunneling scenarios still work servletRequestContext.getOriginalResponse().setIgnoredFlushPerformed(true); return; } flushInternal(); }
@Override public void close() throws IOException { ServletRequestContext servletRequestContext = exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY); if (!exchange.isComplete()) { try { HttpServletRequestImpl request = servletRequestContext.getOriginalRequest(); request.closeAndDrainRequest(); } finally { HttpServletResponseImpl response = servletRequestContext.getOriginalResponse(); response.closeStreamAndWriter(); } } else { try { HttpServletRequestImpl request = servletRequestContext.getOriginalRequest(); request.freeResources(); } finally { HttpServletResponseImpl response = servletRequestContext.getOriginalResponse(); response.freeResources(); } } }
@Override public void write(ByteBuffer[] buffers) throws IOException { if (anyAreSet(state, FLAG_CLOSED) || servletRequestContext.getOriginalResponse().isTreatAsCommitted()) { throw UndertowServletMessages.MESSAGES.streamIsClosed(); if (this.written == 0 && len == servletRequestContext.getOriginalResponse().getContentLength()) { if (channel == null) { channel = servletRequestContext.getExchange().getResponseChannel();
requestImpl.getExchange().getAttachment(ServletRequestContext.ATTACHMENT_KEY).setServletPathMatch(pathMatch); requestImpl.setServletContext(servletContext); responseImpl.setServletContext(servletContext); responseImpl.closeStreamAndWriter(); } else { try {
servletRequestContext.getOriginalResponse().isTreatAsCommitted()) { return; setFlags(FLAG_CLOSED); clearFlags(FLAG_READY); if (allAreClear(state, FLAG_WRITE_STARTED) && channel == null && servletRequestContext.getOriginalResponse().getHeader(Headers.CONTENT_LENGTH_STRING) == null) { if (servletRequestContext.getOriginalResponse().getHeader(Headers.TRANSFER_ENCODING_STRING) == null && servletRequestContext.getExchange().getAttachment(HttpAttachments.RESPONSE_TRAILER_SUPPLIER) == null && servletRequestContext.getExchange().getAttachment(HttpAttachments.RESPONSE_TRAILERS) == null) {
servletRequestContext.getOriginalResponse().doErrorDispatch(servletRequestContext.getErrorCode(), servletRequestContext.getErrorMessage()); ServletDebugPageHandler.handleRequest(exchange, servletRequestContext, t); } else { servletRequestContext.getOriginalResponse().doErrorDispatch(StatusCodes.INTERNAL_SERVER_ERROR, StatusCodes.INTERNAL_SERVER_ERROR_STRING); servletRequestContext.getOriginalResponse().responseDone(); servletRequestContext.getOriginalRequest().clearAttributes();
@Override public String getContentType() { if (contentType != null) { if (charsetSet) { return contentType + ";charset=" + getCharacterEncoding(); } else { return contentType; } } return null; }
public long getContentLength() { return httpServletResponse.getContentLength(); }
@Override public void setLocale(final Locale loc) { if (insideInclude || responseStarted()) { return; } this.locale = loc; exchange.getResponseHeaders().put(Headers.CONTENT_LANGUAGE, loc.getLanguage() + "-" + loc.getCountry()); if (!charsetSet && writer == null) { final Map<String, String> localeCharsetMapping = servletContext.getDeployment().getDeploymentInfo().getLocaleCharsetMapping(); // Match full language_country_variant first, then language_country, // then language only String charset = localeCharsetMapping.get(locale.toString()); if (charset == null) { charset = localeCharsetMapping.get(locale.getLanguage() + "_" + locale.getCountry()); if (charset == null) { charset = localeCharsetMapping.get(locale.getLanguage()); } } if (charset != null) { this.charset = charset; if (contentType != null) { exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, getContentType()); } } } }
@Override public void sendError(final int sc, final String msg) throws IOException { if(insideInclude) { //not 100% sure this is the correct action return; } ServletRequestContext src = exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY); if (responseStarted()) { if(src.getErrorCode() > 0) { return; //error already set } throw UndertowServletMessages.MESSAGES.responseAlreadyCommited(); } if(servletContext.getDeployment().getDeploymentInfo().isSendCustomReasonPhraseOnError()) { exchange.setReasonPhrase(msg); } writer = null; responseState = ResponseState.NONE; exchange.setStatusCode(sc); if(src.isRunningInsideHandler()) { //all we do is set the error on the context, we handle it when the request is returned treatAsCommitted = true; src.setError(sc, msg); } else { //if the src is null there is no outer handler, as we are in an asnc request doErrorDispatch(sc, msg); } }
@Override public String getContentType() { return httpServletResponse.getContentType(); }
@Override public String getHeader(final String name) { return httpServletResponse.getHeader(name); }