Skip to content

Commit 40dd566

Browse files
authored
Merge pull request #8 from coding-cpp/fix/1
add cookies and other stuff
2 parents 9ce8f20 + c686ea5 commit 40dd566

File tree

13 files changed

+230
-6
lines changed

13 files changed

+230
-6
lines changed

include/mochios/client/client.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <mochios/client/options.h>
1010
#include <mochios/interceptors/interceptor.h>
11+
#include <mochios/interceptors/request/cookie.h>
1112
#include <mochios/interceptors/request/user_agent.h>
1213
#include <mochios/interceptors/response/json.h>
1314

@@ -19,6 +20,7 @@ class Client {
1920
struct addrinfo *server;
2021

2122
mochios::client::Connection connection;
23+
mochios::interceptor::Interceptors internalInterceptors;
2224

2325
void connect();
2426
mochios::messages::Response sendHelper(mochios::messages::Request &request);

include/mochios/helpers/cookie.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include <mochios/messages/cookie.h>
4+
5+
namespace mochios {
6+
7+
namespace helpers {
8+
9+
namespace cookie {
10+
11+
std::string serialize(const mochios::messages::Cookie &cookie);
12+
13+
} // namespace cookie
14+
15+
} // namespace helpers
16+
17+
} // namespace mochios
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
3+
#include <mochios/messages/cookie.h>
4+
#include <mochios/messages/request.h>
5+
6+
namespace mochios {
7+
8+
namespace interceptor {
9+
10+
namespace request {
11+
12+
void cookie(mochios::messages::Request &request);
13+
14+
} // namespace request
15+
16+
} // namespace interceptor
17+
18+
} // namespace mochios

include/mochios/messages/cookie.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#pragma once
2+
3+
#include <brewtils/string.h>
4+
#include <brewtils/url.h>
5+
#include <logger/log.h>
6+
7+
namespace mochios {
8+
9+
namespace messages {
10+
11+
class Cookie {
12+
public:
13+
bool secure;
14+
bool httpOnly;
15+
bool partitioned;
16+
17+
std::string name;
18+
std::string value;
19+
std::string domain;
20+
std::string path;
21+
std::string expires;
22+
std::string maxAge;
23+
std::string sameSite;
24+
25+
Cookie();
26+
Cookie(const std::string &data);
27+
~Cookie();
28+
29+
std::string serialize() const;
30+
};
31+
32+
} // namespace messages
33+
34+
} // namespace mochios

include/mochios/messages/message.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include <brewtils/string.h>
44
#include <json/parse.h>
55

6+
#include <mochios/messages/cookie.h>
7+
68
namespace mochios {
79

810
namespace messages {
@@ -19,6 +21,7 @@ class Message {
1921
std::map<std::string, std::string> headers;
2022
std::map<std::string, std::string> params;
2123
std::map<std::string, std::string> queries;
24+
std::vector<mochios::messages::Cookie *> cookies;
2225
json::object body;
2326

2427
void set(const std::string &key, const std::string &value);

src/client/client.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ mochios::Client::Client(const mochios::client::Connection &connection)
1818
this->connect();
1919
close(this->socket);
2020

21-
this->interceptors.request.use(mochios::interceptor::request::userAgent);
22-
this->interceptors.response.use(mochios::interceptor::response::json);
21+
this->internalInterceptors.request.use(
22+
mochios::interceptor::request::userAgent);
23+
this->internalInterceptors.request.use(mochios::interceptor::request::cookie);
24+
this->internalInterceptors.response.use(mochios::interceptor::response::json);
2325
return;
2426
}
2527

@@ -101,9 +103,19 @@ mochios::Client::sendHelper(mochios::messages::Request &request) {
101103
&requestInterceptor : this->interceptors.request.interceptors) {
102104
requestInterceptor(request);
103105
}
106+
for (const std::function<void(mochios::messages::Request &)>
107+
&requestInterceptor :
108+
this->internalInterceptors.request.interceptors) {
109+
requestInterceptor(request);
110+
}
104111
this->connect();
105112
mochios::messages::Response res =
106113
mochios::helpers::send(request, this->socket);
114+
for (const std::function<void(mochios::messages::Response &)>
115+
&responseInterceptor :
116+
this->internalInterceptors.response.interceptors) {
117+
responseInterceptor(res);
118+
}
107119
for (const std::function<void(mochios::messages::Response &)>
108120
&responseInterceptor : this->interceptors.response.interceptors) {
109121
responseInterceptor(res);

src/helpers/client.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,15 @@ void mochios::helpers::buildResponse(mochios::messages::Response &res,
4646
continue;
4747
}
4848

49-
std::string key = line.substr(0, separator);
49+
std::string key = brewtils::string::lower(line.substr(0, separator));
5050
std::string value = line.substr(separator + 2, line.size() - separator - 3);
51+
if (key == "set-cookie") {
52+
mochios::messages::Cookie *newCookie =
53+
new mochios::messages::Cookie(value);
54+
res.cookies.push_back(newCookie);
55+
continue;
56+
}
57+
5158
res.set(key, value);
5259
}
5360

src/helpers/cookie.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <mochios/helpers/cookie.h>
2+
3+
std::string
4+
mochios::helpers::cookie::serialize(const mochios::messages::Cookie &cookie) {
5+
std::string cookieString = brewtils::url::encode(cookie.name) + "=" +
6+
brewtils::url::encode(cookie.value);
7+
if (!cookie.domain.empty()) {
8+
cookieString += "; Domain=" + cookie.domain;
9+
}
10+
if (!cookie.path.empty()) {
11+
cookieString += "; Path=" + cookie.path;
12+
}
13+
if (!cookie.expires.empty()) {
14+
cookieString += "; Expires=" + cookie.expires;
15+
}
16+
if (!cookie.maxAge.empty()) {
17+
cookieString += "; Max-Age=" + cookie.maxAge;
18+
}
19+
if (!cookie.sameSite.empty()) {
20+
cookieString += "; SameSite=" + cookie.sameSite;
21+
}
22+
if (cookie.secure) {
23+
cookieString += "; Secure";
24+
}
25+
if (cookie.httpOnly) {
26+
cookieString += "; HttpOnly";
27+
}
28+
if (cookie.partitioned) {
29+
cookieString += "; Partitioned";
30+
}
31+
return cookieString;
32+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#include <mochios/interceptors/request/cookie.h>
2+
3+
void mochios::interceptor::request::cookie(
4+
mochios::messages::Request &request) {
5+
bool isFirst = true;
6+
std::string value = "";
7+
for (const mochios::messages::Cookie *cookie : request.cookies) {
8+
if (isFirst) {
9+
isFirst = false;
10+
} else {
11+
value += "; ";
12+
}
13+
value += cookie->name + "=" + cookie->value;
14+
}
15+
16+
if (!value.empty()) {
17+
request.headers["Cookie"] = value;
18+
}
19+
return;
20+
}

src/messages/cookie.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include <mochios/helpers/cookie.h>
2+
#include <mochios/messages/cookie.h>
3+
4+
mochios::messages::Cookie::Cookie()
5+
: secure(false), httpOnly(false), partitioned(false), name(""), value(""),
6+
domain(""), path(""), expires(""), maxAge(""), sameSite("") {
7+
return;
8+
}
9+
10+
mochios::messages::Cookie::Cookie(const std::string &data) {
11+
std::string key, value;
12+
std::vector<std::string> kv;
13+
std::vector<std::string> parts = brewtils::string::split(data, ";");
14+
15+
for (const std::string &part : parts) {
16+
kv = brewtils::string::split(part, "=");
17+
if (kv.size() == 0) {
18+
continue;
19+
}
20+
21+
key = brewtils::string::lower(
22+
brewtils::url::decode(brewtils::string::trim(kv[0])));
23+
if (kv.size() == 1) {
24+
if (key == "secure") {
25+
this->secure = true;
26+
} else if (key == "httponly") {
27+
this->httpOnly = true;
28+
} else if (key == "partitioned") {
29+
this->partitioned = true;
30+
}
31+
continue;
32+
}
33+
34+
value = brewtils::url::decode(brewtils::string::trim(kv[1]));
35+
if (key == "domain") {
36+
this->domain = value;
37+
} else if (key == "path") {
38+
this->path = value;
39+
} else if (key == "expires") {
40+
this->expires = value;
41+
} else if (key == "max-age") {
42+
this->maxAge = value;
43+
} else if (key == "samesite") {
44+
this->sameSite = value;
45+
} else {
46+
this->name = brewtils::url::decode(brewtils::string::trim(kv[0]));
47+
this->value = value;
48+
}
49+
}
50+
51+
if (this->name.empty()) {
52+
logger::warning("Cookie name empty in data: " + data);
53+
}
54+
55+
return;
56+
}
57+
58+
mochios::messages::Cookie::~Cookie() { return; }
59+
60+
std::string mochios::messages::Cookie::serialize() const {
61+
return mochios::helpers::cookie::serialize(*this);
62+
}

0 commit comments

Comments
 (0)