Example usage for io.vertx.core.streams Pump start

List of usage examples for io.vertx.core.streams Pump start

Introduction

In this page you can find the example usage for io.vertx.core.streams Pump start.

Prototype

@Fluent
Pump start();

Source Link

Document

Start the Pump.

Usage

From source file:examples.HTTPExamples.java

License:Open Source License

public void example44(HttpClientRequest request, AsyncFile file) {

    request.setChunked(true);/*  ww w  . j a  v  a2  s.  c  o m*/
    Pump pump = Pump.pump(file, request);
    file.endHandler(v -> request.end());
    pump.start();

}

From source file:examples.ReactiveStreamsExamples.java

License:Open Source License

public void example1(HttpServerResponse response, Publisher<Buffer> otherPublisher) {

    ReactiveReadStream<Buffer> rrs = ReactiveReadStream.readStream();

    // Subscribe the read stream to the publisher
    otherPublisher.subscribe(rrs);//from w w w  .j  a  v  a2s . co  m

    // Pump from the read stream to the http response
    Pump pump = Pump.pump(rrs, response);

    pump.start();

}

From source file:examples.ReactiveStreamsExamples.java

License:Open Source License

public void example2(Vertx vertx, HttpServerRequest request, Subscriber<Buffer> otherSubscriber) {

    ReactiveWriteStream<Buffer> rws = ReactiveWriteStream.writeStream(vertx);

    // Subscribe the other subscriber to the write stream
    rws.subscribe(otherSubscriber);/*  w  ww.jav  a  2s  .  c om*/

    // Pump the http request to the write stream
    Pump pump = Pump.pump(request, rws);

    pump.start();
}

From source file:io.nitor.api.backend.msgraph.GraphQueryHandler.java

License:Apache License

@Override
public void handle(RoutingContext ctx) {
    HttpServerRequest sreq = ctx.request();
    String path = sreq.path();/*w  ww .ja v  a2  s . co  m*/
    path = path.substring(routeLength);
    if (!path.startsWith("/")) {
        path = '/' + path;
    }
    path = baseUrl + path + paramsOf(ctx.request().absoluteURI());

    Map<String, String> data = sessionHandler.getSessionData(ctx);
    String refreshToken = data.get(GRAPH_ACCESS_TOKEN_KEY);
    Future<TokenData> tokenFuture = tokenCache.getAccessToken(refreshToken);

    HttpServerResponse sres = ctx.response();
    String finalPath = path;
    tokenFuture.setHandler(tokenResult -> {
        if (tokenResult.failed()) {
            sessionHandler.removeCookie(ctx);
            String err = tokenResult.cause().toString();
            logger.error(err);
            sres.setStatusCode(INTERNAL_SERVER_ERROR.code()).end(err);
            return;
        }
        TokenData token = tokenResult.result();
        if (!refreshToken.equals(token.refreshToken)) {
            Map<String, String> newData = new HashMap<>(data);
            newData.put(GRAPH_ACCESS_TOKEN_KEY, token.refreshToken);
            sessionHandler.setSessionData(ctx, newData);
        }
        String clientRequestId = UUID.randomUUID().toString();
        logger.info("Querying " + sreq.method() + " " + finalPath + " [" + clientRequestId + "]");
        HttpClientRequest creq = httpClient.requestAbs(sreq.method(), finalPath)
                .putHeader(AUTHORIZATION, "Bearer " + token.accessToken).putHeader(ACCEPT, APPLICATION_JSON)
                .putHeader("client-request-id", clientRequestId).setTimeout(SECONDS.toMillis(20))
                .exceptionHandler(err -> {
                    logger.error("Graph query failed [" + clientRequestId + "]", err);
                    if (!sres.ended()) {
                        sres.setStatusCode(INTERNAL_SERVER_ERROR.code()).write("Graph query failed: " + err)
                                .end();
                    }
                });

        for (String header : allowedRequestHeaders) {
            ofNullable(sreq.getHeader(header)).ifPresent(value -> creq.putHeader(header, value));
        }
        if (sres.headers().getAll("transfer-encoding").stream().anyMatch(v -> v.equals("chunked"))) {
            creq.setChunked(true);
        }

        sres.closeHandler(close -> creq.connection().close());
        creq.handler(cres -> mapResponse(cres, sres, clientRequestId));

        if (sreq.isEnded()) {
            creq.end();
        } else {
            sreq.endHandler(v -> {
                try {
                    creq.end();
                } catch (IllegalStateException ex) {
                    // ignore - nothing can be done - the request is already complete/closed - TODO log?
                }
            });
            Pump resPump = Pump.pump(sreq, creq);
            resPump.start();
        }
    });
}

