package com.vtence.molecule.middlewares; import com.vtence.molecule.Request; import com.vtence.molecule.Response; import com.vtence.molecule.http.Cookie; import com.vtence.molecule.http.CookieDecoder; import com.vtence.molecule.lib.CookieJar; import java.util.Collections; import java.util.List; import java.util.function.Consumer; import static com.vtence.molecule.http.HeaderNames.COOKIE; import static com.vtence.molecule.http.HeaderNames.SET_COOKIE; public class Cookies extends AbstractMiddleware { private final CookieDecoder cookieDecoder = new CookieDecoder(); public void handle(Request request, Response response) throws Exception { CookieJar cookieJar = new CookieJar(clientCookiesFrom(request)); cookieJar.bind(request); try { forward(request, response).whenSuccessful(commitCookies(cookieJar)) .whenComplete((result, error) -> cookieJar.unbind(request)); } catch (Throwable error) { cookieJar.unbind(request); throw error; } } private Consumer<Response> commitCookies(CookieJar cookies) { return response -> { for (Cookie cookie : cookies.fresh()) { response.addHeader(SET_COOKIE, cookie.toString()); } for (Cookie cookie : cookies.discarded()) { response.addHeader(SET_COOKIE, cookie.maxAge(0).toString()); } }; } private List<Cookie> clientCookiesFrom(Request request) { String cookieHeader = request.header(COOKIE); return cookieHeader != null ? cookieDecoder.decode(cookieHeader) : Collections.<Cookie>emptyList(); } }