WebMods/HTTPSock: Do not send Set-Cookie headers if the cookie has not changed.

To achieve that, split internal cookie jar into a jar for received cookies
and one for cookies that are to be sent with the response.


git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1840 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
cflakes
2010-03-23 16:48:25 +00:00
parent 72dccb5560
commit 968a0bd3ff
4 changed files with 33 additions and 27 deletions
+15 -9
View File
@@ -41,22 +41,27 @@ void CHTTPSock::ReadData(const char* data, size_t len) {
}
}
bool CHTTPSock::SetCookie(const CString& sKey, const CString& sValue) {
bool CHTTPSock::SendCookie(const CString& sKey, const CString& sValue) {
if (!sKey.empty() && !sValue.empty()) {
m_msCookies[sKey] = sValue;
if (m_msRequestCookies.find(sKey) == m_msRequestCookies.end() ||
m_msRequestCookies[sKey].StrCmp(sValue) != 0)
{
m_msResponseCookies[sKey] = sValue;
}
return true;
}
return false;
}
const MCString& CHTTPSock::GetCookies() const {
return m_msCookies;
const MCString& CHTTPSock::GetRequestCookies() const {
return m_msRequestCookies;
}
CString CHTTPSock::GetCookie(const CString& sKey) const {
MCString::const_iterator it = m_msCookies.find(sKey);
CString CHTTPSock::GetRequestCookie(const CString& sKey) const {
MCString::const_iterator it = m_msRequestCookies.find(sKey);
return it != m_msCookies.end() ? it->second : "";
return it != m_msRequestCookies.end() ? it->second : "";
}
void CHTTPSock::CheckPost() {
@@ -95,7 +100,8 @@ void CHTTPSock::ReadLine(const CString& sData) {
for (unsigned int a = 0; a < vsNV.size(); a++) {
CString s(vsNV[a]);
SetCookie(s.Token(0, false, "=").Escape_n(CString::EURL, CString::EASCII), s.Token(1, true, "=").Escape_n(CString::EURL, CString::EASCII));
m_msRequestCookies[s.Token(0, false, "=").Escape_n(CString::EURL, CString::EASCII)] =
s.Token(1, true, "=").Escape_n(CString::EURL, CString::EASCII);
}
} else if (sName.Equals("Authorization:")) {
CString sUnhashed;
@@ -435,7 +441,7 @@ bool CHTTPSock::PrintHeader(off_t uContentLength, const CString& sContentType, u
MCString::iterator it;
for (it = m_msCookies.begin(); it != m_msCookies.end(); ++it) {
for (it = m_msResponseCookies.begin(); it != m_msResponseCookies.end(); ++it) {
Write("Set-Cookie: " + it->first.Escape_n(CString::EURL) + "=" + it->second.Escape_n(CString::EURL) + "; path=/;\r\n");
}