/*
This file is part of libhttpserver
Copyright (C) 2011-2019 Sebastiano Merlino
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
*/
#include "httpserver/http_utils.hpp"
#if defined(_WIN32) && !defined(__CYGWIN__)
#define _WINDOWS
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x600
#include
#include
#else
#include
#endif
#include
#include "littletest.hpp"
using std::string;
using std::vector;
LT_BEGIN_SUITE(http_utils_suite)
void set_up() {
}
void tear_down() {
}
LT_END_SUITE(http_utils_suite)
LT_BEGIN_AUTO_TEST(http_utils_suite, unescape)
int with_plus_buff_len = 6;
char* with_plus = new char[with_plus_buff_len];
snprintf(with_plus, with_plus_buff_len, "%s", "A%20B");
std::string string_with_plus = with_plus;
int expected_size = httpserver::http::http_unescape(&string_with_plus);
int expected_buff_len = 4;
char* expected = new char[expected_buff_len];
snprintf(expected, expected_buff_len, "%s", "A B");
std::cout << "|||||" << string_with_plus << "||||" << std::endl;
std::cout << expected << std::endl;
LT_CHECK_EQ(string_with_plus, string(expected));
LT_CHECK_EQ(expected_size, 3);
delete[] with_plus;
delete[] expected;
LT_END_AUTO_TEST(unescape)
LT_BEGIN_AUTO_TEST(http_utils_suite, unescape_plus)
int with_plus_buff_len = 4;
char* with_plus = new char[with_plus_buff_len];
snprintf(with_plus, with_plus_buff_len, "%s", "A+B");
std::string string_with_plus = with_plus;
int expected_size = httpserver::http::http_unescape(&string_with_plus);
int expected_buff_len = 4;
char* expected = new char[expected_buff_len];
snprintf(expected, expected_buff_len, "%s", "A B");
LT_CHECK_EQ(string_with_plus, string(expected));
LT_CHECK_EQ(expected_size, 3);
delete[] with_plus;
delete[] expected;
LT_END_AUTO_TEST(unescape_plus)
LT_BEGIN_AUTO_TEST(http_utils_suite, unescape_partial_marker)
int size = 6;
char* with_marker = new char[size];
snprintf(with_marker, size, "%s", "A+B%0");
std::string string_with_marker = with_marker;
int expected_size = httpserver::http::http_unescape(&string_with_marker);
char* expected = new char[size];
snprintf(expected, size, "%s", "A B%0");
LT_CHECK_EQ(string_with_marker, string(expected));
LT_CHECK_EQ(expected_size, 5);
delete[] with_marker;
delete[] expected;
LT_END_AUTO_TEST(unescape_partial_marker)
LT_BEGIN_AUTO_TEST(http_utils_suite, tokenize_url)
string value = "test/this/url/here";
string expected_arr[] = { "test", "this", "url", "here" };
vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0]));
vector actual = httpserver::http::http_utils::tokenize_url(value, '/');
LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin());
LT_END_AUTO_TEST(tokenize_url)
LT_BEGIN_AUTO_TEST(http_utils_suite, tokenize_url_multiple_spaces)
string value = "test//this//url//here";
string expected_arr[] = { "test", "this", "url", "here" };
vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0]));
vector actual = httpserver::http::http_utils::tokenize_url(value, '/');
LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin());
LT_END_AUTO_TEST(tokenize_url_multiple_spaces)
LT_BEGIN_AUTO_TEST(http_utils_suite, tokenize_url_end_slash)
string value = "test/this/url/here/";
string expected_arr[] = { "test", "this", "url", "here" };
vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0]));
vector actual = httpserver::http::http_utils::tokenize_url(value, '/');
LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin());
LT_END_AUTO_TEST(tokenize_url_end_slash)
LT_BEGIN_AUTO_TEST(http_utils_suite, standardize_url)
string url = "/", result;
result = httpserver::http::http_utils::standardize_url(url);
LT_CHECK_EQ(result, "/");
url = "/abc/", result = "";
result = httpserver::http::http_utils::standardize_url(url);
LT_CHECK_EQ(result, "/abc");
url = "/abc", result = "";
result = httpserver::http::http_utils::standardize_url(url);
LT_CHECK_EQ(result, "/abc");
url = "/abc/pqr/", result = "";
result = httpserver::http::http_utils::standardize_url(url);
LT_CHECK_EQ(result, "/abc/pqr");
url = "/abc/pqr", result = "";
result = httpserver::http::http_utils::standardize_url(url);
LT_CHECK_EQ(result, "/abc/pqr");
url = "/abc//pqr", result = "";
result = httpserver::http::http_utils::standardize_url(url);
LT_CHECK_EQ(result, "/abc/pqr");
LT_END_AUTO_TEST(standardize_url)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str)
struct sockaddr_in ip4addr;
ip4addr.sin_family = AF_INET;
ip4addr.sin_port = htons(3490);
ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1");
string result = httpserver::http::get_ip_str((struct sockaddr*) &ip4addr);
unsigned short port = httpserver::http::get_port((struct sockaddr*) &ip4addr);
LT_CHECK_EQ(result, "127.0.0.1");
LT_CHECK_EQ(port, htons(3490));
LT_END_AUTO_TEST(ip_to_str)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str6)
struct sockaddr_in6 ip6addr;
ip6addr.sin6_family = AF_INET6;
ip6addr.sin6_port = htons(3490);
inet_pton(AF_INET6, "2001:db8:8714:3a90::12", &(ip6addr.sin6_addr));
string result = httpserver::http::get_ip_str((struct sockaddr *) &ip6addr);
unsigned short port = httpserver::http::get_port((struct sockaddr*) &ip6addr);
LT_CHECK_EQ(result, "2001:db8:8714:3a90::12");
LT_CHECK_EQ(port, htons(3490));
LT_END_AUTO_TEST(ip_to_str6)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str_invalid_family)
struct sockaddr_in ip4addr;
ip4addr.sin_family = 55;
ip4addr.sin_port = htons(3490);
ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1");
LT_CHECK_THROW(httpserver::http::get_ip_str((struct sockaddr*) &ip4addr));
LT_END_AUTO_TEST(ip_to_str_invalid_family)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str_null)
LT_CHECK_THROW(httpserver::http::get_ip_str((struct sockaddr*) 0x0));
LT_END_AUTO_TEST(ip_to_str_null)
LT_BEGIN_AUTO_TEST(http_utils_suite, get_port_invalid_family)
struct sockaddr_in ip4addr;
ip4addr.sin_family = 55;
ip4addr.sin_port = htons(3490);
ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1");
LT_CHECK_THROW(httpserver::http::get_port((struct sockaddr*) &ip4addr));
LT_END_AUTO_TEST(get_port_invalid_family)
LT_BEGIN_AUTO_TEST(http_utils_suite, get_port_null)
LT_CHECK_THROW(httpserver::http::get_port((struct sockaddr*) 0x0));
LT_END_AUTO_TEST(get_port_null)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_str)
httpserver::http::ip_representation test_ip("192.168.5.5");
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV4);
for (int i = 0; i < 12; i++) {
LT_CHECK_EQ(test_ip.pieces[i], 0);
}
LT_CHECK_EQ(test_ip.pieces[12], 192);
LT_CHECK_EQ(test_ip.pieces[13], 168);
LT_CHECK_EQ(test_ip.pieces[14], 5);
LT_CHECK_EQ(test_ip.pieces[15], 5);
LT_CHECK_EQ(test_ip.mask, 0xFFFF);
LT_END_AUTO_TEST(ip_representation4_str)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_str_mask)
httpserver::http::ip_representation test_ip("192.168.*.*");
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV4);
for (int i = 0; i < 12; i++) {
LT_CHECK_EQ(test_ip.pieces[i], 0);
}
LT_CHECK_EQ(test_ip.pieces[12], 192);
LT_CHECK_EQ(test_ip.pieces[13], 168);
LT_CHECK_EQ(test_ip.pieces[14], 0);
LT_CHECK_EQ(test_ip.pieces[15], 0);
LT_CHECK_EQ(test_ip.mask, 0x3FFF);
LT_END_AUTO_TEST(ip_representation4_str_mask)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_str_invalid)
LT_CHECK_THROW(httpserver::http::ip_representation("192.168.5.5.5"));
LT_END_AUTO_TEST(ip_representation4_str_invalid)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_str_beyond255)
LT_CHECK_THROW(httpserver::http::ip_representation("192.168.256.5"));
LT_END_AUTO_TEST(ip_representation4_str_beyond255)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str)
httpserver::http::ip_representation test_ip("2001:db8:8714:3a90::12");
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV6);
LT_CHECK_EQ(test_ip.pieces[0], 32);
LT_CHECK_EQ(test_ip.pieces[1], 1);
LT_CHECK_EQ(test_ip.pieces[2], 13);
LT_CHECK_EQ(test_ip.pieces[3], 184);
LT_CHECK_EQ(test_ip.pieces[4], 135);
LT_CHECK_EQ(test_ip.pieces[5], 20);
LT_CHECK_EQ(test_ip.pieces[6], 58);
LT_CHECK_EQ(test_ip.pieces[7], 144);
LT_CHECK_EQ(test_ip.pieces[8], 0);
LT_CHECK_EQ(test_ip.pieces[9], 0);
LT_CHECK_EQ(test_ip.pieces[10], 0);
LT_CHECK_EQ(test_ip.pieces[11], 0);
LT_CHECK_EQ(test_ip.pieces[12], 0);
LT_CHECK_EQ(test_ip.pieces[13], 0);
LT_CHECK_EQ(test_ip.pieces[14], 0);
LT_CHECK_EQ(test_ip.pieces[15], 18);
LT_CHECK_EQ(test_ip.mask, 0xFFFF);
LT_END_AUTO_TEST(ip_representation6_str)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_mask)
httpserver::http::ip_representation test_ip("2001:db8:8714:3a90:*:*");
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV6);
LT_CHECK_EQ(test_ip.pieces[0], 32);
LT_CHECK_EQ(test_ip.pieces[1], 1);
LT_CHECK_EQ(test_ip.pieces[2], 13);
LT_CHECK_EQ(test_ip.pieces[3], 184);
LT_CHECK_EQ(test_ip.pieces[4], 135);
LT_CHECK_EQ(test_ip.pieces[5], 20);
LT_CHECK_EQ(test_ip.pieces[6], 58);
LT_CHECK_EQ(test_ip.pieces[7], 144);
LT_CHECK_EQ(test_ip.pieces[8], 0);
LT_CHECK_EQ(test_ip.pieces[9], 0);
LT_CHECK_EQ(test_ip.pieces[10], 0);
LT_CHECK_EQ(test_ip.pieces[11], 0);
LT_CHECK_EQ(test_ip.pieces[12], 0);
LT_CHECK_EQ(test_ip.pieces[13], 0);
LT_CHECK_EQ(test_ip.pieces[14], 0);
LT_CHECK_EQ(test_ip.pieces[15], 0);
LT_CHECK_EQ(test_ip.mask, 0xF0FF);
LT_END_AUTO_TEST(ip_representation6_str_mask)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_nested)
httpserver::http::ip_representation test_ip("::ffff:192.0.2.128");
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV6);
LT_CHECK_EQ(test_ip.pieces[0], 0);
LT_CHECK_EQ(test_ip.pieces[1], 0);
LT_CHECK_EQ(test_ip.pieces[2], 0);
LT_CHECK_EQ(test_ip.pieces[3], 0);
LT_CHECK_EQ(test_ip.pieces[4], 0);
LT_CHECK_EQ(test_ip.pieces[5], 0);
LT_CHECK_EQ(test_ip.pieces[6], 0);
LT_CHECK_EQ(test_ip.pieces[7], 0);
LT_CHECK_EQ(test_ip.pieces[8], 0);
LT_CHECK_EQ(test_ip.pieces[9], 0);
LT_CHECK_EQ(test_ip.pieces[10], 255);
LT_CHECK_EQ(test_ip.pieces[11], 255);
LT_CHECK_EQ(test_ip.pieces[12], 192);
LT_CHECK_EQ(test_ip.pieces[13], 0);
LT_CHECK_EQ(test_ip.pieces[14], 2);
LT_CHECK_EQ(test_ip.pieces[15], 128);
LT_CHECK_EQ(test_ip.mask, 0xFFFF);
LT_END_AUTO_TEST(ip_representation6_str_nested)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_nested_deprecated)
LT_CHECK_NOTHROW(httpserver::http::ip_representation("::192.0.2.128"));
httpserver::http::ip_representation test_ip("::192.0.2.128");
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV6);
LT_CHECK_EQ(test_ip.pieces[0], 0);
LT_CHECK_EQ(test_ip.pieces[1], 0);
LT_CHECK_EQ(test_ip.pieces[2], 0);
LT_CHECK_EQ(test_ip.pieces[3], 0);
LT_CHECK_EQ(test_ip.pieces[4], 0);
LT_CHECK_EQ(test_ip.pieces[5], 0);
LT_CHECK_EQ(test_ip.pieces[6], 0);
LT_CHECK_EQ(test_ip.pieces[7], 0);
LT_CHECK_EQ(test_ip.pieces[8], 0);
LT_CHECK_EQ(test_ip.pieces[9], 0);
LT_CHECK_EQ(test_ip.pieces[10], 0);
LT_CHECK_EQ(test_ip.pieces[11], 0);
LT_CHECK_EQ(test_ip.pieces[12], 192);
LT_CHECK_EQ(test_ip.pieces[13], 0);
LT_CHECK_EQ(test_ip.pieces[14], 2);
LT_CHECK_EQ(test_ip.pieces[15], 128);
LT_CHECK_EQ(test_ip.mask, 0xFFFF);
LT_END_AUTO_TEST(ip_representation6_str_nested_deprecated)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_ipv4_mask)
httpserver::http::ip_representation test_ip("::ffff:192.0.*.*");
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV6);
LT_CHECK_EQ(test_ip.pieces[0], 0);
LT_CHECK_EQ(test_ip.pieces[1], 0);
LT_CHECK_EQ(test_ip.pieces[2], 0);
LT_CHECK_EQ(test_ip.pieces[3], 0);
LT_CHECK_EQ(test_ip.pieces[4], 0);
LT_CHECK_EQ(test_ip.pieces[5], 0);
LT_CHECK_EQ(test_ip.pieces[6], 0);
LT_CHECK_EQ(test_ip.pieces[7], 0);
LT_CHECK_EQ(test_ip.pieces[8], 0);
LT_CHECK_EQ(test_ip.pieces[9], 0);
LT_CHECK_EQ(test_ip.pieces[10], 255);
LT_CHECK_EQ(test_ip.pieces[11], 255);
LT_CHECK_EQ(test_ip.pieces[12], 192);
LT_CHECK_EQ(test_ip.pieces[13], 0);
LT_CHECK_EQ(test_ip.pieces[14], 0);
LT_CHECK_EQ(test_ip.pieces[15], 0);
LT_CHECK_EQ(test_ip.mask, 0x3FFF);
LT_END_AUTO_TEST(ip_representation6_str_ipv4_mask)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_clustered_middle)
httpserver::http::ip_representation test_ip("2001:db8::ff00:42:8329");
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV6);
LT_CHECK_EQ(test_ip.pieces[0], 32);
LT_CHECK_EQ(test_ip.pieces[1], 1);
LT_CHECK_EQ(test_ip.pieces[2], 13);
LT_CHECK_EQ(test_ip.pieces[3], 184);
LT_CHECK_EQ(test_ip.pieces[4], 0);
LT_CHECK_EQ(test_ip.pieces[5], 0);
LT_CHECK_EQ(test_ip.pieces[6], 0);
LT_CHECK_EQ(test_ip.pieces[7], 0);
LT_CHECK_EQ(test_ip.pieces[8], 0);
LT_CHECK_EQ(test_ip.pieces[9], 0);
LT_CHECK_EQ(test_ip.pieces[10], 255);
LT_CHECK_EQ(test_ip.pieces[11], 0);
LT_CHECK_EQ(test_ip.pieces[12], 0);
LT_CHECK_EQ(test_ip.pieces[13], 66);
LT_CHECK_EQ(test_ip.pieces[14], 131);
LT_CHECK_EQ(test_ip.pieces[15], 41);
LT_CHECK_EQ(test_ip.mask, 0xFFFF);
LT_END_AUTO_TEST(ip_representation6_str_clustered_middle)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_loopback)
httpserver::http::ip_representation test_ip("::1");
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV6);
LT_CHECK_EQ(test_ip.pieces[0], 0);
LT_CHECK_EQ(test_ip.pieces[1], 0);
LT_CHECK_EQ(test_ip.pieces[2], 0);
LT_CHECK_EQ(test_ip.pieces[3], 0);
LT_CHECK_EQ(test_ip.pieces[4], 0);
LT_CHECK_EQ(test_ip.pieces[5], 0);
LT_CHECK_EQ(test_ip.pieces[6], 0);
LT_CHECK_EQ(test_ip.pieces[7], 0);
LT_CHECK_EQ(test_ip.pieces[8], 0);
LT_CHECK_EQ(test_ip.pieces[9], 0);
LT_CHECK_EQ(test_ip.pieces[10], 0);
LT_CHECK_EQ(test_ip.pieces[11], 0);
LT_CHECK_EQ(test_ip.pieces[12], 0);
LT_CHECK_EQ(test_ip.pieces[13], 0);
LT_CHECK_EQ(test_ip.pieces[14], 0);
LT_CHECK_EQ(test_ip.pieces[15], 1);
LT_CHECK_EQ(test_ip.mask, 0xFFFF);
LT_END_AUTO_TEST(ip_representation6_str_loopback)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation_weight)
LT_CHECK_EQ(httpserver::http::ip_representation("::1").weight(), 16);
LT_CHECK_EQ(httpserver::http::ip_representation("192.168.0.1").weight(), 16);
LT_CHECK_EQ(httpserver::http::ip_representation("192.168.*.*").weight(), 14);
LT_CHECK_EQ(httpserver::http::ip_representation("::ffff:192.0.*.*").weight(), 14);
LT_CHECK_EQ(httpserver::http::ip_representation("2001:db8:8714:3a90:*:*").weight(), 12);
LT_CHECK_EQ(httpserver::http::ip_representation("2001:db8:8714:3a90:8714:2001:db8:3a90").weight(), 16);
LT_CHECK_EQ(httpserver::http::ip_representation("2001:db8:8714:3a90:8714:2001:*:*").weight(), 12);
LT_CHECK_EQ(httpserver::http::ip_representation("*:*:*:*:*:*:*:*").weight(), 0);
LT_END_AUTO_TEST(ip_representation_weight)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid)
LT_CHECK_THROW(httpserver::http::ip_representation("2001:db8:8714:3a90::12:4:4:4"));
LT_END_AUTO_TEST(ip_representation6_str_invalid)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_block_too_long)
LT_CHECK_THROW(httpserver::http::ip_representation("2001:db8:87214:3a90::12:4:4"));
LT_END_AUTO_TEST(ip_representation6_str_block_too_long)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_multiple_clusters)
LT_CHECK_THROW(httpserver::http::ip_representation("2001::3a90::12:4:4"));
LT_END_AUTO_TEST(ip_representation6_str_invalid_multiple_clusters)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_too_long_before_nested)
LT_CHECK_THROW(httpserver::http::ip_representation("2001:db8:8714:3a90:13:12:13:192.0.2.128"));
LT_END_AUTO_TEST(ip_representation6_str_invalid_too_long_before_nested)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_beyond255)
LT_CHECK_THROW(httpserver::http::ip_representation("::ffff:192.0.256.128"));
LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_beyond255)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_more_than_4_parts)
LT_CHECK_THROW(httpserver::http::ip_representation("::ffff:192.0.5.128.128"));
LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_more_than_4_parts)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_not_at_end)
LT_CHECK_THROW(httpserver::http::ip_representation("::ffff:192.0.256.128:ffff"));
LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_not_at_end)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_starting_non_zero)
LT_CHECK_THROW(httpserver::http::ip_representation("0:0:1::ffff:192.0.5.128"));
LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_starting_non_zero)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_starting_wrong_prefix)
LT_CHECK_THROW(httpserver::http::ip_representation("::ffcc:192.0.5.128"));
LT_CHECK_THROW(httpserver::http::ip_representation("::ccff:192.0.5.128"));
LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_starting_wrong_prefix)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_sockaddr)
struct sockaddr_in ip4addr;
ip4addr.sin_family = AF_INET;
ip4addr.sin_port = htons(3490);
ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1");
httpserver::http::ip_representation test_ip(reinterpret_cast(&ip4addr));
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV4);
for (int i = 0; i < 12; i++) {
LT_CHECK_EQ(test_ip.pieces[i], 0);
}
LT_CHECK_EQ(test_ip.pieces[12], 127);
LT_CHECK_EQ(test_ip.pieces[13], 0);
LT_CHECK_EQ(test_ip.pieces[14], 0);
LT_CHECK_EQ(test_ip.pieces[15], 1);
LT_CHECK_EQ(test_ip.mask, 0xFFFF);
LT_END_AUTO_TEST(ip_representation4_sockaddr)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_sockaddr)
struct sockaddr_in6 ip6addr;
ip6addr.sin6_family = AF_INET6;
ip6addr.sin6_port = htons(3490);
inet_pton(AF_INET6, "2001:db8:8714:3a90::12", &(ip6addr.sin6_addr));
httpserver::http::ip_representation test_ip(reinterpret_cast(&ip6addr));
LT_CHECK_EQ(test_ip.ip_version, httpserver::http::http_utils::IPV6);
LT_CHECK_EQ(test_ip.pieces[0], 32);
LT_CHECK_EQ(test_ip.pieces[1], 1);
LT_CHECK_EQ(test_ip.pieces[2], 13);
LT_CHECK_EQ(test_ip.pieces[3], 184);
LT_CHECK_EQ(test_ip.pieces[4], 135);
LT_CHECK_EQ(test_ip.pieces[5], 20);
LT_CHECK_EQ(test_ip.pieces[6], 58);
LT_CHECK_EQ(test_ip.pieces[7], 144);
LT_CHECK_EQ(test_ip.pieces[8], 0);
LT_CHECK_EQ(test_ip.pieces[9], 0);
LT_CHECK_EQ(test_ip.pieces[10], 0);
LT_CHECK_EQ(test_ip.pieces[11], 0);
LT_CHECK_EQ(test_ip.pieces[12], 0);
LT_CHECK_EQ(test_ip.pieces[13], 0);
LT_CHECK_EQ(test_ip.pieces[14], 0);
LT_CHECK_EQ(test_ip.pieces[15], 18);
LT_CHECK_EQ(test_ip.mask, 0xFFFF);
LT_END_AUTO_TEST(ip_representation6_sockaddr)
LT_BEGIN_AUTO_TEST(http_utils_suite, load_file)
LT_CHECK_EQ(httpserver::http::load_file("test_content"), "test content of file\n");
LT_END_AUTO_TEST(load_file)
LT_BEGIN_AUTO_TEST(http_utils_suite, load_file_invalid)
LT_CHECK_THROW(httpserver::http::load_file("test_content_invalid"));
LT_END_AUTO_TEST(load_file_invalid)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation_less_than)
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.0.1") < httpserver::http::ip_representation("127.0.0.2"), true);
LT_CHECK_EQ(httpserver::http::ip_representation("128.0.0.1") < httpserver::http::ip_representation("127.0.0.2"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.0.2") < httpserver::http::ip_representation("127.0.0.1"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.0.1") < httpserver::http::ip_representation("127.0.0.1"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.0.1") < httpserver::http::ip_representation("127.0.0.1"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("2001:db8::ff00:42:8329") < httpserver::http::ip_representation("2001:db8::ff00:42:8329"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("2001:db8::ff00:42:8330") < httpserver::http::ip_representation("2001:db8::ff00:42:8329"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("2001:db8::ff00:42:8329") < httpserver::http::ip_representation("2001:db8::ff00:42:8330"), true);
LT_CHECK_EQ(httpserver::http::ip_representation("2002:db8::ff00:42:8329") < httpserver::http::ip_representation("2001:db8::ff00:42:8330"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("::192.0.2.128") < httpserver::http::ip_representation("::192.0.2.128"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("::192.0.2.129") < httpserver::http::ip_representation("::192.0.2.128"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("::192.0.2.128") < httpserver::http::ip_representation("::192.0.2.129"), true);
LT_CHECK_EQ(httpserver::http::ip_representation("::ffff:192.0.2.128") < httpserver::http::ip_representation("::ffff:192.0.2.128"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("::ffff:192.0.2.129") < httpserver::http::ip_representation("::ffff:192.0.2.128"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("::ffff:192.0.2.128") < httpserver::http::ip_representation("::ffff:192.0.2.129"), true);
LT_CHECK_EQ(httpserver::http::ip_representation("::ffff:192.0.2.128") < httpserver::http::ip_representation("::192.0.2.128"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("::ffff:192.0.2.128") < httpserver::http::ip_representation("::192.0.2.128"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("::192.0.2.128") < httpserver::http::ip_representation("::ffff:192.0.2.129"), true);
LT_END_AUTO_TEST(ip_representation_less_than)
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation_less_than_with_masks)
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.*.*") < httpserver::http::ip_representation("127.0.0.1"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.0.1") < httpserver::http::ip_representation("127.0.*.*"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.0.*") < httpserver::http::ip_representation("127.0.*.*"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.*.1") < httpserver::http::ip_representation("127.0.0.1"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.0.1") < httpserver::http::ip_representation("127.0.*.1"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.1.0.1") < httpserver::http::ip_representation("127.0.*.1"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.*.1") < httpserver::http::ip_representation("127.1.0.1"), true);
LT_CHECK_EQ(httpserver::http::ip_representation("127.1.*.1") < httpserver::http::ip_representation("127.0.*.1"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("127.0.*.1") < httpserver::http::ip_representation("127.1.*.1"), true);
LT_CHECK_EQ(httpserver::http::ip_representation("2001:db8::ff00:42:*") < httpserver::http::ip_representation("2001:db8::ff00:42:8329"), false);
LT_CHECK_EQ(httpserver::http::ip_representation("2001:db8::ff00:42:8329") < httpserver::http::ip_representation("2001:db8::ff00:42:*"), false);
LT_END_AUTO_TEST(ip_representation_less_than_with_masks)
LT_BEGIN_AUTO_TEST(http_utils_suite, dump_header_map)
std::map header_map;
header_map["HEADER_ONE"] = "VALUE_ONE";
header_map["HEADER_TWO"] = "VALUE_TWO";
header_map["HEADER_THREE"] = "VALUE_THREE";
std::stringstream ss;
httpserver::http::dump_header_map(ss, "prefix", header_map);
LT_CHECK_EQ(ss.str(), " prefix [HEADER_ONE:\"VALUE_ONE\" HEADER_TWO:\"VALUE_TWO\" HEADER_THREE:\"VALUE_THREE\" ]\n");
LT_END_AUTO_TEST(dump_header_map)
LT_BEGIN_AUTO_TEST(http_utils_suite, dump_header_map_no_prefix)
std::map header_map;
header_map["HEADER_ONE"] = "VALUE_ONE";
header_map["HEADER_TWO"] = "VALUE_TWO";
header_map["HEADER_THREE"] = "VALUE_THREE";
std::stringstream ss;
httpserver::http::dump_header_map(ss, "", header_map);
LT_CHECK_EQ(ss.str(), " [HEADER_ONE:\"VALUE_ONE\" HEADER_TWO:\"VALUE_TWO\" HEADER_THREE:\"VALUE_THREE\" ]\n");
LT_END_AUTO_TEST(dump_header_map_no_prefix)
LT_BEGIN_AUTO_TEST(http_utils_suite, dump_arg_map)
std::map arg_map;
arg_map["ARG_ONE"] = "VALUE_ONE";
arg_map["ARG_TWO"] = "VALUE_TWO";
arg_map["ARG_THREE"] = "VALUE_THREE";
std::stringstream ss;
httpserver::http::dump_arg_map(ss, "prefix", arg_map);
LT_CHECK_EQ(ss.str(), " prefix [ARG_ONE:\"VALUE_ONE\" ARG_TWO:\"VALUE_TWO\" ARG_THREE:\"VALUE_THREE\" ]\n");
LT_END_AUTO_TEST(dump_arg_map)
LT_BEGIN_AUTO_TEST(http_utils_suite, dump_arg_map_no_prefix)
std::map arg_map;
arg_map["ARG_ONE"] = "VALUE_ONE";
arg_map["ARG_TWO"] = "VALUE_TWO";
arg_map["ARG_THREE"] = "VALUE_THREE";
std::stringstream ss;
httpserver::http::dump_arg_map(ss, "", arg_map);
LT_CHECK_EQ(ss.str(), " [ARG_ONE:\"VALUE_ONE\" ARG_TWO:\"VALUE_TWO\" ARG_THREE:\"VALUE_THREE\" ]\n");
LT_END_AUTO_TEST(dump_arg_map_no_prefix)
LT_BEGIN_AUTO_TEST_ENV()
AUTORUN_TESTS()
LT_END_AUTO_TEST_ENV()