package restx.servlet; import org.joda.time.Duration; import restx.AbstractResponse; import restx.http.HttpStatus; import restx.RestxResponse; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.util.LinkedHashMap; import java.util.Map; /** * User: xavierhanin * Date: 2/6/13 * Time: 9:40 PM */ public class HttpServletRestxResponse extends AbstractResponse<HttpServletResponse> { private final HttpServletResponse resp; private final HttpServletRequest request; public HttpServletRestxResponse(HttpServletResponse resp, HttpServletRequest request) { super(HttpServletResponse.class, resp); this.resp = resp; this.request = request; } @Override protected void doSetStatus(HttpStatus httpStatus) { resp.setStatus(httpStatus.getCode()); } @Override protected OutputStream doGetOutputStream() throws IOException { return resp.getOutputStream(); } @Override protected void closeResponse() throws IOException { } @Override public RestxResponse addCookie(String cookie, String value, Duration expiration) { Cookie existingCookie = HttpServletRestxRequest.getCookie(request.getCookies(), cookie); if (existingCookie != null) { if ("/".equals(existingCookie.getPath()) || existingCookie.getPath() == null // in some cases cookies set on path '/' are returned with a null path ) { // update existing cookie existingCookie.setPath("/"); existingCookie.setValue(value); existingCookie.setMaxAge(expiration.getStandardSeconds() > 0 ? (int) expiration.getStandardSeconds() : -1); resp.addCookie(existingCookie); } else { // we have an existing cookie on another path: clear it, and add a new cookie on root path existingCookie.setValue(""); existingCookie.setMaxAge(0); resp.addCookie(existingCookie); Cookie c = new Cookie(cookie, value); c.setPath("/"); c.setMaxAge(expiration.getStandardSeconds() > 0 ? (int) expiration.getStandardSeconds() : -1); resp.addCookie(c); } } else { Cookie c = new Cookie(cookie, value); c.setPath("/"); c.setMaxAge(expiration.getStandardSeconds() > 0 ? (int) expiration.getStandardSeconds() : -1); resp.addCookie(c); } return this; } @Override public RestxResponse clearCookie(String cookie) { Cookie existingCookie = HttpServletRestxRequest.getCookie(request.getCookies(), cookie); if (existingCookie != null) { existingCookie.setPath("/"); existingCookie.setValue(""); existingCookie.setMaxAge(0); resp.addCookie(existingCookie); } return this; } @Override public void doSetHeader(String headerName, String header) { resp.setHeader(headerName, header); } @Override @SuppressWarnings("unchecked") public <T> T unwrap(Class<T> clazz) { if (clazz == HttpServletResponse.class || clazz == ServletResponse.class) { return (T) resp; } throw new IllegalArgumentException("underlying implementation is HttpServletResponse, not " + clazz.getName()); } }