package io.datakernel.http;
import io.datakernel.async.IgnoreCompletionCallback;
import io.datakernel.async.ResultCallback;
import io.datakernel.async.ResultCallbackFuture;
import io.datakernel.eventloop.Eventloop;
import org.junit.Test;
import java.io.IOException;
import java.net.InetAddress;
import java.util.concurrent.ExecutionException;
import static io.datakernel.bytebuf.ByteBufPool.*;
import static io.datakernel.eventloop.FatalErrorHandlers.rethrowOnAnyError;
import static org.junit.Assert.assertEquals;
public class TestClientMultilineHeaders {
public static final int PORT = 9595;
public static final InetAddress GOOGLE_PUBLIC_DNS = HttpUtils.inetAddress("8.8.8.8");
@Test
public void testMultilineHeaders() throws ExecutionException, InterruptedException, IOException {
Eventloop eventloop = Eventloop.create().withFatalErrorHandler(rethrowOnAnyError());
final AsyncHttpClient httpClient = AsyncHttpClient.create(eventloop);
final ResultCallbackFuture<String> resultObserver = ResultCallbackFuture.create();
AsyncServlet servlet = new AsyncServlet() {
@Override
public void serve(HttpRequest request, ResultCallback<HttpResponse> callback) {
HttpResponse response = HttpResponse.ok200();
response.addHeader(HttpHeaders.ALLOW, "GET,\r\n HEAD");
callback.setResult(response);
}
};
final AsyncHttpServer server = AsyncHttpServer.create(eventloop, servlet).withListenPort(PORT);
server.listen();
httpClient.send(HttpRequest.get("http://127.0.0.1:" + PORT), new ResultCallback<HttpResponse>() {
@Override
public void onResult(HttpResponse result) {
resultObserver.setResult(result.getHeader(HttpHeaders.ALLOW));
httpClient.stop(IgnoreCompletionCallback.create());
server.close(IgnoreCompletionCallback.create());
}
@Override
public void onException(Exception exception) {
resultObserver.setException(exception);
httpClient.stop(IgnoreCompletionCallback.create());
server.close(IgnoreCompletionCallback.create());
}
});
eventloop.run();
assertEquals("GET, HEAD", resultObserver.get());
assertEquals(getPoolItemsString(), getCreatedItems(), getPoolItems());
}
}