ChannelIndexData::ChannelIndexData(ChatChannel channel) : count(0) , options(NoOptions) , visibility(0) , name(channel->name()) { FeedPtr feed = channel->feed(FEED_NAME_INFO, false); if (!feed) return; visibility = feed->data().value(INFO_FEED_VISIBILITY_KEY, 0).toInt(); if (visibility < 0) return; if (channel->permanent()) options |= Permanent; id = channel->id(); count = channel->channels().size(); title = feed->data().value(INFO_FEED_TITLE_KEY).toMap().value(INFO_FEED_TEXT_KEY).toString(); if (feed->data().value(INFO_FEED_PINNED_KEY, false).toBool()) options |= Pinned; FeedPtr acl = channel->feed(FEED_NAME_ACL, false); if (acl && AclValue::match(acl.data(), 0) == 0) options |= Private; }
/*! * Универсальный метод для отдачи тела фида. */ bool FeedHandler::serveFeed(ChatChannel channel, const QString &feedName) { if (!ifMethodAllowed()) return true; if (!channel || !channel->feeds().all().contains(feedName)) { setNoStore(); m_response->writeHead(Tufao::HttpServerResponse::NOT_FOUND); m_response->end(); return true; } FeedPtr feed = channel->feed(feedName); qint64 date = feed->head().date(); RestReplyCache &cache = m_cache[channel->id() + feedName.toUtf8()]; if (cache.date != date) { cache.date = date; cache.etag = etag(date, m_path.toUtf8()); cache.body = JSON::generate(feed->feed()); } setLastModified(date); setETag(cache.etag); setNoCache(); if (!ifModified(cache.etag)) { m_response->writeHead(Tufao::HttpServerResponse::NOT_MODIFIED); m_response->end(); return true; } m_response->writeHead(Tufao::HttpServerResponse::OK); if (m_request->method() != "HEAD") { setContentLength(cache.body.size()); m_response->end(cache.body); } else m_response->end(); return true; }