@Override public void handle(RoutingContext context) { TracingHandler tracingHandler = context.get(TracingHandler.class.getName()); if (tracingHandler != null) { // then we already have a span if (!context.failed()) { // re-routed, so re-attach the end handler context.addHeadersEndHandler(tracingHandler); } context.next(); return; } Span span = serverHandler.handleReceive(extractor, context.request()); TracingHandler handler = new TracingHandler(context, span); context.put(TracingHandler.class.getName(), handler); context.addHeadersEndHandler(handler); try (Tracer.SpanInScope ws = tracer.withSpanInScope(span)) { context.next(); } }
routingContext.addHeadersEndHandler(done -> conn.close(v -> { }));
@Override public int addHeadersEndHandler(Handler<Void> handler) { return inner.addHeadersEndHandler(handler); }
@Override public int addHeadersEndHandler(Handler<Void> handler) { return decoratedContext.addHeadersEndHandler(handler); }
@Override public void handle(RoutingContext ctx) { long start = System.nanoTime(); ctx.addHeadersEndHandler(v -> { long duration = MILLISECONDS.convert(System.nanoTime() - start, NANOSECONDS); ctx.response().putHeader(HEADER_NAME, duration + "ms"); }); ctx.next(); } }
@Override public void handle(RoutingContext rc) { rc.addHeadersEndHandler(v -> { if (rc.get(disableFlag) != null) { return; } String acceptableContentType = rc.getAcceptableContentType(); if (acceptableContentType == null) { return; } MultiMap headers = rc.response().headers(); if (headers.contains(CONTENT_TYPE)) { return; } if (!"0".equals(headers.get(CONTENT_LENGTH))) { headers.add(CONTENT_TYPE, acceptableContentType); } }); rc.next(); } }
@Test public void testHeadersEndHandlerCalledBackwards() throws Exception { final AtomicInteger cnt = new AtomicInteger(0); router.route().handler(rc -> { final int val = cnt.incrementAndGet(); rc.addHeadersEndHandler(v -> assertEquals(val, cnt.getAndDecrement())); rc.next(); }); router.route().handler(rc -> { final int val = cnt.incrementAndGet(); rc.addHeadersEndHandler(v -> assertEquals(val, cnt.getAndDecrement())); rc.next(); }); router.route().handler(rc -> { final int val = cnt.incrementAndGet(); rc.addHeadersEndHandler(v -> assertEquals(val, cnt.getAndDecrement())); rc.response().end(); }); testRequest(HttpMethod.GET, "/", 200, "OK"); }
/** * Add a handler that will be called just before headers are written to the response. This gives you a hook where * you can write any extra headers before the response has been written when it will be too late. * @param handler the handler * @return the id of the handler. This can be used if you later want to remove the handler. */ public int addHeadersEndHandler(Handler<Void> handler) { int ret = delegate.addHeadersEndHandler(handler); return ret; }
@Override public int addHeadersEndHandler(Handler<Void> handler) { return inner.addHeadersEndHandler(handler); }
@Override public int addHeadersEndHandler(Handler<Void> handler) { return decoratedContext.addHeadersEndHandler(handler); }
@Override public int addHeadersEndHandler(Handler<Void> handler) { return delegate.addHeadersEndHandler(handler); }
@Override public int addHeadersEndHandler(Handler<Void> handler) { return rc.addHeadersEndHandler(handler); }
/** * Add a handler that will be called just before headers are written to the response. This gives you a hook where * you can write any extra headers before the response has been written when it will be too late. * @param handler the handler * @return the id of the handler. This can be used if you later want to remove the handler. */ public int addHeadersEndHandler(Handler<Void> handler) { int ret = delegate.addHeadersEndHandler(handler); return ret; }
@Override public int addHeadersEndHandler(Handler<Void> handler) { return this.inner.addHeadersEndHandler(handler); }
private void addStoreSessionHandler(RoutingContext context) { context.addHeadersEndHandler(v -> { Session session = context.session(); if (!session.isDestroyed()) {
} else { routingContext.addHeadersEndHandler(v -> {
@Override public void handle(RoutingContext context) { String cookieHeader = context.request().headers().get(COOKIE); if (cookieHeader != null) { Set<io.netty.handler.codec.http.cookie.Cookie> nettyCookies = ServerCookieDecoder.STRICT.decode(cookieHeader); for (io.netty.handler.codec.http.cookie.Cookie cookie : nettyCookies) { Cookie ourCookie = new CookieImpl(cookie); context.addCookie(ourCookie); } } context.addHeadersEndHandler(v -> { // save the cookies Set<Cookie> cookies = context.cookies(); for (Cookie cookie: cookies) { if (cookie.isChanged()) { context.response().headers().add(SET_COOKIE, cookie.encode()); } } }); context.next(); }
@Test public void testHeadersEndHandler() throws Exception { router.route().handler(rc -> { rc.addHeadersEndHandler(v -> rc.response().putHeader("header1", "foo")); rc.next(); }); router.route().handler(rc -> { rc.addHeadersEndHandler(v -> rc.response().putHeader("header2", "foo")); rc.next(); }); router.route().handler(rc -> { rc.addHeadersEndHandler(v -> rc.response().putHeader("header3", "foo")); rc.response().end(); }); testRequest(HttpMethod.GET, "/", null, resp -> { MultiMap headers = resp.headers(); assertTrue(headers.contains("header1")); assertTrue(headers.contains("header2")); assertTrue(headers.contains("header3")); }, 200, "OK", null); }
@Test public void testHeadersEndHandlerRemoveHandler() throws Exception { router.route().handler(rc -> { rc.addHeadersEndHandler(v -> rc.response().putHeader("header1", "foo")); rc.next(); }); router.route().handler(rc -> { Handler<Void> handler = v -> rc.response().putHeader("header2", "foo"); int handlerID = rc.addHeadersEndHandler(handler); vertx.setTimer(1, tid -> { assertTrue(rc.removeHeadersEndHandler(handlerID)); assertFalse(rc.removeHeadersEndHandler(handlerID + 1)); rc.response().end(); }); }); testRequest(HttpMethod.GET, "/", null, resp -> { MultiMap headers = resp.headers(); assertTrue(headers.contains("header1")); }, 200, "OK", null); }
@Override public void handle(RoutingContext ctx) { long start = System.nanoTime(); ctx.addHeadersEndHandler(v -> { long duration = MILLISECONDS.convert(System.nanoTime() - start, NANOSECONDS); ctx.response().putHeader(HEADER_NAME, duration + "ms"); }); ctx.next(); } }