1#include "cpr/cookies.h"
2#include <ctime>
3#include <iomanip>
4
5namespace cpr {
6const std::string Cookie::GetDomain() const {
7 return domain_;
8}
9
10bool Cookie::IsIncludingSubdomains() const {
11 return includeSubdomains_;
12}
13
14const std::string Cookie::GetPath() const {
15 return path_;
16}
17
18bool Cookie::IsHttpsOnly() const {
19 return httpsOnly_;
20}
21
22const std::chrono::system_clock::time_point Cookie::GetExpires() const {
23 return expires_;
24}
25
26const std::string Cookie::GetExpiresString() const {
27 std::stringstream ss;
28 std::tm tm{};
29 const std::time_t tt = std::chrono::system_clock::to_time_t(t: expires_);
30#ifdef _WIN32
31 gmtime_s(&tm, &tt);
32#else
33 gmtime_r(timer: &tt, tp: &tm);
34#endif
35 ss << std::put_time(tmb: &tm, fmt: "%a, %d %b %Y %H:%M:%S GMT");
36 return ss.str();
37}
38
39const std::string Cookie::GetName() const {
40 return name_;
41}
42
43const std::string Cookie::GetValue() const {
44 return value_;
45}
46
47const std::string Cookies::GetEncoded(const CurlHolder& holder) const {
48 std::stringstream stream;
49 for (const cpr::Cookie& item : cookies_) {
50 // Depending on if encoding is set to "true", we will URL-encode cookies
51 stream << (encode ? holder.urlEncode(s: item.GetName()) : item.GetName()) << "=";
52
53 // special case version 1 cookies, which can be distinguished by
54 // beginning and trailing quotes
55 if (!item.GetValue().empty() && item.GetValue().front() == '"' && item.GetValue().back() == '"') {
56 stream << item.GetValue();
57 } else {
58 // Depending on if encoding is set to "true", we will URL-encode cookies
59 stream << (encode ? holder.urlEncode(s: item.GetValue()) : item.GetValue());
60 }
61 stream << "; ";
62 }
63 return stream.str();
64}
65
66cpr::Cookie& Cookies::operator[](size_t pos) {
67 return cookies_[pos];
68}
69
70Cookies::iterator Cookies::begin() {
71 return cookies_.begin();
72}
73
74Cookies::iterator Cookies::end() {
75 return cookies_.end();
76}
77
78Cookies::const_iterator Cookies::begin() const {
79 return cookies_.begin();
80}
81
82Cookies::const_iterator Cookies::end() const {
83 return cookies_.end();
84}
85
86Cookies::const_iterator Cookies::cbegin() const {
87 return cookies_.cbegin();
88}
89
90Cookies::const_iterator Cookies::cend() const {
91 return cookies_.cend();
92}
93
94void Cookies::emplace_back(const Cookie& str) {
95 cookies_.emplace_back(args: str);
96}
97
98void Cookies::push_back(const Cookie& str) {
99 cookies_.push_back(x: str);
100}
101
102void Cookies::pop_back() {
103 cookies_.pop_back();
104}
105
106} // namespace cpr
107