@Override public Flow.Publisher<DataChunk> apply(CharSequence s) { if (s == null || s.length() == 0) { return ReactiveStreamsAdapter.publisherToFlow(Mono.empty()); } DataChunk chunk = DataChunk.create(false, charset.encode(s.toString())); return ReactiveStreamsAdapter.publisherToFlow(Mono.just(chunk)); } }
@Override public Flow.Publisher<DataChunk> apply(byte[] bytes) { if ((bytes == null) || (bytes.length == 0)) { return ReactiveStreamsAdapter.publisherToFlow(Mono.empty()); } byte[] bs; if (copy) { bs = new byte[bytes.length]; System.arraycopy(bytes, 0, bs, 0, bytes.length); } else { bs = bytes; } DataChunk chunk = DataChunk.create(false, ByteBuffer.wrap(bs)); return ReactiveStreamsAdapter.publisherToFlow(Mono.just(chunk)); } }
@SuppressWarnings("unchecked") <T> Flow.Publisher<DataChunk> createPublisherUsingWriter(T content) { if (content == null) { return ReactiveStreamsAdapter.publisherToFlow(Mono.empty()); } synchronized (sendLockSupport) { for (int i = writers.size() - 1; i >= 0; i--) { Writer<T> writer = writers.get(i); if (writer.accept(content)) { Flow.Publisher<DataChunk> result = writer.function.apply(content); if (result == null) { break; } else { return result; } } } } return null; }
/** * Creates a publisher of single {@link String string}. * * @param publishedType a type. If contains charset then it is used, otherwise use {@code UTF-8}. If {@code null} then * {@code text/plain} is used as a default. * @param charSequence A sequence to publish. * @return new publisher. */ static MediaPublisher create(MediaType publishedType, CharSequence charSequence) { ByteBuffer data = Optional.ofNullable(publishedType) .flatMap(MediaType::charset) .map(Charset::forName) .orElse(StandardCharsets.UTF_8) .encode(charSequence.toString()); Flow.Publisher<DataChunk> publisher = ReactiveStreamsAdapter.publisherToFlow(Flux.just(DataChunk.create(data))); return new MediaPublisher() { @Override public MediaType mediaType() { return publishedType; } @Override public void subscribe(Flow.Subscriber<? super DataChunk> subscriber) { publisher.subscribe(subscriber); } }; } }
TestBareRequest(Http.RequestMethod method, Http.Version version, URI path, Map<String, List<String>> headers, Flow.Publisher<DataChunk> publisher) { Objects.requireNonNull(method, "Parameter 'method' is null!"); Objects.requireNonNull(version, "Parameter 'version' is null!"); Objects.requireNonNull(path, "Parameter 'path' is null!"); webServer.start(); this.method = method; this.version = version; this.path = path; this.headers = new ReadOnlyParameters(headers).toMap(); if (publisher == null) { this.publisher = ReactiveStreamsAdapter.publisherToFlow(Flux.empty()); } else { this.publisher = publisher; } }
@Override public CompletionStage<ServerResponse> send(Flow.Publisher<DataChunk> content) { Span writeSpan = createWriteSpan(content); try { Flow.Publisher<DataChunk> publisher = (content == null) ? ReactiveStreamsAdapter.publisherToFlow(Mono.empty()) : content; sendLockSupport.execute(() -> { Flow.Publisher<DataChunk> p = applyFilters(publisher, writeSpan); sendLockSupport.contentSend = true; p.subscribe(bareResponse); }, content == null); return whenSent(); } catch (RuntimeException | Error e) { writeSpan.finish(); throw e; } }
ReactiveStreamsAdapter.publisherToFlow( ReactiveStreamsAdapter.publisherFromFlow(publisher)
@Override public Flow.Publisher<DataChunk> apply(CharSequence s) { if (s == null || s.length() == 0) { return ReactiveStreamsAdapter.publisherToFlow(Mono.empty()); } DataChunk chunk = DataChunk.create(false, charset.encode(s.toString())); return ReactiveStreamsAdapter.publisherToFlow(Mono.just(chunk)); } }
@Override public Flow.Publisher<DataChunk> apply(byte[] bytes) { if ((bytes == null) || (bytes.length == 0)) { return ReactiveStreamsAdapter.publisherToFlow(Mono.empty()); } byte[] bs; if (copy) { bs = new byte[bytes.length]; System.arraycopy(bytes, 0, bs, 0, bytes.length); } else { bs = bytes; } DataChunk chunk = DataChunk.create(false, ByteBuffer.wrap(bs)); return ReactiveStreamsAdapter.publisherToFlow(Mono.just(chunk)); } }
ReactiveStreamsAdapter.publisherToFlow( ReactiveStreamsAdapter.publisherFromFlow(publisher)