@Override public HttpResponse serve(ServiceRequestContext ctx, HttpRequest req) throws Exception { if (first.findFile(ctx, req) != null) { return first.serve(ctx, req); } else { return second.serve(ctx, req); } }
/** * Returns a new decorator which decorates a {@link Service} by the specified * {@link Decorator}. */ @SuppressWarnings("unchecked") private static Function<Service<HttpRequest, HttpResponse>, ? extends Service<HttpRequest, HttpResponse>> newDecorator(Decorator decorator) { return service -> service.decorate(getInstance(decorator, DecoratingServiceFunction.class)); }
try { req.init(reqCtx); serviceResponse = service.serve(reqCtx, req); } catch (HttpResponseException cause) { serviceResponse = cause.httpResponse(); final boolean isTransient = service.as(TransientService.class).isPresent(); if (!isTransient) { gracefulShutdownSupport.inc(); if (service.shouldCachePath(pathAndQuery.path(), pathAndQuery.query(), mapped.mapping())) { reqCtx.log().addListener(log -> { final HttpStatus status = log.responseHeaders().status();
final Map<String, Collection<HttpHeaders>> docServiceHeaders = new HashMap<>(); thriftServiceRegistrationBeans.ifPresent(beans -> beans.forEach(bean -> { Service<HttpRequest, HttpResponse> service = bean.getService().decorate(bean.getDecorator()); if (metricsEnabled) { service = service.decorate(MetricCollectingService.newDecorator( meterIdPrefixFuncFactory.get(METER_TYPE, bean.getServiceName()))); bean.getService().as(THttpService.class).ifPresent( beanService -> beanService.entries().forEach((serviceName, entry) -> { for (Class<?> iface : entry.interfaces()) { Service<HttpRequest, HttpResponse> service = bean.getService().decorate(bean.getDecorator()); if (metricsEnabled) { service = service.decorate(MetricCollectingService.newDecorator( meterIdPrefixFuncFactory.get(METER_TYPE, bean.getServiceName())));
/** * Invokes {@link Service#serviceAdded(ServiceConfig)}. */ public static void invokeServiceAdded(ServiceConfig cfg, Service<?, ?> service) { requireNonNull(cfg, "cfg"); requireNonNull(service, "service"); try { service.serviceAdded(cfg); } catch (Exception e) { throw new IllegalStateException( "failed to invoke serviceAdded() on: " + service, e); } }
final Map<String, Collection<HttpHeaders>> docServiceHeaders = new HashMap<>(); thriftServiceRegistrationBeans.ifPresent(beans -> beans.forEach(bean -> { Service<HttpRequest, HttpResponse> service = bean.getService().decorate(bean.getDecorator()); if (metricsEnabled) { service = service.decorate(MetricCollectingService.newDecorator( meterIdPrefixFuncFactory.get(METER_TYPE, bean.getServiceName()))); bean.getService().as(THttpService.class).ifPresent( beanService -> beanService.entries().forEach((serviceName, entry) -> { for (Class<?> iface : entry.interfaces()) { Service<HttpRequest, HttpResponse> service = bean.getService().decorate(bean.getDecorator()); if (metricsEnabled) { service = service.decorate(MetricCollectingService.newDecorator( meterIdPrefixFuncFactory.get(METER_TYPE, bean.getServiceName())));
@Override public void serviceAdded(ServiceConfig cfg) throws Exception { first.serviceAdded(cfg); second.serviceAdded(cfg); }
/** * Invoked when {@code req} is not throttled. By default, this method delegates the specified {@code req} to * the {@link #delegate()} of this service. */ protected O onSuccess(ServiceRequestContext ctx, I req) throws Exception { return delegate().serve(ctx, req); }
private static ThriftCallService findThriftService(Service<?, ?> delegate) { return delegate.as(ThriftCallService.class).orElseThrow( () -> new IllegalStateException("service being decorated is not a ThriftCallService: " + delegate)); }
private static Service<HttpRequest, HttpResponse> setupMetricCollectingService( Service<HttpRequest, HttpResponse> service, AbstractServiceRegistrationBean<?, ?> bean, @Nullable MeterIdPrefixFunctionFactory meterIdPrefixFunctionFactory) { requireNonNull(service, "service"); requireNonNull(bean, "bean"); if (meterIdPrefixFunctionFactory == null) { return service; } return service.decorate(metricCollectingServiceDecorator(bean, meterIdPrefixFunctionFactory)); }
@Override public O serve(ServiceRequestContext ctx, I req) throws Exception { RequestMetricSupport.setup(ctx, meterIdPrefixFunction); return delegate().serve(ctx, req); } }
/** * Returns a newly-created decorator that decorates a {@link Service} with a new {@link CorsService} * based on the properties of this builder. */ public Function<Service<HttpRequest, HttpResponse>, ? extends Service<HttpRequest, HttpResponse>> newDecorator() { return s -> { if (s.as(CorsService.class).isPresent()) { return s; } return build(s); }; }
private static Service<HttpRequest, HttpResponse> setupMetricCollectingService( Service<HttpRequest, HttpResponse> service, AbstractServiceRegistrationBean<?, ?> bean, @Nullable MeterIdPrefixFunctionFactory meterIdPrefixFunctionFactory) { requireNonNull(service, "service"); requireNonNull(bean, "bean"); if (meterIdPrefixFunctionFactory == null) { return service; } return service.decorate(metricCollectingServiceDecorator(bean, meterIdPrefixFunctionFactory)); }
@Override public HttpResponse serve(ServiceRequestContext ctx, HttpRequest req) throws Exception { final HttpEncodingType encodingType = HttpEncoders.getWrapperForRequest(req); final HttpResponse delegateResponse = delegate().serve(ctx, req); if (encodingType == null || !encodableRequestHeadersPredicate.test(req.headers())) { return delegateResponse; } return new HttpEncodedResponse( delegateResponse, encodingType, encodableContentTypePredicate, minBytesToForceChunkedAndEncoding); }
private static boolean isSupported( ServiceConfig serviceCfg, Set<Class<? extends Service<?, ?>>> supportedServiceTypes) { return supportedServiceTypes.stream().anyMatch(type -> serviceCfg.service().as(type).isPresent()); }
/** * Adds HTTP services to the specified {@link ServerBuilder}. */ public static void configureHttpServices( ServerBuilder server, List<HttpServiceRegistrationBean> beans, @Nullable MeterIdPrefixFunctionFactory meterIdPrefixFunctionFactory) { requireNonNull(server, "server"); requireNonNull(beans, "beans"); beans.forEach(bean -> { Service<HttpRequest, HttpResponse> service = bean.getService(); for (Function<Service<HttpRequest, HttpResponse>, ? extends Service<HttpRequest, HttpResponse>> decorator : bean.getDecorators()) { service = service.decorate(decorator); } service = setupMetricCollectingService(service, bean, meterIdPrefixFunctionFactory); server.service(bean.getPathMapping(), service); }); }
@Override public HttpResponse serve(ServiceRequestContext ctx, HttpRequest req) throws Exception { try { final HttpResponse response = delegate().serve(ctx, req); if (response instanceof ExceptionFilteredHttpResponse) { return response; } return new ExceptionFilteredHttpResponse(ctx, req, response, exceptionHandler); } catch (Exception cause) { return exceptionHandler.handleException(ctx, req, cause); } } }
/** * Retrieves thrift service names of {@code service} using reflection. */ static Set<String> serviceNames(Service<HttpRequest, HttpResponse> service) { if (thriftServiceClass == null || entriesMethod == null || interfacesMethod == null) { return ImmutableSet.of(); } return service.as(thriftServiceClass) .map(s -> { @SuppressWarnings("unchecked") final Map<String, ?> entries = (Map<String, ?>) invokeMethod(entriesMethod, s); assert entries != null; return toServiceName(entries.values()); }) .orElse(ImmutableSet.of()); }
/** * Adds HTTP services to the specified {@link ServerBuilder}. */ public static void configureHttpServices( ServerBuilder server, List<HttpServiceRegistrationBean> beans, @Nullable MeterIdPrefixFunctionFactory meterIdPrefixFunctionFactory) { requireNonNull(server, "server"); requireNonNull(beans, "beans"); beans.forEach(bean -> { Service<HttpRequest, HttpResponse> service = bean.getService(); for (Function<Service<HttpRequest, HttpResponse>, ? extends Service<HttpRequest, HttpResponse>> decorator : bean.getDecorators()) { service = service.decorate(decorator); } service = setupMetricCollectingService(service, bean, meterIdPrefixFunctionFactory); server.service(bean.getPathMapping(), service); }); }