void CometResponseStat::responseClose(const SessionPtr& session,int status_code, const string& msg) { MCE_DEBUG("CometResponseStat::responseClose --> connection:" <<session->connectionId()); deliver(session, status_code, 0, false, false, "",msg); // changeStat(session, &ConnectingStat::instance()); }
void CometResponseStat::deliver(const SessionPtr& session, int status_code, int cache_time, bool is_gzip, bool keep_alive, const string& extra_header, const string& body, bool bin_data, const string& content_type, const string& nogzipmsg) { ConnectionStat::deliver(session, status_code, cache_time, is_gzip, keep_alive, extra_header, body, bin_data, content_type, nogzipmsg); if (keep_alive || status_code == 200) { ClientPoolManager::instance().getClientPool(session->jid()->index).unbind(session->jid()->index, session->connectionId()); } }
void CometRecvStat::deliver(const SessionPtr& session, int status_code, int cache_time, bool is_gzip, bool keep_alive, const string& extra_header, const string& body, bool bin_data, const string& content_type) { ConnectionStat::deliver(session, status_code, cache_time, is_gzip, keep_alive, extra_header, body, bin_data, content_type); //MCE_DEBUG("CometRecvStat::deliver --> " << jidToString(session->jid()) << " " << body); if (keep_alive || status_code == 200) { ClientPoolManager::instance().getClientPool(session->jid()->index).unbind(session->jid()->index, session->connectionId()); } }
//----------------------------------------------------------------- void CometRecvStat::response(const RequestPtr& request, const SessionPtr& session) { //MCE_DEBUG("CometRecvStat::response --> connection:" // <<session->connectionId()); string strHostId = request->cookie("id"); int hostid = 0; string ticket = request->cookie("t"); string sessionid = request->cookie("wpsid"); string header; if(!strHostId.empty()){ try{ hostid = boost::lexical_cast<int>(strHostId); }catch(...){ MCE_WARN("CometRecvStat::response --> cast err, " << strHostId); } } /*if (kl != "") { size_t p = kl.find("_"); if (p != string::npos) { try { if(p+1 < kl.length()) { hostid = boost::lexical_cast<int>(kl.substr(p+1)); } } catch(std::exception& e) { MCE_WARN("CometResponseStat::response --> hostid not a int err:"<<e.what()); } } }*/ if (hostid<=0 || ticket == "") { deliver(session, 403, 0, false, false, "", "ERROR[403]: please login first"); changeStat(session, &ConnectingStat::instance()); return; } Ice::Long msgId = 0; try { msgId = boost::lexical_cast<Ice::Long>(request->getProperty("mid")); } catch(std::exception& e) { MCE_WARN("CometRecvStat::response --> cast mid err:"<<e.what()); } bool success = false; //if (!session->verify()) { try { bool needSetCookie = false; string domain = "wpi.renren.com"; if(request->host().find("kaixin") != string::npos){ domain = "wpi.kaixin.com"; } if(sessionid == "") { ostringstream os; os << "Set-Cookie: wpsid=" << session->connectionId() <<"; domain=."<<domain<<"; path=/\r\n"; header = os.str(); //用户刷新过程中,同一个sessionid可能连接到不同的接入端,导致用户状态不准,所以sessionid+serverid保证唯一 session->jid(hostid,session->connectionId()+Server::instance().getServerIndex()); needSetCookie = true; MCE_DEBUG("CometRecvStat::response --> sid absent, set cookie " << jidToString(session->jid())); } else { //////////// //added by yuanfei //new user, set a new session id Ice::Long sid = boost::lexical_cast<Ice::Long>(sessionid); sid += Server::instance().getServerIndex(); JidPtr jid = ClientPoolManager::instance().getClientPool(sid).getJid(sid); if(jid && jid->userId!=hostid) { ostringstream os; os << "Set-Cookie: wpsid=" << session->connectionId() <<"; domain=." << domain <<"; path=/\r\n"; header = os.str(); session->jid(hostid,session->connectionId()+Server::instance().getServerIndex()); needSetCookie = true; MCE_DEBUG("CometRecvStat::response --> sid present, userid incorrect, set cookie " << jidToString(session->jid())); } else { session->jid(hostid,sid); } } session->needUnbind(true); //MCE_INFO("ClientPool::bind --> " << jidToString(session->jid()) << ", ac_conn " << session->connectionId()); success = session->bind(ticket,true,false); if (success) { session->verify(true); session->isGzip(request->encoding()); //for new connection if(needSetCookie) { //MCE_DEBUG(); deliver(session, 200, 0, false, true, header,"<msglist><message type='system'><body>login successfully</body></message></msglist>"); changeStat(session,&ConnectingStat::instance()); return; } }else{ MCE_DEBUG("CometRecvStat::response --> verify failed, " << jidToString(session->jid())); deliver(session, 403, 0, false, false, "", "ERROR[403]: verify is false"); changeStat(session, &ConnectingStat::instance()); return; } } catch(Ice::Exception& e) { MCE_WARN("CometRecvStat::response -> failure binding, userid: " << hostid << ", " << e); deliver(session, 403, 0, false, false, "","ERROR[403]: userid bind err"); changeStat(session,&ConnectingStat::instance()); return; } //}else{ // success = session->bind(ticket, msgId==0, false); //} map<string,string> props = request->getProperties(); if (props.find("ins") != props.end()) { MCE_DEBUG("CometRecvStat::response --> do instant return " << jidToString(session->jid())); deliver( session, 200, 0, false, true, "", "<msglist><message type='system'><body>init ajax loop</body></message></msglist>"); changeStat(session, &ConnectingStat::instance()); return; } changeStat(session, &CometResponseStat::instance()); session->deliverNotify(msgId); }
//----------------------------------------------------------------- void ConnectingStat::recvRequest(const RequestPtr& request, const SessionPtr& session) { //MCE_INFO("Request URL:"<<request->path() << " conn:" // <<session->connectionId()); ostringstream os; os << "ConnectingStat::recvRequest --> url:" << request->path() << " connectionId:" << session->connectionId() << " type:"; map<string,ActionConfig>::iterator it = _config.find(request->path()); if (it != _config.end()) { os << it->second.type; // MCE_DEBUG("ConnectingStat::recvRequest --> line:"<<__LINE__); if (it->second.type == "comet_get") { changeStat(session, &CometRecvStat::instance()); } else if (it->second.type == "wap_comet_get") { //changeStat(session, &WapCometRecvStat::instance()); } else if (it->second.type == "comet_broadcast") { changeStat(session, &BroadcastResponseStat::instance()); } else if (it->second.type == "wap_comet_broadcast") { //changeStat(session, &WapBroadcastResponseStat::instance()); } else { changeStat(session, &DefaultResponseStat::instance()); } } else { MCE_WARN("ERROR[404]: unknowen url:" << request->path() << " " << request->referer()); deliver(session, 404, 0, false, false, "", "ERROR[404]:unknowen url"); } MCE_DEBUG(os.str()); }
void WapCometResponseStat::responseClose(const SessionPtr& session,int status_code,const string& msg) { MCE_DEBUG("WapCometResponseStat::responseClose --> connection:" <<session->connectionId()); deliver(session, status_code, 0, false, false, "",msg); }
//--------- void WapCometRecvStat::response(const RequestPtr& request, const SessionPtr& session) { MCE_DEBUG("WapCometRecvStat::response --> connection:" <<session->connectionId()); string sid = request->getProperty("sid"); string uid = request->getProperty("uid"); string pw = request->getProperty("pw"); MCE_INFO("@@WapCometRecvStat::response --> " << uid << " " << sid << " " << pw); if (uid.empty() || (sid.empty() && pw.empty())) { MCE_INFO("WapCometRecvStat::response --> parameters error"); deliver(session, 403, 0, false, false, "", "Authentication Error"); // changeStat(session, &ConnectingStat::instance()); return; } if (sid.empty()) { session->jid(boost::lexical_cast<int>(uid),session->connectionId() + Server::instance().getServerIndex()); } else { session->jid(boost::lexical_cast<int>(uid),boost::lexical_cast<Ice::Long>(sid) + Server::instance().getServerIndex()); } Ice::Long msgId = 0; try { msgId = boost::lexical_cast<Ice::Long>(request->getProperty("mid")); } catch(std::exception& e) { MCE_WARN("WapCometRecvStat::response --> cast mid err:"<<e.what()); } //一个比较特殊的处理,mid为-1时,用户立即下线 //考虑再增加一种请求类型 if(msgId == -1){ MCE_INFO("WapCometRecvStat::response --> offline now, " << jidToString(session->jid())); ClientPoolManager::instance().getClientPool(session->jid()->index).unbind(session->jid()->index, session->connectionId(), true); ConnectionStat::deliver(session, 200, 0, false, false, "", "offline now"); return; } // session->needUnbind(true); bool success = false; if(!pw.empty()){ success = session->bind(pw,msgId == 0,true); }else{ success = session->bind(sid,msgId == 0,true); } if(!success) { MCE_INFO("WapCometRecvStat::response --> bind error"); deliver(session, 403, 0, false, false, "", "Authentication Error or Session Expired"); changeStat(session, &ConnectingStat::instance()); return; } session->isGzip(request->encoding()); if(sid.empty()) { deliver(session, 200, 0, false, true, "",boost::lexical_cast<string>(session->connectionId())); changeStat(session,&ConnectingStat::instance()); return; } //MCE_DEBUG("WapCometRecvStat::response --> line:"<<__LINE__); changeStat(session, &WapCometResponseStat::instance()); //MCE_DEBUG("WapCometRecvStat::response --> line:"<<__LINE__); session->deliverNotify(msgId); //MCE_DEBUG("CometRecvStat::response --> line:"<<__LINE__); }