package test.http.router.handler.body;
import com.firefly.$;
import com.firefly.codec.http2.encode.UrlEncoded;
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.concurrent.Promise;
import org.junit.Assert;
import org.junit.Test;
import test.http.router.handler.AbstractHTTPHandlerTest;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.concurrent.Phaser;
import static org.hamcrest.Matchers.is;
/**
* @author Pengtao Qiu
*/
public class TestHTTPBodyHandler extends AbstractHTTPHandlerTest {
@Test
public void testPostData() {
StringBuilder bigData = new StringBuilder();
int dataSize = 1024 * 1024;
for (int i = 0; i < dataSize; i++) {
bigData.append(i);
}
byte[] data = $.string.getBytes(bigData.toString());
System.out.println("data len: " + data.length);
Phaser phaser = new Phaser(5);
HTTP2ServerBuilder httpServer = $.httpServer();
httpServer.router().post("/data").handler(ctx -> {
// small data test case
System.out.println(ctx.getStringBody());
Assert.assertThat(ctx.getStringBody(), is("test post data"));
ctx.end("server received data");
phaser.arrive();
}).router().post("/bigData").handler(ctx -> {
// big data test case
System.out.println("receive big data size: " + ctx.getContentLength());
Assert.assertThat((int) ctx.getContentLength(), is(data.length));
Assert.assertThat($.io.toString(ctx.getInputStream()), is(bigData.toString()));
$.io.close(ctx.getInputStream());
ctx.end("server received big data");
phaser.arrive();
}).listen(host, port);
$.httpClient().post(uri + "/data").body("test post data").submit()
.thenAccept(res -> {
System.out.println(res.getStringBody());
Assert.assertThat(res.getStatus(), is(HttpStatus.OK_200));
Assert.assertThat(res.getStringBody(), is("server received data"));
phaser.arrive();
});
// post big data with content length
$.httpClient().post(uri + "/bigData").put(HttpHeader.CONTENT_LENGTH, data.length + "")
.write(ByteBuffer.wrap(data))
.submit()
.thenAccept(res -> {
Assert.assertThat(res.getStatus(), is(HttpStatus.OK_200));
Assert.assertThat(res.getStringBody(), is("server received big data"));
phaser.arrive();
});
phaser.arriveAndAwaitAdvance();
httpServer.stop();
$.httpClient().stop();
}
@Test
public void testPostBigDataUsingChunkedEncoding() {
StringBuilder bigData = new StringBuilder();
int dataSize = 1024 * 1024;
for (int i = 0; i < dataSize; i++) {
bigData.append(i);
}
byte[] data = $.string.getBytes(bigData.toString());
System.out.println("data len: " + data.length);
Phaser phaser = new Phaser(3);
HTTP2ServerBuilder httpServer = $.httpServer();
httpServer.router().post("/bigData").handler(ctx -> {
// big data test case
System.out.println("receive big data size: " + ctx.getContentLength());
Assert.assertThat($.io.toString(ctx.getInputStream()), is(bigData.toString()));
$.io.close(ctx.getInputStream());
ctx.end("server received big data");
phaser.arrive();
}).listen(host, port);
// post big data using chunked encoding
List<ByteBuffer> buffers = $.buffer.split(ByteBuffer.wrap(data), 4 * 1024);
Promise.Completable<HTTPOutputStream> promise = new Promise.Completable<>();
promise.thenAccept(output -> {
try (HTTPOutputStream out = output) {
for (ByteBuffer buf : buffers) {
out.write(buf);
}
} catch (IOException e) {
e.printStackTrace();
}
});
$.httpClient().post(uri + "/bigData").output(promise)
.submit()
.thenAccept(res -> {
Assert.assertThat(res.getStatus(), is(HttpStatus.OK_200));
Assert.assertThat(res.getStringBody(), is("server received big data"));
phaser.arrive();
});
phaser.arriveAndAwaitAdvance();
httpServer.stop();
$.httpClient().stop();
}
@Test
public void testPostForm() {
Phaser phaser = new Phaser(3);
HTTP2ServerBuilder httpServer = $.httpServer();
httpServer.router().post("/content/form").handler(ctx -> {
Assert.assertThat(ctx.getParameter("name"), is("你的名字"));
Assert.assertThat(ctx.getParameter("intro"), is("我要送些东西给你 我的孩子 因为我们同是漂泊在世界的溪流中的"));
ctx.end("server received form data");
phaser.arrive();
}).listen(host, port);
$.httpClient().post(uri + "/content/form")
.putFormParam("name", "你的名字")
.putFormParam("intro", "我要送些东西给你 我的孩子 因为我们同是漂泊在世界的溪流中的")
.submit()
.thenAccept(res -> {
Assert.assertThat(res.getStatus(), is(HttpStatus.OK_200));
Assert.assertThat(res.getStringBody(), is("server received form data"));
phaser.arrive();
});
phaser.arriveAndAwaitAdvance();
httpServer.stop();
$.httpClient().stop();
}
@Test
public void testQueryParam() {
Phaser phaser = new Phaser(3);
HTTP2ServerBuilder httpServer = $.httpServer();
httpServer.router().get("/query").handler(ctx -> {
Assert.assertThat(ctx.getParameter("name"), is("你的名字"));
Assert.assertThat(ctx.getParameter("intro"), is("我要送些东西给你 我的孩子 因为我们同是漂泊在世界的溪流中的"));
ctx.end("server received form data");
phaser.arrive();
}).listen(host, port);
UrlEncoded enc = $.uri.encode();
enc.put("name", "你的名字");
enc.put("intro", "我要送些东西给你 我的孩子 因为我们同是漂泊在世界的溪流中的");
$.httpClient().get(uri + "/query?" + enc.encode(StandardCharsets.UTF_8, true))
.submit()
.thenAccept(res -> {
Assert.assertThat(res.getStatus(), is(HttpStatus.OK_200));
Assert.assertThat(res.getStringBody(), is("server received form data"));
phaser.arrive();
});
phaser.arriveAndAwaitAdvance();
httpServer.stop();
$.httpClient().stop();
}
}