@Override protected String featureValueOf(Request actual) { return actual.uri(); } };
@Override protected boolean matchesSafely(Request request) { return uri.equals(request.uri()); }
@Override public CompletionStage<Response<ByteString>> send(Request request, Optional<Request> incoming) { final URI uri = URI.create(request.uri()); final String service = uri.getAuthority(); callsGatherer.gatherOutgoingCall(service, request); return delegate.send(request, incoming); } }
@Override public Optional<RuleMatch<E>> match(Request message) throws InvalidUriException { final String uri = message.uri(); if (isMeta(uri)) { return metaRouter.match(message); } else { return applicationRouter.match(message); } }
@Override public CompletionStage<Response<ByteString>> send(Request request) { final ResponseSource responseSource = responseSource(request); if (responseSource == null) { final NoMatchingResponseFoundException notFound = new NoMatchingResponseFoundException("Could not find any mapping for " + request.uri()); final CompletableFuture<Response<ByteString>> notFoundFuture = new CompletableFuture<>(); notFoundFuture.completeExceptionally(notFound); return notFoundFuture; } // Create response task final ResponseWithDelay responseWithDelay = responseSource.create(request); // Schedule a response in the future final CompletableFuture<Response<ByteString>> future = new CompletableFuture<>(); final Runnable replyTask = () -> { Response<ByteString> response = responseWithDelay.getResponse(); requestsAndResponses.add(RequestResponsePair.create(request, response)); future.complete(response); }; if (responseWithDelay.getDelayMillis() <= 0) { replyTask.run(); } else { executor.schedule(replyTask, responseWithDelay.getDelayMillis(), TimeUnit.MILLISECONDS); } return future; }
match = applicationRouter.match(request); } catch (InvalidUriException e) { LOG.warn("bad uri {} {} {}", request.method(), request.uri(), BAD_REQUEST, e); ongoingRequest.reply(forStatus(BAD_REQUEST)); return; Collection<String> methods = applicationRouter.getMethodsForValidRules(request); if (methods.isEmpty()) { LOG.warn("not found {} {} {}", request.method(), request.uri(), NOT_FOUND); ongoingRequest.reply(forStatus(NOT_FOUND)); } else { } else { statusCode = METHOD_NOT_ALLOWED; LOG.warn("wrong method {} {} {}", request.method(), request.uri(), statusCode);
@Override public Optional<RuleMatch<T>> match(Request message) throws InvalidUriException { final String method = message.method(); final String path = getPath(message); if (method == null) { LOG.warn("Invalid request for {} sent without method by service {}", message.uri(), message.service().orElse("<unknown>")); throw new InvalidUriException(); } if (path == null) { // Problem already logged in detail upstream throw new InvalidUriException(); } final Router.Result<Rule<T>> result = router.result(); router.route(method, path, result); if (!result.isSuccess()) { return Optional.empty(); } final Rule<T> rule = result.target(); final ImmutableMap.Builder<String, String> pathArgs = ImmutableMap.builder(); for (int i = 0; i < result.params(); i++) { pathArgs.put(result.paramName(i), readParameterValue(result, i)); } return Optional.of(new RuleMatch<T>(rule, pathArgs.build())); }
.url(apolloRequest.uri()) .headers(headersBuilder.build()) .build();
@Override protected String featureValueOf(Request actual) { return actual.uri(); } };
@Override protected boolean matchesSafely(Request request) { return uri.equals(request.uri()); }
@Override public CompletionStage<Response<ByteString>> send(Request request) { final ResponseSource responseSource = responseSource(request); if (responseSource == null) { final NoMatchingResponseFoundException notFound = new NoMatchingResponseFoundException("Could not find any mapping for " + request.uri()); final CompletableFuture<Response<ByteString>> notFoundFuture = new CompletableFuture<>(); notFoundFuture.completeExceptionally(notFound); return notFoundFuture; } // Create response task final ResponseWithDelay responseWithDelay = responseSource.create(request); // Schedule a response in the future final CompletableFuture<Response<ByteString>> future = new CompletableFuture<>(); final Runnable replyTask = () -> { Response<ByteString> response = responseWithDelay.getResponse(); requestsAndResponses.add(RequestResponsePair.create(request, response)); future.complete(response); }; if (responseWithDelay.getDelayMillis() <= 0) { replyTask.run(); } else { executor.schedule(replyTask, responseWithDelay.getDelayMillis(), TimeUnit.MILLISECONDS); } return future; }
public static <T> Middleware<AsyncHandler<Response<T>>, AsyncHandler<Response<T>>> httpLogger( Logger log, RequestAuthenticator authenticator) { return innerHandler -> requestContext -> { final Request request = requestContext.request(); log.info("{}{} {} by {} with headers {} parameters {} and payload {}", "GET".equals(request.method()) ? "" : "[AUDIT] ", request.method(), request.uri(), // TODO: pass in auth context instead of authenticating twice auth(requestContext, authenticator).user().map(idToken -> idToken.getPayload() .getEmail()) .orElse("anonymous"), hideSensitiveHeaders(request.headers()), request.parameters(), request.payload().map(ByteString::utf8).orElse("") .replaceAll("\n", " ")); return innerHandler.invoke(requestContext); }; }
public static <T> Middleware<AsyncHandler<Response<T>>, AsyncHandler<Response<T>>> tracer( Tracer tracer, String service) { return innerHandler -> requestContext -> { final Request request = requestContext.request(); final URI uri = URI.create(request.uri()); final Span span = tracer.spanBuilder(service + '/' + uri.getPath()).startSpan(); span.putAttribute("method", stringAttributeValue(request.method())); span.putAttribute("uri", stringAttributeValue(request.uri())); final CompletionStage<Response<T>> response; try { response = innerHandler.invoke(requestContext); } catch (Exception e) { span.setStatus(UNKNOWN); span.end(); Throwables.throwIfUnchecked(e); throw new RuntimeException(e); } response.whenComplete((r, ex) -> { if (ex != null) { span.setStatus(UNKNOWN); } span.end(); }); return response; }; }