Example usage for io.vertx.core.http HttpClientResponse resume

List of usage examples for io.vertx.core.http HttpClientResponse resume

Introduction

In this page you can find the example usage for io.vertx.core.http HttpClientResponse resume.

Prototype

@Override
    HttpClientResponse resume();

Source Link

Usage

From source file:org.sfs.nodes.RemoteNode.java

License:Apache License

@Override
public Observable<NodeWriteStreamBlob> createWriteStream(final String volumeId, final long length,
        final MessageDigestFactory... messageDigestFactories) {
    final XNode _this = this;

    return Defer.aVoid().flatMap(aVoid -> nodes.connectFirstAvailable(vertx, hostAndPorts, hostAndPort -> {
        Escaper escaper = urlFragmentEscaper();

        StringBuilder urlBuilder = new StringBuilder("http://").append(hostAndPort.toString());
        urlBuilder = urlBuilder.append("/_internal_node_data/blob?");
        urlBuilder = urlBuilder.append(KEEP_ALIVE_TIMEOUT);
        urlBuilder = urlBuilder.append('=');
        urlBuilder = urlBuilder.append(responseTimeout / 2);
        urlBuilder = urlBuilder.append('&');
        urlBuilder = urlBuilder.append(VOLUME);
        urlBuilder = urlBuilder.append('=');
        urlBuilder = urlBuilder.append(escaper.escape(volumeId));

        if (messageDigestFactories.length > 0) {
            for (MessageDigestFactory instance : messageDigestFactories) {
                urlBuilder = urlBuilder.append('&');
                urlBuilder = urlBuilder/* w w  w .  j  a va 2  s .c  om*/
                        .append(escaper
                                .escape(format("%s%s", X_CONTENT_COMPUTED_DIGEST_PREFIX, instance.getValue())))
                        .append('=').append("true");
            }
        }

        final String url = urlBuilder.toString();

        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("createWriteStream " + url);
        }

        ObservableFuture<HttpClientResponse> handler = RxHelper.observableFuture();

        HttpClientRequest httpClientRequest = httpClient.putAbs(url, httpClientResponse -> {
            httpClientResponse.pause();
            handler.complete(httpClientResponse);
        }).exceptionHandler(handler::fail).putHeader(X_SFS_REMOTE_NODE_TOKEN, remoteNodeSecret)
                .putHeader(CONTENT_LENGTH, valueOf(length)).setTimeout(responseTimeout);
        httpClientRequest.sendHead();

        return handler.map(
                httpClientResponse -> new HttpClientRequestAndResponse(httpClientRequest, httpClientResponse));
    })).map(httpClientRequestAndResponse -> {

        HttpClientRequest httpClientRequest = httpClientRequestAndResponse.getRequest();
        HttpClientResponse httpClientResponse = httpClientRequestAndResponse.getResponse();

        if (HTTP_OK != httpClientResponse.statusCode()) {
            httpClientResponse.resume();
            throw new HttpClientResponseException(httpClientResponse, Buffer.buffer());
        }
        Observable<DigestBlob> oResponse = Defer.just(httpClientResponse)
                .flatMap(new HttpClientKeepAliveResponseBodyBuffer()).map(new BufferToJsonObject())
                .map(jsonObject -> {
                    Integer code = jsonObject.getInteger("code");
                    if (code == null || HTTP_OK != code) {
                        throw new HttpClientResponseException(httpClientResponse, jsonObject);
                    }
                    return jsonObject;
                }).map(jsonObject -> {
                    JsonObject blob = jsonObject.getJsonObject("blob");
                    return new DigestBlob(blob);
                });

        NodeWriteStreamBlob writeStreamBlob = new NodeWriteStreamBlob(_this) {
            @Override
            public Observable<DigestBlob> consume(ReadStream<Buffer> src) {

                return combineSinglesDelayError(
                        pump(src, new HttpClientRequestEndableWriteStream(httpClientRequest)), oResponse,
                        (aVoid1, digestBlob) -> digestBlob);

            }
        };
        return writeStreamBlob;
    });
}