/*
 * Copyright 2014 Red Hat, Inc.
 *
 * Red Hat licenses this file to you under the Apache License, version 2.0
 * (the "License"); you may not use this file except in compliance with the
 * License.  You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package io.vertx.reactivex.core.http;

import io.vertx.reactivex.RxHelper;
import io.vertx.reactivex.ObservableHelper;
import io.vertx.reactivex.FlowableHelper;
import io.vertx.reactivex.impl.AsyncResultMaybe;
import io.vertx.reactivex.impl.AsyncResultSingle;
import io.vertx.reactivex.impl.AsyncResultCompletable;
import io.vertx.reactivex.WriteStreamObserver;
import io.vertx.reactivex.WriteStreamSubscriber;
import java.util.Map;
import java.util.Set;
import java.util.List;
import java.util.Iterator;
import java.util.function.Function;
import java.util.stream.Collectors;
import io.vertx.core.Handler;
import io.vertx.core.AsyncResult;
import io.vertx.core.json.JsonObject;
import io.vertx.core.json.JsonArray;
import io.vertx.lang.rx.RxGen;
import io.vertx.lang.rx.TypeArg;
import io.vertx.lang.rx.MappingIterator;

Represents a client-side HTTP response.

Vert.x provides you with one of these via the handler that was provided when creating the HttpClientRequest or that was set on the HttpClientRequest instance.

It implements ReadStream so it can be used with Pipe to pipe data with flow control.

NOTE: This class has been automatically generated from the original non RX-ified interface using Vert.x codegen.
/** * Represents a client-side HTTP response. * <p> * Vert.x provides you with one of these via the handler that was provided when creating the {@link io.vertx.reactivex.core.http.HttpClientRequest} * or that was set on the {@link io.vertx.reactivex.core.http.HttpClientRequest} instance. * <p> * It implements {@link io.vertx.reactivex.core.streams.ReadStream} so it can be used with * {@link io.vertx.reactivex.core.streams.Pipe} to pipe data with flow control. * * <p/> * NOTE: This class has been automatically generated from the {@link io.vertx.core.http.HttpClientResponse original} non RX-ified interface using Vert.x codegen. */
@RxGen(io.vertx.core.http.HttpClientResponse.class) public class HttpClientResponse implements io.vertx.reactivex.core.streams.ReadStream<io.vertx.reactivex.core.buffer.Buffer> { @Override public String toString() { return delegate.toString(); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; HttpClientResponse that = (HttpClientResponse) o; return delegate.equals(that.delegate); } @Override public int hashCode() { return delegate.hashCode(); } public static final TypeArg<HttpClientResponse> __TYPE_ARG = new TypeArg<>( obj -> new HttpClientResponse((io.vertx.core.http.HttpClientResponse) obj), HttpClientResponse::getDelegate ); private final io.vertx.core.http.HttpClientResponse delegate; public HttpClientResponse(io.vertx.core.http.HttpClientResponse delegate) { this.delegate = delegate; } public HttpClientResponse(Object delegate) { this.delegate = (io.vertx.core.http.HttpClientResponse)delegate; } public io.vertx.core.http.HttpClientResponse getDelegate() { return delegate; } private io.reactivex.Observable<io.vertx.reactivex.core.buffer.Buffer> observable; private io.reactivex.Flowable<io.vertx.reactivex.core.buffer.Buffer> flowable; public synchronized io.reactivex.Observable<io.vertx.reactivex.core.buffer.Buffer> toObservable() { if (observable == null) { Function<io.vertx.core.buffer.Buffer, io.vertx.reactivex.core.buffer.Buffer> conv = io.vertx.reactivex.core.buffer.Buffer::newInstance; observable = ObservableHelper.toObservable(delegate, conv); } return observable; } public synchronized io.reactivex.Flowable<io.vertx.reactivex.core.buffer.Buffer> toFlowable() { if (flowable == null) { Function<io.vertx.core.buffer.Buffer, io.vertx.reactivex.core.buffer.Buffer> conv = io.vertx.reactivex.core.buffer.Buffer::newInstance; flowable = FlowableHelper.toFlowable(delegate, conv); } return flowable; } private static final TypeArg<io.vertx.reactivex.core.buffer.Buffer> TYPE_ARG_0 = new TypeArg<io.vertx.reactivex.core.buffer.Buffer>(o1 -> io.vertx.reactivex.core.buffer.Buffer.newInstance((io.vertx.core.buffer.Buffer)o1), o1 -> o1.getDelegate());
Pause this stream and return a to transfer the elements of this stream to a destination .

The stream will be resumed when the pipe will be wired to a WriteStream.
Returns:a pipe
/** * Pause this stream and return a to transfer the elements of this stream to a destination . * <p/> * The stream will be resumed when the pipe will be wired to a <code>WriteStream</code>. * @return a pipe */
public io.vertx.reactivex.core.streams.Pipe<io.vertx.reactivex.core.buffer.Buffer> pipe() { io.vertx.reactivex.core.streams.Pipe<io.vertx.reactivex.core.buffer.Buffer> ret = io.vertx.reactivex.core.streams.Pipe.newInstance((io.vertx.core.streams.Pipe)delegate.pipe(), TYPE_ARG_0); return ret; }
Pipe this ReadStream to the WriteStream.

Elements emitted by this stream will be written to the write stream until this stream ends or fails.

Once this stream has ended or failed, the write stream will be ended and the handler will be called with the result.

Params:
  • dst – the destination write stream
  • handler –
/** * Pipe this <code>ReadStream</code> to the <code>WriteStream</code>. * <p> * Elements emitted by this stream will be written to the write stream until this stream ends or fails. * <p> * Once this stream has ended or failed, the write stream will be ended and the <code>handler</code> will be * called with the result. * @param dst the destination write stream * @param handler */
public void pipeTo(io.vertx.reactivex.core.streams.WriteStream<io.vertx.reactivex.core.buffer.Buffer> dst, Handler<AsyncResult<Void>> handler) { delegate.pipeTo(dst.getDelegate(), handler); }
Pipe this ReadStream to the WriteStream.

Elements emitted by this stream will be written to the write stream until this stream ends or fails.

Once this stream has ended or failed, the write stream will be ended and the handler will be called with the result.

Params:
  • dst – the destination write stream
/** * Pipe this <code>ReadStream</code> to the <code>WriteStream</code>. * <p> * Elements emitted by this stream will be written to the write stream until this stream ends or fails. * <p> * Once this stream has ended or failed, the write stream will be ended and the <code>handler</code> will be * called with the result. * @param dst the destination write stream */
public void pipeTo(io.vertx.reactivex.core.streams.WriteStream<io.vertx.reactivex.core.buffer.Buffer> dst) { pipeTo(dst, ar -> { }); }
Pipe this ReadStream to the WriteStream.

Elements emitted by this stream will be written to the write stream until this stream ends or fails.

Once this stream has ended or failed, the write stream will be ended and the handler will be called with the result.

Params:
  • dst – the destination write stream
Returns:
/** * Pipe this <code>ReadStream</code> to the <code>WriteStream</code>. * <p> * Elements emitted by this stream will be written to the write stream until this stream ends or fails. * <p> * Once this stream has ended or failed, the write stream will be ended and the <code>handler</code> will be * called with the result. * @param dst the destination write stream * @return */
public io.reactivex.Completable rxPipeTo(io.vertx.reactivex.core.streams.WriteStream<io.vertx.reactivex.core.buffer.Buffer> dst) { return AsyncResultCompletable.toCompletable($handler -> { pipeTo(dst, $handler); }); } public io.vertx.reactivex.core.http.HttpClientResponse fetch(long amount) { delegate.fetch(amount); return this; } public io.vertx.reactivex.core.http.HttpClientResponse resume() { delegate.resume(); return this; } public io.vertx.reactivex.core.http.HttpClientResponse exceptionHandler(Handler<java.lang.Throwable> handler) { delegate.exceptionHandler(handler); return this; } public io.vertx.reactivex.core.http.HttpClientResponse handler(Handler<io.vertx.reactivex.core.buffer.Buffer> handler) { delegate.handler(new Handler<io.vertx.core.buffer.Buffer>() { public void handle(io.vertx.core.buffer.Buffer event) { handler.handle(io.vertx.reactivex.core.buffer.Buffer.newInstance((io.vertx.core.buffer.Buffer)event)); } }); return this; } public io.vertx.reactivex.core.http.HttpClientResponse pause() { delegate.pause(); return this; } public io.vertx.reactivex.core.http.HttpClientResponse endHandler(Handler<Void> endHandler) { delegate.endHandler(endHandler); return this; }
Returns:a NetSocket facade to interact with the HTTP client response.
/** * @return a <code>NetSocket</code> facade to interact with the HTTP client response. */
public io.vertx.reactivex.core.net.NetSocket netSocket() { if (cached_0 != null) { return cached_0; } io.vertx.reactivex.core.net.NetSocket ret = io.vertx.reactivex.core.net.NetSocket.newInstance((io.vertx.core.net.NetSocket)delegate.netSocket()); cached_0 = ret; return ret; }
Returns:the version of the response
/** * @return the version of the response */
public io.vertx.core.http.HttpVersion version() { io.vertx.core.http.HttpVersion ret = delegate.version(); return ret; }
Returns:the status code of the response
/** * @return the status code of the response */
public int statusCode() { int ret = delegate.statusCode(); return ret; }
Returns:the status message of the response
/** * @return the status message of the response */
public String statusMessage() { String ret = delegate.statusMessage(); return ret; }
Returns:the headers
/** * @return the headers */
public io.vertx.reactivex.core.MultiMap headers() { if (cached_1 != null) { return cached_1; } io.vertx.reactivex.core.MultiMap ret = io.vertx.reactivex.core.MultiMap.newInstance((io.vertx.core.MultiMap)delegate.headers()); cached_1 = ret; return ret; }
Return the first header value with the specified name
Params:
  • headerName – the header name
Returns:the header value
/** * Return the first header value with the specified name * @param headerName the header name * @return the header value */
public String getHeader(String headerName) { String ret = delegate.getHeader(headerName); return ret; }
Return the first trailer value with the specified name
Params:
  • trailerName – the trailer name
Returns:the trailer value
/** * Return the first trailer value with the specified name * @param trailerName the trailer name * @return the trailer value */
public String getTrailer(String trailerName) { String ret = delegate.getTrailer(trailerName); return ret; }
Returns:the trailers
/** * @return the trailers */
public io.vertx.reactivex.core.MultiMap trailers() { if (cached_2 != null) { return cached_2; } io.vertx.reactivex.core.MultiMap ret = io.vertx.reactivex.core.MultiMap.newInstance((io.vertx.core.MultiMap)delegate.trailers()); cached_2 = ret; return ret; }
Returns:the Set-Cookie headers (including trailers)
/** * @return the Set-Cookie headers (including trailers) */
public List<String> cookies() { if (cached_3 != null) { return cached_3; } List<String> ret = delegate.cookies(); cached_3 = ret; return ret; }
Convenience method for receiving the entire request body in one piece.

This saves you having to manually set a dataHandler and an endHandler and append the chunks of the body until the whole body received. Don't use this if your request body is large - you could potentially run out of RAM.

Params:
  • bodyHandler – This handler will be called after all the body has been received
Returns:
/** * Convenience method for receiving the entire request body in one piece. * <p> * This saves you having to manually set a dataHandler and an endHandler and append the chunks of the body until * the whole body received. Don't use this if your request body is large - you could potentially run out of RAM. * @param bodyHandler This handler will be called after all the body has been received * @return */
public io.vertx.reactivex.core.http.HttpClientResponse bodyHandler(Handler<io.vertx.reactivex.core.buffer.Buffer> bodyHandler) { delegate.bodyHandler(new Handler<io.vertx.core.buffer.Buffer>() { public void handle(io.vertx.core.buffer.Buffer event) { bodyHandler.handle(io.vertx.reactivex.core.buffer.Buffer.newInstance((io.vertx.core.buffer.Buffer)event)); } }); return this; }
Same as body but with an handler called when the operation completes
Params:
  • handler –
Returns:
/** * Same as {@link io.vertx.reactivex.core.http.HttpClientResponse#body} but with an <code>handler</code> called when the operation completes * @param handler * @return */
public io.vertx.reactivex.core.http.HttpClientResponse body(Handler<AsyncResult<io.vertx.reactivex.core.buffer.Buffer>> handler) { delegate.body(new Handler<AsyncResult<io.vertx.core.buffer.Buffer>>() { public void handle(AsyncResult<io.vertx.core.buffer.Buffer> ar) { if (ar.succeeded()) { handler.handle(io.vertx.core.Future.succeededFuture(io.vertx.reactivex.core.buffer.Buffer.newInstance((io.vertx.core.buffer.Buffer)ar.result()))); } else { handler.handle(io.vertx.core.Future.failedFuture(ar.cause())); } } }); return this; }
Same as body but with an handler called when the operation completes
Returns:
/** * Same as {@link io.vertx.reactivex.core.http.HttpClientResponse#body} but with an <code>handler</code> called when the operation completes * @return */
public io.vertx.reactivex.core.http.HttpClientResponse body() { return body(ar -> { }); }
Same as body but with an handler called when the operation completes
Returns:
/** * Same as {@link io.vertx.reactivex.core.http.HttpClientResponse#body} but with an <code>handler</code> called when the operation completes * @return */
public io.reactivex.Single<io.vertx.reactivex.core.buffer.Buffer> rxBody() { return AsyncResultSingle.toSingle($handler -> { body($handler); }); }
Same as end but with an handler called when the operation completes
Params:
  • handler –
/** * Same as {@link io.vertx.reactivex.core.http.HttpClientResponse#end} but with an <code>handler</code> called when the operation completes * @param handler */
public void end(Handler<AsyncResult<Void>> handler) { delegate.end(handler); }
Same as end but with an handler called when the operation completes
/** * Same as {@link io.vertx.reactivex.core.http.HttpClientResponse#end} but with an <code>handler</code> called when the operation completes */
public void end() { end(ar -> { }); }
Same as end but with an handler called when the operation completes
Returns:
/** * Same as {@link io.vertx.reactivex.core.http.HttpClientResponse#end} but with an <code>handler</code> called when the operation completes * @return */
public io.reactivex.Completable rxEnd() { return AsyncResultCompletable.toCompletable($handler -> { end($handler); }); }
Set an custom frame handler. The handler will get notified when the http stream receives an custom HTTP/2 frame. HTTP/2 permits extension of the protocol.
Params:
  • handler –
Returns:a reference to this, so the API can be used fluently
/** * Set an custom frame handler. The handler will get notified when the http stream receives an custom HTTP/2 * frame. HTTP/2 permits extension of the protocol. * @param handler * @return a reference to this, so the API can be used fluently */
public io.vertx.reactivex.core.http.HttpClientResponse customFrameHandler(Handler<io.vertx.reactivex.core.http.HttpFrame> handler) { delegate.customFrameHandler(new Handler<io.vertx.core.http.HttpFrame>() { public void handle(io.vertx.core.http.HttpFrame event) { handler.handle(io.vertx.reactivex.core.http.HttpFrame.newInstance((io.vertx.core.http.HttpFrame)event)); } }); return this; }
Returns:the corresponding request
/** * @return the corresponding request */
public io.vertx.reactivex.core.http.HttpClientRequest request() { if (cached_4 != null) { return cached_4; } io.vertx.reactivex.core.http.HttpClientRequest ret = io.vertx.reactivex.core.http.HttpClientRequest.newInstance((io.vertx.core.http.HttpClientRequest)delegate.request()); cached_4 = ret; return ret; }
Set an handler for stream priority changes.

This is not implemented for HTTP/1.x.
Params:
  • handler – the handler to be called when the stream priority changes
Returns:
/** * Set an handler for stream priority changes. * <p/> * This is not implemented for HTTP/1.x. * @param handler the handler to be called when the stream priority changes * @return */
public io.vertx.reactivex.core.http.HttpClientResponse streamPriorityHandler(Handler<io.vertx.core.http.StreamPriority> handler) { delegate.streamPriorityHandler(handler); return this; }
Return the first header value with the specified name
Params:
  • headerName – the header name
Returns:the header value
/** * Return the first header value with the specified name * @param headerName the header name * @return the header value */
public String getHeader(java.lang.CharSequence headerName) { String ret = delegate.getHeader(headerName); return ret; } private io.vertx.reactivex.core.net.NetSocket cached_0; private io.vertx.reactivex.core.MultiMap cached_1; private io.vertx.reactivex.core.MultiMap cached_2; private List<String> cached_3; private io.vertx.reactivex.core.http.HttpClientRequest cached_4; public static HttpClientResponse newInstance(io.vertx.core.http.HttpClientResponse arg) { return arg != null ? new HttpClientResponse(arg) : null; } }