@Override public <T> Mono<T> bodyToMono(Class<? extends T> elementClass) { return this.request.bodyToMono(elementClass); }
@Override public String pathVariable(String name) { return this.delegate.pathVariable(name); }
@Override public <T> Flux<T> bodyToFlux(Class<? extends T> elementClass) { return this.request.bodyToFlux(elementClass); }
public DefaultServerRequestBuilder(ServerRequest other) { Assert.notNull(other, "ServerRequest must not be null"); this.messageReaders = other.messageReaders(); this.exchange = other.exchange(); this.methodName = other.methodName(); this.uri = other.uri(); headers(headers -> headers.addAll(other.headers().asHttpHeaders())); cookies(cookies -> cookies.addAll(other.cookies())); attributes(attributes -> attributes.putAll(other.attributes())); }
@Bean RouterFunction<ServerResponse> routes(final Flux<ServerSentEvent<Map>> processor, final Consumer<String> distributeEvent) { final ParameterizedTypeReference<Map<String, String>> type = new ParameterizedTypeReference<Map<String, String>>() {}; return route(GET("/**"), request -> ok().contentType(request.headers().accept().contains(TEXT_EVENT_STREAM) ? TEXT_EVENT_STREAM : APPLICATION_STREAM_JSON) .body(processor.map(s -> s), ServerSentEvent.class)) .andRoute(POST("/**"), request -> accepted().body(request.bodyToMono(type) .map(map -> map.getOrDefault("message", "")) .map(String::valueOf) .map(String::trim) .filter(s -> s.length() > 0) .doOnNext(distributeEvent) .map(m -> format("message '%s' accepted.", m)) .map(message -> singletonMap("response", message)) .subscribeOn(Schedulers.elastic()) .flatMap(Mono::just), Map.class)) ; }
public Mono<ServerResponse> run(ServerRequest request) { List<String> appIdHeaders = request.headers().header(X_KGRAPH_APPID); String appId = request.pathVariable("id"); return request.bodyToMono(GraphAlgorithmRunRequest.class) .flatMapMany(input -> { log.debug("num iterations: {}", input.getNumIterations()); PregelGraphAlgorithm<Long, ?, ?, ?> algorithm = algorithms.get(appId); GraphAlgorithmState state = algorithm.run(input.getNumIterations()); GraphAlgorithmStatus status = new GraphAlgorithmStatus(state); Flux<GraphAlgorithmStatus> states = proxyRun(appIdHeaders.isEmpty() ? group.getCurrentMembers().keySet() : Collections.emptySet(), appId, input); return Mono.just(status).mergeWith(states); }) .reduce((state1, state2) -> state1) .flatMap(state -> ServerResponse.ok() .contentType(MediaType.APPLICATION_JSON) .body(Mono.just(state), GraphAlgorithmStatus.class) ); }
public Mono<ServerResponse> delete(ServerRequest request) { List<String> appIdHeaders = request.headers().header(X_KGRAPH_APPID); String appId = request.pathVariable("id"); PregelGraphAlgorithm<Long, ?, ?, ?> algorithm = algorithms.remove(appId); algorithm.close(); return proxyDelete(appIdHeaders.isEmpty() ? group.getCurrentMembers().keySet() : Collections.emptySet(), appId) .then(ServerResponse.noContent().build()); }
@Override public <T> T body(BodyExtractor<T, ? super ServerHttpRequest> extractor) { return this.delegate.body(extractor); }
@Test public void from() { MockServerHttpRequest request = MockServerHttpRequest.post("http://example.com") .header("foo", "bar") .build(); MockServerWebExchange exchange = MockServerWebExchange.from(request); ServerRequest other = ServerRequest.create(exchange, HandlerStrategies.withDefaults().messageReaders()); Flux<DataBuffer> body = Flux.just("baz") .map(s -> s.getBytes(StandardCharsets.UTF_8)) .map(dataBufferFactory::wrap); ServerRequest result = ServerRequest.from(other) .method(HttpMethod.HEAD) .headers(httpHeaders -> httpHeaders.set("foo", "baar")) .cookies(cookies -> cookies.set("baz", ResponseCookie.from("baz", "quux").build())) .body(body) .build(); assertEquals(HttpMethod.HEAD, result.method()); assertEquals(1, result.headers().asHttpHeaders().size()); assertEquals("baar", result.headers().asHttpHeaders().getFirst("foo")); assertEquals(1, result.cookies().size()); assertEquals("quux", result.cookies().getFirst("baz").getValue()); StepVerifier.create(result.bodyToFlux(String.class)) .expectNext("baz") .verifyComplete(); }
"/search/users?q={q}&page={page}&per_page={per_page}", HashMap.of( "q", request.pathVariable("username"), "page", request.queryParam("page").orElse("0"), "per_page", request.queryParam("size").orElse("3") ).toJavaMap()
return ServerRequest.create(exchange.mutate().request(mutatedRequest).build(), messageReaders) .bodyToMono(inClass) .doOnNext(objectValue -> { exchange.getAttributes().put(CACHE_REQUEST_BODY_OBJECT_KEY, objectValue);
@Override public Optional<String> queryParam(String name) { return this.request.queryParam(name); }
@Override public Headers headers() { return this.request.headers(); }
@Override public Optional<Object> attribute(String name) { return this.delegate.attribute(name); }
public Mono<ServerResponse> configure(ServerRequest request) { List<String> appIdHeaders = request.headers().header(X_KGRAPH_APPID); String appId = appIdHeaders.isEmpty() ? generateRandomString(8) : appIdHeaders.iterator().next(); return request.bodyToMono(GraphAlgorithmCreateRequest.class) .doOnNext(input -> { PregelGraphAlgorithm<Long, ?, ?, ?> algorithm = getAlgorithm(appId, input); StreamsBuilder builder = new StreamsBuilder(); Properties streamsConfig = streamsConfig(appId, props.getBootstrapServers(), new KryoSerde<>()); algorithm.configure(builder, streamsConfig); algorithms.put(appId, algorithm); }) .flatMapMany(input -> proxyConfigure(appIdHeaders.isEmpty() ? group.getCurrentMembers().keySet() : Collections.emptySet(), appId, input)) .then(ServerResponse.ok() .contentType(MediaType.APPLICATION_JSON) .body(Mono.just(new GraphAlgorithmId(appId)), GraphAlgorithmId.class)); }
@SuppressWarnings("unchecked") public Mono<ServerResponse> result(ServerRequest request) { List<String> appIdHeaders = request.headers().header(X_KGRAPH_APPID); String appId = request.pathVariable("id"); PregelGraphAlgorithm<Long, ?, ?, ?> algorithm = algorithms.get(appId); Flux<String> body = Flux.fromIterable(algorithm.result()).map(kv -> { log.trace("result: ({}, {})", kv.key, kv.value); return kv.key + " " + kv.value; }); body = proxyResult(appIdHeaders.isEmpty() ? group.getCurrentMembers().keySet() : Collections.emptySet(), appId, body); return ServerResponse.ok() .contentType(MediaType.TEXT_EVENT_STREAM) .body(BodyInserters.fromPublisher(body, String.class)); }
@Override public <T> T body(BodyExtractor<T, ? super ServerHttpRequest> extractor, Map<String, Object> hints) { return this.delegate.body(extractor, hints); }
@Override public Optional<String> queryParam(String name) { return this.delegate.queryParam(name); }
@Override public Headers headers() { return this.delegate.headers(); }
@Override public Throwable getError(ServerRequest request) { return (Throwable) request.attribute(ERROR_ATTRIBUTE) .orElseThrow(() -> new IllegalStateException( "Missing exception attribute in ServerWebExchange")); }