Пример #1
0
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);
		}
	}
}
Пример #2
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);
}
Пример #3
0
//---------
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__);
}