void CMessage::InitType() { if (m_sCommand.length() == 3 && isdigit(m_sCommand[0]) && isdigit(m_sCommand[1]) && isdigit(m_sCommand[2])) { m_eType = Type::Numeric; } else if (m_sCommand.Equals("PRIVMSG")) { CString sParam = GetParam(1); if (sParam.TrimPrefix("\001") && sParam.EndsWith("\001")) { if (sParam.StartsWith("ACTION ")) { m_eType = Type::Action; } else { m_eType = Type::CTCP; } } else { m_eType = Type::Text; } } else if (m_sCommand.Equals("NOTICE")) { CString sParam = GetParam(1); if (sParam.StartsWith("\001") && sParam.EndsWith("\001")) { m_eType = Type::CTCP; } else { m_eType = Type::Notice; } } else { std::map<CString, Type> mTypes = { {"ACCOUNT", Type::Account}, {"AWAY", Type::Away}, {"CAP", Type::Capability}, {"ERROR", Type::Error}, {"INVITE", Type::Invite}, {"JOIN", Type::Join}, {"KICK", Type::Kick}, {"MODE", Type::Mode}, {"NICK", Type::Nick}, {"PART", Type::Part}, {"PING", Type::Ping}, {"PONG", Type::Pong}, {"QUIT", Type::Quit}, {"TOPIC", Type::Topic}, {"WALLOPS", Type::Wallops}, }; auto it = mTypes.find(m_sCommand.AsUpper()); if (it != mTypes.end()) { m_eType = it->second; } else { m_eType = Type::Unknown; } } }
bool CHTTPSock::PrintFile(const CString& sFileName, CString sContentType) { CString sFilePath = sFileName; if (!m_sDocRoot.empty()) { sFilePath.TrimLeft("/"); sFilePath = CDir::CheckPathPrefix(m_sDocRoot, sFilePath, m_sDocRoot); if (sFilePath.empty()) { PrintErrorPage(403, "Forbidden", "You don't have permission to access that file on this server."); DEBUG("THIS FILE: [" << sFilePath << "] does not live in ..."); DEBUG("DOCUMENT ROOT: [" << m_sDocRoot << "]"); return false; } } CFile File(sFilePath); if (!File.Open()) { PrintNotFound(); return false; } if (sContentType.empty()) { if (sFileName.EndsWith(".html") || sFileName.EndsWith(".htm")) { sContentType = "text/html; charset=utf-8"; } else if (sFileName.EndsWith(".css")) { sContentType = "text/css; charset=utf-8"; } else if (sFileName.EndsWith(".js")) { sContentType = "application/x-javascript; charset=utf-8"; } else if (sFileName.EndsWith(".jpg")) { sContentType = "image/jpeg"; } else if (sFileName.EndsWith(".gif")) { sContentType = "image/gif"; } else if (sFileName.EndsWith(".ico")) { sContentType = "image/x-icon"; } else if (sFileName.EndsWith(".png")) { sContentType = "image/png"; } else if (sFileName.EndsWith(".bmp")) { sContentType = "image/bmp"; } else { sContentType = "text/plain; charset=utf-8"; } } const time_t iMTime = File.GetMTime(); bool bNotModified = false; CString sETag; if (iMTime > 0 && !m_bHTTP10Client) { sETag = "-" + CString(iMTime); // lighttpd style ETag AddHeader("Last-Modified", GetDate(iMTime)); AddHeader("ETag", "\"" + sETag + "\""); AddHeader("Cache-Control", "public"); if (!m_sIfNoneMatch.empty()) { m_sIfNoneMatch.Trim("\\\"'"); bNotModified = (m_sIfNoneMatch.Equals(sETag, CString::CaseSensitive)); } } if (bNotModified) { PrintHeader(0, sContentType, 304, "Not Modified"); } else { off_t iSize = File.GetSize(); // Don't try to send files over 16 MiB, because it might block // the whole process and use huge amounts of memory. if (iSize > 16 * 1024 * 1024) { DEBUG("- Abort: File is over 16 MiB big: " << iSize); PrintErrorPage(500, "Internal Server Error", "File too big"); return true; } #ifdef HAVE_ZLIB bool bGzip = m_bAcceptGzip && (sContentType.StartsWith("text/") || sFileName.EndsWith(".js")); if (bGzip) { DEBUG("- Sending gzip-compressed."); AddHeader("Content-Encoding", "gzip"); PrintHeader(0, sContentType); // we do not know the compressed data's length WriteFileGzipped(File); } else #endif { PrintHeader(iSize, sContentType); WriteFileUncompressed(File); } } DEBUG("- ETag: [" << sETag << "] / If-None-Match [" << m_sIfNoneMatch << "]"); Close(Csock::CLT_AFTERWRITE); return true; }