CErrno NetHandlerHttpServer::OnMsgRecving(const char * pBuf , UINT32 unSize)
	{
		INT32 remaineLen = unSize;
		HttpProtocol objRequest;
		while(remaineLen > 0)
		{
			if(objRequest.Parse(&pBuf[unSize - remaineLen],remaineLen,&remaineLen))
			{
				HttpProtocol response;
				CErrno result = m_pServer->HttpHandler((HttpSession *)m_pSession, objRequest, response);
				if (!result.IsSuccess())
				{
					if (result.GetCode() == CErrno::ERR_INVALID_DATA)
					{
						return CErrno::Success();
					}
					return CErrno::Failure();
				}
				objRequest.Clear();
				Send(response);
			}
			else
			{
				break;
			}
		}

		return CErrno::Success();
	}
	CErrno HttpServer::Init(const char * pAddress , INT32 nPort , BOOL bResueAddr /*= TRUE */, INT32 nListenerCount /*= DEFAULT_LISTENER_COUNT*/)
	{
		CErrno err;
		if (m_pListener == NULL)
		{
			m_pListener = HttpServerListenerPtr(new HttpServerListener(this , m_pNetReactor , new ServerSession(pAddress , nPort , "")));
			err = m_pListener->Init(pAddress , nPort , bResueAddr , nListenerCount);

			if (err.IsSuccess())
			{
				m_pListener->GetSession()->SetClosed(FALSE);
				m_pNetReactor->AddNetHandler(m_pListener , NET_FUNC_ACCEPT_DEFAULT);
			}
		}
		return err;
	}
Esempio n. 3
0
	CErrno NetThread::DeliverMsg()
	{
		CErrno err;
		const INetReactor::CollectNetHandlersT mapHandlers = m_pNetReactor->GetNetHandlers();
		INetReactor::CollectNetHandlersT::const_iterator iter = mapHandlers.begin();
		for (; iter != mapHandlers.end(); ++iter)
		{
			const INetHandlerPtr pHandler = iter->second;
			if (pHandler)
			{
				if (pHandler->DeliverMsg().IsFailure() && err.IsSuccess())
				{
					err = CErrno::Failure();
				}
			}
		}
		return err;
	}
Esempio n. 4
0
	INT32 NetThread::InternalUpdate(void * pArg)
	{
		CErrno err;
		NetThread * pThread = (NetThread *)pArg;
		if (pThread)
		{
			pThread->FetchClientsQueue();

			pThread->UpdateHandlers();

			err = pThread->DeliverMsg();

			if (pThread->GetNetReactor())
			{
				if (pThread->GetNetReactor()->Update().IsSuccess() && err.IsSuccess())
				{
					err = CErrno::Failure();
				}
			}
		}
		return err.IsSuccess();
	}