#include "../test.h"
#define TEST(name) TEST_CASE("parse-cookies: " name, "[parse-cookies]")
TEST("request single cookie") {
RequestParser p;
string raw =
"GET / HTTP/1.1\r\n"
"Cookie: key=value\r\n"
"\r\n";
auto result = p.parse(raw);
auto req = result.request;
CHECK(result.state == State::done);
CHECK(req->cookies.size() == 1);
CHECK(req->cookies.get("key") == "value");
}
TEST("request multiple cookies") {
RequestParser p;
string raw = "GET / HTTP/1.1\r\n";
SECTION("in single header") {
raw += "Cookie: key=value; key2=value2\r\n";
}
SECTION("in multiple headers") {
raw += "Cookie: key=value\r\n"
"Cookie: key2=value2\r\n";
}
raw += "\r\n";
auto result = p.parse(raw);
auto req = result.request;
CHECK(result.state == State::done);
CHECK(req->cookies.size() == 2);
CHECK(req->cookies.get("key") == "value");
CHECK(req->cookies.get("key2") == "value2");
}
TEST("response single cookie") {
ResponseParser p;
p.set_context_request(new Request());
string raw =
"HTTP/1.1 200 OK\r\n"
"Set-Cookie: key=value; Domain=crazypanda.ru; Path=/; Max-Age=999; Expires=Thu, 28 Nov 2019 18:43:59 GMT; Secure; HttpOnly; SameSite=Lax\r\n"
"Content-Length: 0\r\n"
"\r\n";
auto result = p.parse(raw);
auto res = result.response;
CHECK(result.state == State::done);
CHECK(res->cookies.size() == 1);
REQUIRE(res->cookies.get("key"));
auto coo = res->cookies.get("key").value();
CHECK(coo.value() == "value");
CHECK(coo.domain() == "crazypanda.ru");
CHECK(coo.path() == "/");
CHECK(coo.max_age() == 999);
REQUIRE(coo.expires());
CHECK(coo.expires().value() == Date(2019, 11, 28, 18, 43, 59, 0, -1, panda::time::tzget("GMT")));
CHECK(coo.secure());
CHECK(coo.http_only());
CHECK(coo.same_site() == Response::Cookie::SameSite::Lax);
}
TEST("response multiple cookies") {
ResponseParser p;
p.set_context_request(new Request());
string raw =
"HTTP/1.1 200 OK\r\n"
"Set-Cookie: key=value; Domain=.crazypanda.ru; Path=/; Max-Age=999; Secure; HttpOnly; SameSite=None\r\n"
"Set-Cookie: key2=value2; Domain=epta.ru; Path=/jopa; Max-Age=222; SameSite\r\n"
"Content-Length: 0\r\n"
"\r\n";
auto result = p.parse(raw);
auto res = result.response;
CHECK(result.state == State::done);
CHECK(res->cookies.size() == 2);
REQUIRE(res->cookies.get("key"));
auto coo = res->cookies.get("key").value();
CHECK(coo.value() == "value");
CHECK(coo.domain() == ".crazypanda.ru");
CHECK(coo.path() == "/");
CHECK(coo.max_age() == 999);
CHECK(coo.secure());
CHECK(coo.http_only());
CHECK(coo.same_site() == Response::Cookie::SameSite::None);
REQUIRE(res->cookies.get("key2"));
coo = res->cookies.get("key2").value();
CHECK(coo.value() == "value2");
CHECK(coo.domain() == "epta.ru");
CHECK(coo.path() == "/jopa");
CHECK(coo.max_age() == 222);
CHECK_FALSE(coo.secure());
CHECK_FALSE(coo.http_only());
CHECK(coo.same_site() == Response::Cookie::SameSite::Strict);
}