37
35
CHTTPSock::~CHTTPSock() {}
39
void CHTTPSock::ReadData(const char* data, int len) {
37
void CHTTPSock::ReadData(const char* data, size_t len) {
40
38
if (!m_bDone && m_bGotHeader && m_bPost) {
41
39
m_sPostData.append(data, len);
44
bool CHTTPSock::SendCookie(const CString& sKey, const CString& sValue) {
45
if (!sKey.empty() && !sValue.empty()) {
46
if (m_msRequestCookies.find(sKey) == m_msRequestCookies.end() ||
47
m_msRequestCookies[sKey].StrCmp(sValue) != 0)
49
m_msResponseCookies[sKey] = sValue;
57
const MCString& CHTTPSock::GetRequestCookies() const {
58
return m_msRequestCookies;
61
CString CHTTPSock::GetRequestCookie(const CString& sKey) const {
62
MCString::const_iterator it = m_msRequestCookies.find(sKey);
64
return it != m_msRequestCookies.end() ? it->second : "";
46
67
void CHTTPSock::CheckPost() {
47
68
if (m_sPostData.size() >= m_uPostLen) {
48
ParseParams(m_sPostData.Left(m_uPostLen));
69
ParseParams(m_sPostData.Left(m_uPostLen), m_msvsPOSTParams);
50
71
m_sPostData.clear();
52
Close(Csock::CLT_AFTERWRITE);
73
93
m_sURI = sLine.Token(1);
95
} else if (sName.Equals("Cookie:")) {
98
sLine.Token(1, true).Split(";", vsNV, false, "", "", true, true);
100
for (unsigned int a = 0; a < vsNV.size(); a++) {
103
m_msRequestCookies[s.Token(0, false, "=").Escape_n(CString::EURL, CString::EASCII)] =
104
s.Token(1, true, "=").Escape_n(CString::EURL, CString::EASCII);
75
106
} else if (sName.Equals("Authorization:")) {
76
107
CString sUnhashed;
77
108
sLine.Token(2).Base64Decode(sUnhashed);
101
132
void CHTTPSock::GetPage() {
104
133
DEBUG("Page Request [" << m_sURI << "] ");
106
if (!OnPageRequest(m_sURI, sPage)) {
135
OnPageRequest(m_sURI);
138
void CHTTPSock::PrintPage(const CString& sPage) {
111
139
if (!SentHeader()) {
112
140
PrintHeader(sPage.length());
142
DEBUG("PrintPage(): Header was already sent");
217
247
void CHTTPSock::ParseURI() {
218
ParseParams(m_sURI.Token(1, true, "?"));
248
ParseParams(m_sURI.Token(1, true, "?"), m_msvsGETParams);
219
249
m_sURI = m_sURI.Token(0, false, "?");
223
253
return m_sURI.Token(0, false, "?");
226
void CHTTPSock::ParseParams(const CString& sParams) {
227
m_msvsParams.clear();
256
void CHTTPSock::ParseParams(const CString& sParams, map<CString, VCString> &msvsParams) {
229
259
VCString vsPairs;
230
260
sParams.Split("&", vsPairs, true);
234
264
CString sName = sPair.Token(0, false, "=").Escape_n(CString::EURL, CString::EASCII);
235
265
CString sValue = sPair.Token(1, true, "=").Escape_n(CString::EURL, CString::EASCII);
237
m_msvsParams[sName].push_back(sValue);
267
msvsParams[sName].push_back(sValue);
263
293
return m_sPostData;
266
bool CHTTPSock::HasParam(const CString& sName) const {
267
return (m_msvsParams.find(sName) != m_msvsParams.end());
270
CString CHTTPSock::GetRawParam(const CString& sName) const {
296
bool CHTTPSock::HasParam(const CString& sName, bool bPost) const {
298
return (m_msvsPOSTParams.find(sName) != m_msvsPOSTParams.end());
299
return (m_msvsGETParams.find(sName) != m_msvsGETParams.end());
302
CString CHTTPSock::GetRawParam(const CString& sName, bool bPost) const {
304
return GetRawParam(sName, m_msvsPOSTParams);
305
return GetRawParam(sName, m_msvsGETParams);
308
CString CHTTPSock::GetRawParam(const CString& sName, const map<CString, VCString>& msvsParams) {
273
map<CString, VCString>::const_iterator it = m_msvsParams.find(sName);
311
map<CString, VCString>::const_iterator it = msvsParams.find(sName);
275
if (it != m_msvsParams.end() && it->second.size() > 0) {
313
if (it != msvsParams.end() && it->second.size() > 0) {
276
314
sRet = it->second[0];
282
CString CHTTPSock::GetParam(const CString& sName, const CString& sFilter) const {
283
CString sRet = GetRawParam(sName);
320
CString CHTTPSock::GetParam(const CString& sName, bool bPost, const CString& sFilter) const {
322
return GetParam(sName, m_msvsPOSTParams, sFilter);
323
return GetParam(sName, m_msvsGETParams, sFilter);
326
CString CHTTPSock::GetParam(const CString& sName, const map<CString, VCString>& msvsParams, const CString& sFilter) {
327
CString sRet = GetRawParam(sName, msvsParams);
285
330
for (size_t i = 0; i < sFilter.length(); i++) {
286
331
sRet.Replace(CString(sFilter.at(i)), "");
292
unsigned int CHTTPSock::GetParamValues(const CString& sName, set<CString>& ssRet, const CString& sFilter) const {
337
unsigned int CHTTPSock::GetParamValues(const CString& sName, set<CString>& ssRet, bool bPost, const CString& sFilter) const {
339
return GetParamValues(sName, ssRet, m_msvsPOSTParams, sFilter);
340
return GetParamValues(sName, ssRet, m_msvsGETParams, sFilter);
343
unsigned int CHTTPSock::GetParamValues(const CString& sName, set<CString>& ssRet, const map<CString, VCString>& msvsParams, const CString& sFilter) {
295
map<CString, VCString>::const_iterator it = m_msvsParams.find(sName);
346
map<CString, VCString>::const_iterator it = msvsParams.find(sName);
297
if (it != m_msvsParams.end()) {
348
if (it != msvsParams.end()) {
298
349
for (unsigned int a = 0; a < it->second.size(); a++) {
299
350
CString sParam = it->second[a];
301
353
for (size_t i = 0; i < sFilter.length(); i++) {
302
354
sParam.Replace(CString(sFilter.at(i)), "");
308
360
return ssRet.size();
311
unsigned int CHTTPSock::GetParamValues(const CString& sName, VCString& vsRet, const CString& sFilter) const {
363
unsigned int CHTTPSock::GetParamValues(const CString& sName, VCString& vsRet, bool bPost, const CString& sFilter) const {
365
return GetParamValues(sName, vsRet, m_msvsPOSTParams, sFilter);
366
return GetParamValues(sName, vsRet, m_msvsGETParams, sFilter);
369
unsigned int CHTTPSock::GetParamValues(const CString& sName, VCString& vsRet, const map<CString, VCString>& msvsParams, const CString& sFilter) {
314
map<CString, VCString>::const_iterator it = m_msvsParams.find(sName);
372
map<CString, VCString>::const_iterator it = msvsParams.find(sName);
316
if (it != m_msvsParams.end()) {
374
if (it != msvsParams.end()) {
317
375
for (unsigned int a = 0; a < it->second.size(); a++) {
318
376
CString sParam = it->second[a];
320
379
for (size_t i = 0; i < sFilter.length(); i++) {
321
380
sParam.Replace(CString(sFilter.at(i)), "");
327
386
return vsRet.size();
330
const map<CString, VCString>& CHTTPSock::GetParams() const {
389
const map<CString, VCString>& CHTTPSock::GetParams(bool bPost) const {
391
return m_msvsPOSTParams;
392
return m_msvsGETParams;
395
bool CHTTPSock::IsPost() const {
334
399
bool CHTTPSock::PrintNotFound() {
353
419
"<html><head>\r\n<title>" + CString(uStatusId) + " " + sStatusMsg.Escape_n(CString::EHTML) + "</title>\r\n"
354
420
"</head><body>\r\n<h1>" + sStatusMsg.Escape_n(CString::EHTML) + "</h1>\r\n"
355
421
"<p>" + sMessage.Escape_n(CString::EHTML) + "</p>\r\n"
356
"<hr>\r\n<address>" + CZNC::GetTag().Escape_n(CString::EHTML) + " at " + GetLocalIP().Escape_n(CString::EHTML) + " Port " + CString(GetLocalPort()) + "</address>\r\n"
422
"<hr />\r\n<address>" + CZNC::GetTag(false).Escape_n(CString::EHTML) + " at " + GetLocalIP().Escape_n(CString::EHTML) + " Port " + CString(GetLocalPort()) + "</address>\r\n"
357
423
"</body></html>\r\n";
386
453
bool CHTTPSock::PrintHeader(off_t uContentLength, const CString& sContentType, unsigned int uStatusId, const CString& sStatusMsg) {
387
454
if (SentHeader()) {
388
DEBUG("- Header already sent!");
455
DEBUG("PrintHeader(): Header was already sent!");
402
469
Write("HTTP/" + CString(m_bHTTP10Client ? "1.0 " : "1.1 ") + CString(uStatusId) + " " + sStatusMsg + "\r\n");
403
470
//Write("Date: Tue, 28 Jun 2005 20:45:36 GMT\r\n");
404
Write("Server: " + CZNC::GetTag() + "\r\n");
471
Write("Server: " + CZNC::GetTag(false) + "\r\n");
405
472
if (uContentLength > 0) {
406
473
Write("Content-Length: " + CString(uContentLength) + "\r\n");
408
475
Write("Content-Type: " + m_sContentType + "\r\n");
410
for (MCString::iterator it = m_msHeaders.begin(); it != m_msHeaders.end(); it++) {
477
MCString::iterator it;
479
for (it = m_msResponseCookies.begin(); it != m_msResponseCookies.end(); ++it) {
480
Write("Set-Cookie: " + it->first.Escape_n(CString::EURL) + "=" + it->second.Escape_n(CString::EURL) + "; path=/;\r\n");
483
for (it = m_msHeaders.begin(); it != m_msHeaders.end(); ++it) {
411
484
Write(it->first + ": " + it->second + "\r\n");