/*
* Copyright (C) 2015 SoftIndex LLC.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.datakernel.http;
import io.datakernel.bytebuf.ByteBuf;
import io.datakernel.bytebuf.ByteBufPool;
import io.datakernel.bytebuf.ByteBufStrings;
import org.junit.Test;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import static io.datakernel.http.HttpHeaders.of;
import static java.util.Arrays.asList;
import static org.junit.Assert.*;
public class HttpMessageTest {
public void assertHttpResponseEquals(String expected, HttpResponse result) {
ByteBuf buf = result.toByteBuf();
assertEquals(expected, ByteBufStrings.decodeAscii(buf));
buf.recycle();
}
public void assertHttpRequestEquals(String expected, HttpRequest request) {
ByteBuf buf = request.toByteBuf();
assertEquals(expected, ByteBufStrings.decodeAscii(buf));
buf.recycle();
}
@Test
public void testHttpResponse() {
assertHttpResponseEquals("HTTP/1.1 100 OK\r\nContent-Length: 0\r\n\r\n", HttpResponse.ofCode(100));
assertHttpResponseEquals("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", HttpResponse.ofCode(200));
assertHttpResponseEquals("HTTP/1.1 400 Bad Request\r\nContent-Length: 0\r\n\r\n", HttpResponse.ofCode(400));
assertHttpResponseEquals("HTTP/1.1 405 Error\r\nContent-Length: 0\r\n\r\n", HttpResponse.ofCode(405));
assertHttpResponseEquals("HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n\r\n", HttpResponse.ofCode(500));
assertHttpResponseEquals("HTTP/1.1 502 Error\r\nContent-Length: 9\r\n\r\n" +
"Error 502", HttpResponse.ofCode(502).withBody("Error 502".getBytes(StandardCharsets.UTF_8)));
assertHttpResponseEquals("HTTP/1.1 200 OK\r\nSet-Cookie: cookie1=value1\r\nContent-Length: 0\r\n\r\n",
HttpResponse.ofCode(200).withCookies(Collections.singletonList(HttpCookie.of("cookie1", "value1"))));
assertHttpResponseEquals("HTTP/1.1 200 OK\r\nSet-Cookie: cookie1=value1, cookie2=value2\r\nContent-Length: 0\r\n\r\n",
HttpResponse.ofCode(200).withCookies(asList(HttpCookie.of("cookie1", "value1"), HttpCookie.of("cookie2", "value2"))));
assertHttpResponseEquals("HTTP/1.1 200 OK\r\nSet-Cookie: cookie1=value1, cookie2=value2\r\nContent-Length: 0\r\n\r\n",
HttpResponse.ofCode(200).withCookies(asList(HttpCookie.of("cookie1", "value1"), HttpCookie.of("cookie2", "value2"))));
}
@Test
public void testHttpRequest() {
assertHttpRequestEquals("GET /index.html HTTP/1.1\r\nHost: test.com\r\n\r\n",
HttpRequest.get("http://test.com/index.html"));
assertHttpRequestEquals("POST /index.html HTTP/1.1\r\nHost: test.com\r\nContent-Length: 0\r\n\r\n",
HttpRequest.post("http://test.com/index.html"));
assertHttpRequestEquals("CONNECT /index.html HTTP/1.1\r\nHost: test.com\r\nContent-Length: 0\r\n\r\n",
HttpRequest.of(HttpMethod.CONNECT, "http://test.com/index.html"));
assertHttpRequestEquals("GET /index.html HTTP/1.1\r\nHost: test.com\r\nCookie: cookie1=value1\r\n\r\n",
HttpRequest.get("http://test.com/index.html").withCookie(HttpCookie.of("cookie1", "value1")));
assertHttpRequestEquals("GET /index.html HTTP/1.1\r\nHost: test.com\r\nCookie: cookie1=value1; cookie2=value2\r\n\r\n",
HttpRequest.get("http://test.com/index.html").withCookies(asList(HttpCookie.of("cookie1", "value1"), HttpCookie.of("cookie2", "value2"))));
HttpRequest request = HttpRequest.post("http://test.com/index.html");
ByteBuf buf = ByteBufPool.allocate(100);
buf.put("/abc".getBytes(), 0, 4);
request.setBody(buf);
assertHttpRequestEquals("POST /index.html HTTP/1.1\r\nHost: test.com\r\nContent-Length: 4\r\n\r\n/abc", request);
buf.recycle();
}
private static String getHeaderValue(HttpMessage message, HttpHeader header) {
return message.getHeader(header);
}
@Test
public void testMultiHeaders() {
HttpResponse response = HttpResponse.ofCode(200);
HttpHeader header1 = of("header1");
HttpHeader HEADER1 = of("HEADER1");
HttpHeader header2 = of("header2");
assertTrue(response.headers.isEmpty());
assertNull(getHeaderValue(response, header1));
assertNull(getHeaderValue(response, header2));
response.addHeader(header1, "value1");
response.addHeader(header2, "value2");
response.addHeader(HEADER1, "VALUE1");
assertEquals(3, response.headers.size());
assertEquals("value1", response.getHeader(header1));
assertEquals("value1", response.getHeader(HEADER1));
assertEquals("value2", response.getHeader(header2));
assertEquals("value1", response.getHeaders().get(header1));
assertEquals("value1", response.getHeaders().get(HEADER1));
assertEquals("value2", response.getHeaders().get(header2));
assertEquals(asList("value1", "VALUE1"), response.getAllHeaders().get(header1));
assertEquals(asList("value1", "VALUE1"), response.getAllHeaders().get(HEADER1));
assertEquals(asList("value2"), response.getAllHeaders().get(header2));
}
}