void ClientPool::pushMsg(Ice::Long sessionId, const MessagePtr& msg) { Ice::Long connid = 0; { IceUtil::Mutex::Lock lock(_mutex); map<Ice::Long,ClientBufferPtr>::iterator it = _clients.find(sessionId); if (it != _clients.end()) { it->second->pushMsg(msg); connid = it->second->activeConnection(); } } //connid may be changed here by other thread, but it does't matter. //messages are cleared according mid in next request. if this deliver is failed, the mid will not be updated. if (connid) { SessionPtr s = Server::instance().getSession(connid); if (s) { s->deliverNotify(0); } } }
//----------------------------------------------------------------- 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 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__); }