Skip to content

Commit 6efe138

Browse files
Shravan Gajjelafacebook-github-bot
authored andcommitted
Add removeCookie method
Summary: As titled a new utility method to remove a certain cookie from the request. Reviewed By: afrind Differential Revision: D76707379 fbshipit-source-id: e7bf2257fb4ac513a3988aecc831761cbf369c21
1 parent c189620 commit 6efe138

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed

third-party/proxygen/src/proxygen/lib/http/HTTPMessage.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,41 @@ const StringPiece HTTPMessage::getCookie(const string& name) const {
454454
}
455455
}
456456

457+
void HTTPMessage::removeCookie(const string& name) {
458+
unparseCookies();
459+
if (!parsedCookies_) {
460+
parseCookies();
461+
}
462+
463+
auto it = cookies_.find(name);
464+
if (it == cookies_.end()) {
465+
return;
466+
}
467+
468+
// Remove cookie
469+
cookies_.erase(it);
470+
471+
// Reconstruct the Cookie header from remaining cookies
472+
if (cookies_.empty()) {
473+
// No cookies remaining
474+
headers_.remove(HTTP_HEADER_COOKIE);
475+
} else {
476+
// Build new cookie header value
477+
std::vector<std::string> cookieStrings;
478+
cookieStrings.reserve(cookies_.size());
479+
for (const auto& cookie : cookies_) {
480+
cookieStrings.emplace_back(cookie.first.str() + "=" +
481+
cookie.second.str());
482+
}
483+
484+
// Set the new Cookie header
485+
headers_.set(HTTP_HEADER_COOKIE, folly::join("; ", cookieStrings));
486+
}
487+
488+
// Clear parsed cookies
489+
unparseCookies();
490+
}
491+
457492
void HTTPMessage::parseQueryParams() const {
458493
DCHECK(!parsedQueryParams_);
459494
const Request& req = request();

third-party/proxygen/src/proxygen/lib/http/HTTPMessage.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,11 @@ class HTTPMessage {
632632
*/
633633
const folly::StringPiece getCookie(const std::string& name) const;
634634

635+
/**
636+
* Remove the cookie with the specified name.
637+
*/
638+
void removeCookie(const std::string& name);
639+
635640
/**
636641
* Print the message out.
637642
*/

third-party/proxygen/src/proxygen/lib/http/test/HTTPMessageTest.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,68 @@ TEST(HTTPMessage, TestParseCookiesMultipleCookies) {
5555
EXPECT_EQ(msg.getCookie("Name"), "");
5656
}
5757

58+
TEST(HTTPMessage, TestRemoveCookie) {
59+
HTTPMessage msg;
60+
61+
// Test removing a cookie that exists
62+
msg.getHeaders().set("Cookie",
63+
"id=1256679245; data=0:1234567; session=abc123");
64+
EXPECT_EQ(msg.getCookie("id"), "1256679245");
65+
EXPECT_EQ(msg.getCookie("data"), "0:1234567");
66+
EXPECT_EQ(msg.getCookie("session"), "abc123");
67+
68+
// Remove middle cookie
69+
msg.removeCookie("data");
70+
EXPECT_EQ(msg.getCookie("id"), "1256679245");
71+
EXPECT_EQ(msg.getCookie("data"), "");
72+
EXPECT_EQ(msg.getCookie("session"), "abc123");
73+
74+
// Verify Cookie header was reconstructed properly
75+
const std::string& cookieHeader = msg.getHeaders().getSingleOrEmpty("Cookie");
76+
EXPECT_TRUE(cookieHeader.find("id=1256679245") != std::string::npos);
77+
EXPECT_TRUE(cookieHeader.find("session=abc123") != std::string::npos);
78+
EXPECT_TRUE(cookieHeader.find("data=0:1234567") == std::string::npos);
79+
80+
// Remove first cookie
81+
msg.removeCookie("id");
82+
EXPECT_EQ(msg.getCookie("id"), "");
83+
EXPECT_EQ(msg.getCookie("session"), "abc123");
84+
85+
// Remove last remaining cookie - should remove Cookie header entirely
86+
msg.removeCookie("session");
87+
EXPECT_EQ(msg.getCookie("session"), "");
88+
EXPECT_FALSE(msg.getHeaders().exists("Cookie"));
89+
}
90+
91+
TEST(HTTPMessage, TestRemoveCookieNonExistent) {
92+
HTTPMessage msg;
93+
94+
// Test removing a cookie that doesn't exist
95+
msg.getHeaders().set("Cookie", "id=1256679245; data=0:1234567");
96+
97+
// Try to remove non-existent cookie
98+
msg.removeCookie("nonexistent");
99+
100+
// Original cookies should still be there
101+
EXPECT_EQ(msg.getCookie("id"), "1256679245");
102+
EXPECT_EQ(msg.getCookie("data"), "0:1234567");
103+
104+
// Cookie header should be unchanged
105+
const std::string& cookieHeader = msg.getHeaders().getSingleOrEmpty("Cookie");
106+
EXPECT_TRUE(cookieHeader.find("id=1256679245") != std::string::npos);
107+
EXPECT_TRUE(cookieHeader.find("data=0:1234567") != std::string::npos);
108+
}
109+
110+
TEST(HTTPMessage, TestRemoveCookieEmptyHeader) {
111+
HTTPMessage msg;
112+
113+
// Test removing cookie when no Cookie header exists
114+
msg.removeCookie("nonexistent");
115+
116+
EXPECT_FALSE(msg.getHeaders().exists("Cookie"));
117+
EXPECT_EQ(msg.getCookie("nonexistent"), "");
118+
}
119+
58120
TEST(HTTPMessage, TestParseQueryParamsSimple) {
59121
HTTPMessage msg;
60122
string url =

0 commit comments

Comments
 (0)