From source file:io.nitor.api.backend.msgraph.GraphQueryHandler.java

License:Apache License

private void mapResponse(HttpClientResponse cres, HttpServerResponse sres, String clientRequestId) {
    cres.exceptionHandler(t -> {/*  w  w  w .  ja v a  2s.co  m*/
        logger.error("Error processing graph request [" + clientRequestId + "]", t);
        if (!sres.ended()) {
            sres.setStatusCode(BAD_GATEWAY.code());
            sres.end();
        }
    });

    // TODO Together with the client-request-id always log the request-id, timestamp and x-ms-ags-diagnostic from the HTTP response headers

    sres.setStatusCode(cres.statusCode());
    sres.setStatusMessage(cres.statusMessage());

    MultiMap headers = sres.headers();
    cres.headers().forEach(entry -> {
        String key = entry.getKey();
        String lKey = key.toLowerCase();
        if ("server".equals(lKey) || "accept-ranges".equals(lKey) || "transfer-encoding".equals(lKey)
                || "date".equals(lKey) || "connection".equals(lKey)) {
            return;
        }
        headers.add(key, entry.getValue());
    });

    if (!headers.contains("content-length")) {
        sres.setChunked(true);
    }

    Pump resPump = Pump.pump(cres, sres);
    cres.endHandler(v -> {
        if (!sres.ended())
            sres.end();
    });
    resPump.start();
}

From source file:io.nitor.api.backend.s3.S3Handler.java

License:Apache License

private void mapResponse(HttpClientResponse cres, HttpServerResponse sres) {
    cres.exceptionHandler(t -> {/*from w ww  .  j a  v  a2s .  c o m*/
        logger.error("Error processing s3 request", t);
        if (!sres.ended()) {
            sres.setStatusCode(502);
            sres.end();
        }
    });

    sres.setStatusCode(cres.statusCode());
    sres.setStatusMessage(cres.statusMessage());
    if (cres.statusCode() != 200 && cres.statusCode() != 206) {
        sres.end();
        return;
    }

    MultiMap headers = sres.headers();
    cres.headers().forEach(entry -> {
        String key = entry.getKey();
        if (key.startsWith("x-amz-")) {
            return;
        }
        String lKey = key.toLowerCase();
        if ("server".equals(lKey) || "accept-ranges".equals(lKey) || "transfer-encoding".equals(lKey)
                || "date".equals(lKey) || "connection".equals(lKey)) {
            return;
        }
        headers.add(key, entry.getValue());
    });
    // TODO handle http 1.0 that requires connection header

    Pump resPump = Pump.pump(cres, sres);
    cres.endHandler(v -> sres.end());
    resPump.start();
}

From source file:org.wisdom.framework.vertx.HttpHandler.java

License:Apache License

/**
 * This method must be called in a Vert.X context. It finalizes the response and send it to the client.
 *
 * @param context                     the HTTP context
 * @param request                     the Vert.x request
 * @param result                      the computed result
 * @param stream                      the stream of the result
 * @param success                     a flag indicating whether or not the request was successfully handled
 * @param handleFlashAndSessionCookie if the flash and session cookie need to be send with the response
 * @param closeConnection             whehter or not the (underlying) TCP connection must be closed
 *//* w w w  . j a va2 s. c  o m*/
