package test.http.router.handler; import com.firefly.$; import com.firefly.client.http2.SimpleHTTPClient; import com.firefly.client.http2.SimpleHTTPClientConfiguration; import com.firefly.codec.http2.model.HttpFields; import com.firefly.codec.http2.model.HttpHeader; import com.firefly.codec.http2.model.HttpStatus; import com.firefly.codec.http2.stream.HTTPOutputStream; import com.firefly.server.http2.HTTP2ServerBuilder; import com.firefly.utils.io.BufferUtils; import org.junit.Assert; import org.junit.Test; import java.io.IOException; import java.util.concurrent.Phaser; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; /** * @author Pengtao Qiu */ public class TestHTTPTrailer extends AbstractHTTPHandlerTest { @Test public void test() { Phaser phaser = new Phaser(3); HTTP2ServerBuilder httpServer = $.httpServer(); startHttpServer(httpServer); SimpleHTTPClient httpClient = $.createHTTPClient(); testServerResponseTrailer(phaser, httpClient); testClientPostTrailer(phaser, httpClient); phaser.arriveAndAwaitAdvance(); httpServer.stop(); httpClient.stop(); } @Test public void testHttp2() { Phaser phaser = new Phaser(2); HTTP2ServerBuilder httpsServer = $.httpsServer(); startHttpServer(httpsServer); SimpleHTTPClientConfiguration configuration = new SimpleHTTPClientConfiguration(); configuration.setSecureConnectionEnabled(true); SimpleHTTPClient httpsClient = new SimpleHTTPClient(configuration); testServerResponseTrailer(phaser, httpsClient); // testClientPostTrailer(phaser, httpsClient); phaser.arriveAndAwaitAdvance(); httpsServer.stop(); httpsClient.stop(); } private void testServerResponseTrailer(Phaser phaser, SimpleHTTPClient httpClient) { httpClient.get(uri + "/trailer").submit() .thenAccept(res -> { Assert.assertThat(res.getStatus(), is(HttpStatus.OK_200)); Assert.assertThat(res.getFields().get(HttpHeader.CONTENT_TYPE), is("text/plain")); System.out.println(res.getFields()); Assert.assertThat(res.getStringBody().length(), greaterThan(0)); System.out.println(res.getStringBody()); Assert.assertThat(res.getTrailerSupplier(), notNullValue()); HttpFields trailer = res.getTrailerSupplier().get(); Assert.assertThat(trailer.size(), greaterThan(0)); Assert.assertThat(trailer.get("Foo"), is("s1")); Assert.assertThat(trailer.get("Bar"), is("s2")); System.out.println(trailer); phaser.arrive(); }); } private void testClientPostTrailer(Phaser phaser, SimpleHTTPClient httpClient) { httpClient.post(uri + "/postTrailer").setTrailerSupplier(() -> { HttpFields trailer = new HttpFields(); trailer.add("ok", "my trailer"); return trailer; }).output(out -> { try (HTTPOutputStream output = out) { output.write(BufferUtils.toBuffer("hello")); } catch (IOException e) { e.printStackTrace(); } }).submit().thenAccept(res -> { Assert.assertThat(res.getStatus(), is(HttpStatus.OK_200)); Assert.assertThat(res.getStringBody().length(), greaterThan(0)); System.out.println(res.getStringBody()); Assert.assertThat(res.getStringBody(), is("trailer : my trailer")); phaser.arrive(); }); } private void startHttpServer(HTTP2ServerBuilder httpServer) { httpServer.router().get("/trailer").handler(ctx -> { System.out.println("get request"); ctx.put(HttpHeader.CONTENT_TYPE, "text/plain"); ctx.getResponse().setTrailerSupplier(() -> { HttpFields trailer = new HttpFields(); trailer.add("Foo", "s1"); trailer.add("Bar", "s2"); return trailer; }); ctx.end("trailer test"); }).router().post("/postTrailer").handler(ctx -> { System.out.println("post trailer"); HttpFields trailer = ctx.getRequest().getTrailerSupplier().get(); ctx.end("trailer : " + trailer.get("ok")); }).listen(host, port); } }