@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx); try { resp.close(); } catch (Exception e) { logger.error("ERROR while closing response: " + e.getMessage(), e); } } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx); try { resp.close(); } catch (Exception e) { logger.error("ERROR while closing response: " + e.getMessage(), e); } } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { Stopwatch stopwatch = Stopwatch.createStarted(); try { ctx.nextHandlerMatch().handle(req, resp, ctx); } finally { collector.notifyRequest(req, resp, stopwatch.stop()); } }
@Override public void handle(RestxRequestMatch restxRequestMatch, RestxRequest restxRequest, RestxResponse restxResponse, RestxContext restxContext) throws IOException { try { restxContext.nextHandlerMatch().handle(restxRequest, new RestxResponseWrapper(restxResponse) { private GZIPOutputStream gzipOutputStream; @Override public OutputStream getOutputStream() throws IOException { setHeader("Content-Encoding", "gzip"); return gzipOutputStream = new GZIPOutputStream(super.getOutputStream()); } @Override public void close() throws Exception { if (gzipOutputStream != null) { try { gzipOutputStream.close(); } finally { gzipOutputStream = null; } } super.close(); } }, restxContext); } finally { } } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override @SuppressWarnings("unchecked") public void onEntityOutput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input, Optional<?> output) { if (output.isPresent()) { provider.provideETagFor((T) output.get()).handleIn(req, resp); } } })); } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override @SuppressWarnings("unchecked") public void onEntityOutput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input, Optional<?> output) { if (output.isPresent()) { provider.provideETagFor((T) output.get()).handleIn(req, resp); } } })); } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { if (!resp.getHeader("Cache-Control").isPresent()) { resp.setHeader("Cache-Control", "no-cache"); } } })); } }));
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { if (!resp.getHeader("Cache-Control").isPresent()) { resp.setHeader("Cache-Control", "no-cache"); } } })); } }));
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, final RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { EntityRelatedFilter.this.onBeforeWriteContent(req, resp, resourceDescription, operationDescription); } @Override public void onAfterWriteContent(RestxRequest req, RestxResponse resp) { EntityRelatedFilter.this.onAfterWriteContent(req, resp, resourceDescription, operationDescription); } @Override public void onEntityInput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input) { EntityRelatedFilter.this.onEntityInput(stdRoute, req, resp, input, resourceDescription, operationDescription); } @Override public void onEntityOutput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input, Optional<?> output) { EntityRelatedFilter.this.onEntityOutput(stdRoute, req, resp, input, output, resourceDescription, operationDescription); } })); } }));
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { String base64Pwd = req.getHeader("Authorization").get().substring("basic ".length()); String auth = new String(BaseEncoding.base64().decode(base64Pwd), Charsets.UTF_8); int i = auth.indexOf(':'); if (i < 0) { throw new WebException(HttpStatus.BAD_REQUEST, "Invalid Basic Authentication. It must have the form <user>:<pwd>. It was: " + auth); } String u = auth.substring(0, i); String pwd = auth.substring(i + 1); Optional<? extends RestxPrincipal> principal = authenticator.authenticate( u, pwd, ImmutableMap.<String, Object>of()); if (principal.isPresent()) { logger.debug("http basic authenticated '{}'", principal.get().getName()); RestxSession.current().authenticateAs(principal.get()); } else { throw new WebException(HttpStatus.UNAUTHORIZED); } ctx.nextHandlerMatch().handle(req, resp, ctx); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { String base64Pwd = req.getHeader("Authorization").get().substring("basic ".length()); String auth = new String(BaseEncoding.base64().decode(base64Pwd), Charsets.UTF_8); int i = auth.indexOf(':'); if (i < 0) { throw new WebException(HttpStatus.BAD_REQUEST, "Invalid Basic Authentication. It must have the form <user>:<pwd>. It was: " + auth); } String u = auth.substring(0, i); String pwd = auth.substring(i + 1); Optional<? extends RestxPrincipal> principal = authenticator.authenticate( u, pwd, ImmutableMap.<String, Object>of()); if (principal.isPresent()) { logger.debug("http basic authenticated '{}'", principal.get().getName()); RestxSession.current().authenticateAs(principal.get()); } else { throw new WebException(HttpStatus.UNAUTHORIZED); } ctx.nextHandlerMatch().handle(req, resp, ctx); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, final RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { EntityRelatedFilter.this.onBeforeWriteContent(req, resp, resourceDescription, operationDescription); } @Override public void onAfterWriteContent(RestxRequest req, RestxResponse resp) { EntityRelatedFilter.this.onAfterWriteContent(req, resp, resourceDescription, operationDescription); } @Override public void onEntityInput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input) { EntityRelatedFilter.this.onEntityInput(stdRoute, req, resp, input, resourceDescription, operationDescription); } @Override public void onEntityOutput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input, Optional<?> output) { EntityRelatedFilter.this.onEntityOutput(stdRoute, req, resp, input, output, resourceDescription, operationDescription); } })); } }));
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { AcceptedCORS cors = (AcceptedCORS) match.getOtherParams().get("cors"); resp.setHeader("Access-Control-Allow-Origin", cors.getOrigin()); if (!cors.getHeaders().isEmpty()) { resp.setHeader("Access-Control-Allow-Headers", Joiner.on(", ").join(cors.getHeaders())); } if (!cors.getMethods().isEmpty()) { resp.setHeader("Access-Control-Allow-Methods", Joiner.on(", ").join(cors.getMethods())); } if (cors.getAllowCredentials().or(false)) { resp.setHeader("Access-Control-Allow-Credentials", "true"); } ctx.nextHandlerMatch().handle(req, resp, ctx); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { boolean hasSetSession = false; if (RestxSession.current() == null) { RestxSession.setCurrent(new RestxSession( definition, ImmutableMap.<String, String>of(), Optional.<RestxPrincipal>absent(), Duration.ZERO)); hasSetSession = true; } try { ctx.nextHandlerMatch().handle(req, resp, ctx); } finally { if (hasSetSession) { RestxSession.setCurrent(null); } } } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { AcceptedCORS cors = (AcceptedCORS) match.getOtherParams().get("cors"); resp.setHeader("Access-Control-Allow-Origin", cors.getOrigin()); if (!cors.getHeaders().isEmpty()) { resp.setHeader("Access-Control-Allow-Headers", Joiner.on(", ").join(cors.getHeaders())); } if (!cors.getMethods().isEmpty()) { resp.setHeader("Access-Control-Allow-Methods", Joiner.on(", ").join(cors.getMethods())); } if (cors.getAllowCredentials().or(false)) { resp.setHeader("Access-Control-Allow-Credentials", "true"); } ctx.nextHandlerMatch().handle(req, resp, ctx); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { HttpServletRequest httpServletRequest = req.unwrap(HttpServletRequest.class); final Principal userPrincipal = httpServletRequest.getUserPrincipal(); if (userPrincipal != null) { logger.debug("setting restx principal from http servlet request {}", userPrincipal); if (userPrincipal instanceof RestxPrincipal) { RestxSession.current().authenticateAs((RestxPrincipal) userPrincipal); } else { RestxSession.current().authenticateAs(servletPrincipalConverter.toRestxPrincipal(userPrincipal)); } } ctx.nextHandlerMatch().handle(req, resp, ctx); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { boolean hasSetSession = false; if (RestxSession.current() == null) { RestxSession.setCurrent(new RestxSession( definition, ImmutableMap.<String, String>of(), Optional.<RestxPrincipal>absent(), Duration.ZERO)); hasSetSession = true; } try { ctx.nextHandlerMatch().handle(req, resp, ctx); } finally { if (hasSetSession) { RestxSession.setCurrent(null); } } } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { RestxSession session = RestxSession.current(); ImmutableMap<String, String> metadata = prepareSessionStatsMetadata(req, session); if (session.getPrincipal().isPresent()) { String name = session.getPrincipal().get().getName(); sessions.touch(name, metadata); MDC.put("principal", name); } else { sessions.touch("anonymous@" + req.getClientAddress(), metadata); } ctx.nextHandlerMatch().handle(req, resp, ctx); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { RestxSession session = RestxSession.current(); ImmutableMap<String, String> metadata = prepareSessionStatsMetadata(req, session); if (session.getPrincipal().isPresent()) { String name = session.getPrincipal().get().getName(); sessions.touch(name, metadata); MDC.put("principal", name); } else { sessions.touch("anonymous@" + req.getClientAddress(), metadata); } ctx.nextHandlerMatch().handle(req, resp, ctx); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, final RestxResponse resp, RestxContext ctx) throws IOException { final RestxSession session = buildContextFromRequest(req); if (RestxContext.Modes.RECORDING.equals(ctx.getMode())) { // we invalidate caches in recording mode so that each request records the cache loading // Note: having this piece of code here is not a very nice isolation of responsibilities // we could put it in a separate filter, but then it's not easy to be sure it's called right after this // filter. Until such a feature is introduced, the easy solution to put it here is used. sessionDefinition.invalidateAllCaches(); } RestxSession.setCurrent(session); try { RouteLifecycleListener lifecycleListener = new AbstractRouteLifecycleListener() { @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { RestxSession newSession = RestxSession.current(); if (newSession != session) { updateSessionInClient(resp, newSession); } } }; ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(lifecycleListener)); } finally { RestxSession.setCurrent(null); // we don't remove the MDC principal here, we want to keep it until the end of the request } }