private void finalizeWriteReponse(final ContextFromVertx context, final HttpServerRequest request,
        Result result, InputStream stream, boolean success, boolean handleFlashAndSessionCookie,
        boolean closeConnection) {

    Renderable<?> renderable = result.getRenderable();
    if (renderable == null) {
        renderable = NoHttpBody.INSTANCE;
    }
    // Decide whether to close the connection or not.
    boolean keepAlive = HttpUtils.isKeepAlive(request);

    // Build the response object.
    final HttpServerResponse response = request.response();

    // Copy headers from the result
    for (Map.Entry<String, String> header : result.getHeaders().entrySet()) {
        response.putHeader(header.getKey(), header.getValue());
    }

    if (!result.getHeaders().containsKey(HeaderNames.SERVER)) {
        // Add the server metadata
        response.putHeader(HeaderNames.SERVER, SERVER_NAME);
    }

    String fullContentType = result.getFullContentType();
    if (fullContentType == null) {
        if (renderable.mimetype() != null) {
            response.putHeader(HeaderNames.CONTENT_TYPE, renderable.mimetype());
        }
    } else {
        response.putHeader(HeaderNames.CONTENT_TYPE, fullContentType);
    }

    // copy cookies / flash and session
    if (handleFlashAndSessionCookie) {
        context.flash().save(context, result);
        context.session().save(context, result);
    }

    // copy cookies
    for (org.wisdom.api.cookies.Cookie cookie : result.getCookies()) {
        // Encode cookies:
        final String encoded = ServerCookieEncoder.LAX
                .encode(CookieHelper.convertWisdomCookieToNettyCookie(cookie));
        // Here we use the 'add' method to add a new value to the header.
        response.headers().add(HeaderNames.SET_COOKIE, encoded);
    }
    response.setStatusCode(HttpUtils.getStatusFromResult(result, success));
    if (renderable.mustBeChunked()) {
        LOGGER.debug("Building the chunked response for {} {} ({})", request.method(), request.uri(), context);
        if (renderable.length() > 0 && !response.headers().contains(HeaderNames.CONTENT_LENGTH)) {
            response.putHeader(HeaderNames.CONTENT_LENGTH, Long.toString(renderable.length()));
        }

        if (!response.headers().contains(HeaderNames.CONTENT_TYPE)) {
            // No content is not legal, set default to binary.
            response.putHeader(HeaderNames.CONTENT_TYPE, MimeTypes.BINARY);
        }

        // Can't determine the size, so switch to chunked.
        response.setChunked(true);
        response.putHeader(HeaderNames.TRANSFER_ENCODING, "chunked");
        // In addition, we can't keep the connection open.
        response.putHeader(HeaderNames.CONNECTION, "close");

        final AsyncInputStream s = new AsyncInputStream(vertx, accessor.getExecutor(), stream);
        s.setContext(context.vertxContext());
        final Pump pump = Pump.pump(s, response);
        s.endHandler(event -> context.vertxContext().runOnContext(event1 -> {
            LOGGER.debug("Ending chunked response for {}", request.uri());
            response.end();
            response.close();
            cleanup(context);
        }));
        s.exceptionHandler(event -> context.vertxContext().runOnContext(event1 -> {
            LOGGER.error("Cannot read the result stream", event1);
            response.close();
            cleanup(context);
        }));
        context.vertxContext().runOnContext(event -> pump.start());

    } else {
        byte[] cont = new byte[0];
        try {
            cont = IOUtils.toByteArray(stream);
        } catch (IOException e) {
            LOGGER.error("Cannot copy the response to {}", request.uri(), e);
        }

        if (!response.headers().contains(HeaderNames.CONTENT_LENGTH)) {
            // Because of the HEAD implementation, if the length is already set, do not update it.
            // (HEAD would mean no content)
            response.putHeader(HeaderNames.CONTENT_LENGTH, Long.toString(cont.length));
        }

        if (keepAlive) {
            // Add keep alive header as per:
            // - http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Connection
            response.putHeader(HeaderNames.CONNECTION, "keep-alive");
        }
        response.write(Buffer.buffer(cont));
        if (HttpUtils.isKeepAlive(request) && !closeConnection) {
            response.end();
        } else {
            response.end();
            response.close();
        }
        cleanup(context);
    }
}