List of usage examples for io.vertx.core.streams Pump start
@Fluent Pump start();
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); } }