MODULE = Protocol::HTTP              PACKAGE = Protocol::HTTP::CookieJar
PROTOTYPES: DISABLE

CookieJar* CookieJar::new (string data = {}) {
    RETVAL = new CookieJar(data);
}

void parse_cookies(const string& data) {
    CookieJar::DomainCookies dc;
    auto ret = CookieJar::parse_cookies(data, dc);
    EXTEND(SP, 2);
    mXPUSHs(xs::out(ret).detach());
    mXPUSHs(xs::out(dc).detach());
    XSRETURN(2);
}

string CookieJar::to_string(bool include_session = false, Date* now = nullptr) {
    RETVAL = THIS->to_string(include_session, (now ? *now : Date::now()));
}

void CookieJar::clear()

void CookieJar::add(const string& name, const Response::Cookie& cookies, URISP origin, const Date* now = nullptr) {
    THIS->add(name, cookies, origin, (now ? *now : Date::now()));
}

CookieJar::Cookies CookieJar::remove(string domain = "", string name = "", string path = "/")

Sv CookieJar::all_cookies() {
    RETVAL = xs::out(THIS->domain_cookies);
}

Sv CookieJar::find(URISP request_uri, URISP context_uri = request_uri, Date* now = nullptr, bool top_level = true) {
    RETVAL = xs::out(THIS->find(request_uri, context_uri, (now ? *now : Date::now()), top_level));
}

void CookieJar::collect(const Response& res, URISP request_uri, Date* now = nullptr) {
    THIS->collect(res, request_uri, (now ? *now : Date::now()));
}

void CookieJar::populate(Request& request, URISP context_uri = request.uri, bool top_level = true, Date* now = nullptr) {
    THIS->populate(request, context_uri, top_level, (now ? *now : Date::now()));
}

void CookieJar::set_ignore(Sub sub) {
    auto fn = xs::sub2function<CookieJar::ignore_fn>(sub);
    THIS->set_ignore(fn);
}

SV* CLONE_SKIP (...) {
    XSRETURN_YES;
    PERL_UNUSED_VAR(items);
}