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; }
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; }
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(); }