package org.jooby;
import java.io.ByteArrayInputStream;
import java.util.Optional;
import org.jooby.test.ServerFeature;
import org.junit.Test;
import com.google.common.base.Charsets;
import com.typesafe.config.ConfigFactory;
import com.typesafe.config.ConfigValueFactory;
public class BufferSizeFeature extends ServerFeature {
int len = 1024;
{
use(ConfigFactory.empty()
.withValue("server.http.ResponseBufferSize", ConfigValueFactory.fromAnyRef(len / 2)));
get("/", req -> {
String value = req.param("data").value();
Optional<Long> len = req.param("len").toOptional(Long.class);
Optional<Boolean> chunked = req.param("chunked").toOptional(Boolean.class);
Result result = Results.ok(value);
if (!req.param("short").toOptional().isPresent()) {
result = Results.ok(new ByteArrayInputStream(value.getBytes(req.charset())));
}
Result rsp = result;
len.ifPresent(l -> rsp.header("Content-Length", l));
chunked.ifPresent(c -> rsp.header("Transfer-Encoding", "chunked"));
return rsp;
});
}
@Test
public void largeResponsesFallbackToTransferEncodingChunked() throws Exception {
String data = rnd(len);
request()
.get("/?data=" + data)
.expect(data)
.header("Transfer-Encoding", "chunked");
}
@Test
public void largeResponsesWithContentLengthMustBeKept() throws Exception {
String data = rnd(len);
int len = len(data);
request()
.get("/?data=" + data + "&len=" + len)
.expect(data)
.header("Content-Length", len);
}
@Test
public void largeResponsesWithTransferEncodingMustBeKept() throws Exception {
String data = rnd(len * 2);
request()
.get("/?data=" + data + "&chunked=true")
.expect(data)
.header("Transfer-Encoding", "chunked");
}
@Test
public void shortResponseShouldGuessContentLength() throws Exception {
request()
.get("/?data=hello&short=yes")
.expect("hello")
.header("Content-Length", "5");
}
@Test
public void shortResponseShouldKeepContentLength() throws Exception {
request()
.get("/?data=hello&len=5")
.expect("hello")
.header("Content-Length", "5");
}
@Test
public void shortResponseShouldPreferContentLengthEvenIfTransferEncodingChunkWasSet()
throws Exception {
request()
.get("/?data=hello&chunked=true&short=yes")
.expect("hello")
.header("Content-Length", "5");
}
public String rnd(final int len) {
StringBuilder buffer = new StringBuilder();
int cursor = 0;
int max = 91 - 65;
for (int i = 0; i < len; i++) {
char ch = (char) (cursor + 65);
buffer.append(ch);
cursor = (cursor + 1) % max;
}
return buffer.toString();
}
private int len(final String data) {
return data.getBytes(Charsets.UTF_8).length;
}
}