@Override public Optional<RestxHandlerMatch> match(RestxRequest req) { for (String path : paths) { if (req.getRestxPath().startsWith(path)) { return Optional.absent(); } } return Optional.of( new RestxHandlerMatch( new StdRestxRequestMatch("*", req.getRestxPath()), new RestxHandler() { @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"); } } })); } })); }
Iterable<WhenHttpRequest> findWhensMatchingRequest( ImmutableMap<String, RestxSpec> allSpecs, RestxRequest restxRequest) { Collection<WhenHttpRequest> matchingRequestsSpecs = Lists.newArrayList(); for (Map.Entry<String, RestxSpec> spec : allSpecs.entrySet()) { for (When when : spec.getValue().getWhens()) { if (when instanceof WhenHttpRequest) { WhenHttpRequest request = (WhenHttpRequest) when; String requestPath = request.getPath(); if (!requestPath.startsWith("/")) { requestPath = "/" + requestPath; } StdRequest stdRequest = StdRequest.builder() .setBaseUri("http://restx.io") // baseUri is required but we won't use it .setHttpMethod(request.getMethod()) .setFullPath(requestPath) .build(); if (restxRequest.getHttpMethod().equals(stdRequest.getHttpMethod()) && restxRequest.getRestxPath().equals(stdRequest.getRestxPath())) { MapDifference<String, ImmutableList<String>> difference = Maps.difference(restxRequest.getQueryParams(), stdRequest.getQueryParams()); if (difference.entriesOnlyOnRight().isEmpty() && difference.entriesDiffering().isEmpty()) { matchingRequestsSpecs.add(request); break; } } } } } return matchingRequestsSpecs; }
@Override public Optional<RestxRouteMatch> match(RestxRequest req) { if (req.getHttpMethod().equals("GET") && req.getRestxPath().startsWith(baseRestPath)) { return Optional.of(new RestxRouteMatch(this, baseRestPath + "*", req.getRestxPath())); } else { return Optional.absent(); } }
@Override public void handle(RestxRouteMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { String relativePath = req.getRestxPath().substring(baseRestPath.length()); relativePath = Optional.fromNullable(aliases.get(relativePath)).or(relativePath); try { URL resource = MoreResources.getResource( baseResourcePath + relativePath, RestxContext.Modes.DEV.equals(ctx.getMode())); resp.setStatus(HttpStatus.OK.getCode()); resp.setContentType( HTTP.getContentTypeFromExtension(relativePath).or("application/octet-stream")); ByteStreams.copy(Resources.newInputStreamSupplier(resource), resp.getOutputStream()); } catch (IllegalArgumentException e) { notFound(resp, relativePath); } }