ANSC_STATUS HttpSpoDestroyPsoPool ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_PROXY_OBJECT pMyObject = (PHTTP_SIMPLE_PROXY_OBJECT )hThisObject; PHTTP_SIMPLE_PROXY_PROPERTY pProperty = (PHTTP_SIMPLE_PROXY_PROPERTY)&pMyObject->Property; PHTTP_PROXY_SESSION_OBJECT pSession = NULL; PSINGLE_LINK_ENTRY pSLinkEntry = NULL; AnscAcquireLock(&pMyObject->PsoSListLock); pSLinkEntry = AnscSListPopEntry(&pMyObject->PsoSList); while ( pSLinkEntry ) { pSession = ACCESS_HTTP_PROXY_SESSION_OBJECT(pSLinkEntry); pSLinkEntry = AnscSListPopEntry(&pMyObject->PsoSList); pSession->Remove((ANSC_HANDLE)pSession); } AnscReleaseLock(&pMyObject->PsoSListLock); return ANSC_STATUS_SUCCESS; }
ANSC_STATUS HttpSpoReleasePso ( ANSC_HANDLE hThisObject, ANSC_HANDLE hPso ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_PROXY_OBJECT pMyObject = (PHTTP_SIMPLE_PROXY_OBJECT )hThisObject; PHTTP_SIMPLE_PROXY_PROPERTY pProperty = (PHTTP_SIMPLE_PROXY_PROPERTY)&pMyObject->Property; PHTTP_PROXY_SESSION_OBJECT pSession = (PHTTP_PROXY_SESSION_OBJECT )hPso; pSession->Reset((ANSC_HANDLE)pSession); if ( pMyObject->ProxyMode & HTTP_SPO_MODE_COMPACT ) { pSession->Remove((ANSC_HANDLE)pSession); } else { AnscAcquireLock (&pMyObject->PsoSListLock); AnscSListPushEntry(&pMyObject->PsoSList, &pSession->Linkage); AnscReleaseLock (&pMyObject->PsoSListLock); } return ANSC_STATUS_SUCCESS; }
ANSC_STATUS HttpSpoManufacturePsoPool ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_PROXY_OBJECT pMyObject = (PHTTP_SIMPLE_PROXY_OBJECT )hThisObject; PHTTP_SIMPLE_PROXY_PROPERTY pProperty = (PHTTP_SIMPLE_PROXY_PROPERTY)&pMyObject->Property; PHTTP_PROXY_SESSION_OBJECT pSession = NULL; ULONG i = 0; if ( pMyObject->ProxyMode & HTTP_SPO_MODE_COMPACT ) { return ANSC_STATUS_SUCCESS; } for ( i = 0; i < HTTP_SPO_INITIAL_PSO_NUMBER; i++ ) { pSession = (PHTTP_PROXY_SESSION_OBJECT)HttpCreateProxySession ( pMyObject->hContainerContext, (ANSC_HANDLE)pMyObject, (ANSC_HANDLE)NULL ); if ( !pSession ) { continue; } else { pSession->SetClientSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL); pSession->SetServerSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL); pSession->SetSbcContext ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL); pSession->SetCbcContext ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL); } AnscAcquireLock (&pMyObject->PsoSListLock); AnscSListPushEntry(&pMyObject->PsoSList, &pSession->Linkage); AnscReleaseLock (&pMyObject->PsoSListLock); } return ANSC_STATUS_SUCCESS; }
ANSC_HANDLE HttpSpoAcquirePso ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_PROXY_OBJECT pMyObject = (PHTTP_SIMPLE_PROXY_OBJECT )hThisObject; PHTTP_SIMPLE_PROXY_PROPERTY pProperty = (PHTTP_SIMPLE_PROXY_PROPERTY)&pMyObject->Property; PHTTP_PROXY_SESSION_OBJECT pSession = NULL; PSINGLE_LINK_ENTRY pSLinkEntry = NULL; AnscAcquireLock(&pMyObject->PsoSListLock); pSLinkEntry = AnscSListPopEntry(&pMyObject->PsoSList); AnscReleaseLock(&pMyObject->PsoSListLock); if ( pSLinkEntry ) { pSession = ACCESS_HTTP_PROXY_SESSION_OBJECT(pSLinkEntry); return (ANSC_HANDLE)pSession; } pSession = (PHTTP_PROXY_SESSION_OBJECT)HttpCreateProxySession ( pMyObject->hContainerContext, (ANSC_HANDLE)pMyObject, (ANSC_HANDLE)NULL ); if ( !pSession ) { return (ANSC_HANDLE)NULL; } else { pSession->SetClientSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL); pSession->SetServerSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL); pSession->SetSbcContext ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL); pSession->SetCbcContext ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL); } return (ANSC_HANDLE)pSession; }
ANSC_STATUS HttpSpoPrvwoNotify ( ANSC_HANDLE hThisObject, ANSC_HANDLE hSocket, ULONG ulEvent, ANSC_HANDLE hReserved ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_PROXY_OBJECT pMyObject = (PHTTP_SIMPLE_PROXY_OBJECT )hThisObject; PHTTP_SIMPLE_PROXY_PROPERTY pProperty = (PHTTP_SIMPLE_PROXY_PROPERTY )&pMyObject->Property; PANSC_SIMPLE_PROXY_TCP_OBJECT pSimpleProxy = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy; PANSC_DAEMON_SOCKET_TCP_OBJECT pClientSocket = (PANSC_DAEMON_SOCKET_TCP_OBJECT)hSocket; PANSC_BROKER_SOCKET_TCP_OBJECT pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL; PANSC_BUFFER_DESCRIPTOR pBufferDesp = (PANSC_BUFFER_DESCRIPTOR )pClientSocket->GetBufferContext((ANSC_HANDLE)pClientSocket); PHTTP_PROXY_SESSION_OBJECT pSession = NULL; AnscTrace ( "Event = %d is indicated on client connection of %d.%d.%d.%d / TCP %d\n", ulEvent, pClientSocket->PeerAddress.Dot[0], pClientSocket->PeerAddress.Dot[1], pClientSocket->PeerAddress.Dot[2], pClientSocket->PeerAddress.Dot[3], pClientSocket->PeerPort ); switch ( ulEvent ) { case ANSC_SPTOWO_EVENT_SOCKET_ERROR : pClientSocket->ToClean((ANSC_HANDLE)pClientSocket, TRUE, HTTP_SPO_SOCKET_TTC); break; case ANSC_SPTOWO_EVENT_SOCKET_CLOSED : AnscAcquireLock(&pMyObject->SyncLock); pSession = (PHTTP_PROXY_SESSION_OBJECT)pClientSocket->GetClientContext((ANSC_HANDLE)pClientSocket); if ( !pSession ) { AnscReleaseLock(&pMyObject->SyncLock); pClientSocket->Finish((ANSC_HANDLE)pClientSocket); break; } else { pSession->AcquireAccess((ANSC_HANDLE)pSession); } AnscReleaseLock(&pMyObject->SyncLock); pBufferDesp->BlockSize += pClientSocket->RecvPacketSize; returnStatus = pClientSocket->SetBufferContext ( (ANSC_HANDLE)pClientSocket, NULL, 0, (ANSC_HANDLE)NULL ); returnStatus = pSession->FinishedByClient ( (ANSC_HANDLE)pSession, AnscBdoGetBlock (pBufferDesp), AnscBdoGetBlockSize(pBufferDesp), (ANSC_HANDLE)pBufferDesp ); pSession->ReleaseAccess((ANSC_HANDLE)pSession); pClientSocket->Finish((ANSC_HANDLE)pClientSocket); break; case ANSC_SPTOWO_EVENT_RESOURCES : break; case ANSC_SPTOWO_EVENT_TIME_OUT : break; default : break; } return ANSC_STATUS_SUCCESS; }
ANSC_STATUS HttpSpoPrvwoProcessSync ( ANSC_HANDLE hThisObject, ANSC_HANDLE hSocket, PVOID buffer, ULONG ulSize, ANSC_HANDLE hQueryContext ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_PROXY_OBJECT pMyObject = (PHTTP_SIMPLE_PROXY_OBJECT )hThisObject; PHTTP_SIMPLE_PROXY_PROPERTY pProperty = (PHTTP_SIMPLE_PROXY_PROPERTY )&pMyObject->Property; PANSC_SIMPLE_PROXY_TCP_OBJECT pSimpleProxy = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy; PHTTP_SBC_INTERFACE pSbcIf = (PHTTP_SBC_INTERFACE )pMyObject->hSbcIf; PANSC_DAEMON_SOCKET_TCP_OBJECT pClientSocket = (PANSC_DAEMON_SOCKET_TCP_OBJECT)hSocket; PANSC_BROKER_SOCKET_TCP_OBJECT pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL; PANSC_BUFFER_DESCRIPTOR pBufferDesp = (PANSC_BUFFER_DESCRIPTOR )pClientSocket->GetBufferContext((ANSC_HANDLE)pClientSocket); PHTTP_PROXY_SESSION_OBJECT pSession = NULL; ULONG ulPsoQmode = (ULONG)hQueryContext; BOOL bFinishSocket = FALSE; AnscAcquireLock(&pMyObject->SyncLock); pSession = (PHTTP_PROXY_SESSION_OBJECT)pClientSocket->GetClientContext((ANSC_HANDLE)pClientSocket); if ( !pSession ) { AnscReleaseLock(&pMyObject->SyncLock); pClientSocket->Finish((ANSC_HANDLE)pClientSocket); return ANSC_STATUS_SUCCESS; } else { pSession->AcquireAccess((ANSC_HANDLE)pSession); } AnscReleaseLock(&pMyObject->SyncLock); switch ( ulPsoQmode ) { case HTTP_PSO_QMODE_FORWARD : pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)pSession->GetServerSocket((ANSC_HANDLE)pSession); if ( !pServerSocket) { bFinishSocket = TRUE; returnStatus = ANSC_STATUS_INTERNAL_ERROR; break; } else { returnStatus = pServerSocket->Send ( (ANSC_HANDLE)pServerSocket, buffer, ulSize, (ANSC_HANDLE)NULL ); } pBufferDesp->BlockSize = 0; break; case HTTP_PSO_QMODE_PROCESS : pClientSocket->SetBufferContext ( (ANSC_HANDLE)pClientSocket, NULL, 0, (ANSC_HANDLE)NULL ); returnStatus = pSession->RecvFromClient ( (ANSC_HANDLE)pSession, buffer, ulSize, (ANSC_HANDLE)pBufferDesp ); if ( pSession->GetSessionState((ANSC_HANDLE)pSession) == HTTP_PSO_STATE_FINISHED ) { bFinishSocket = TRUE; break; } break; default : returnStatus = ANSC_STATUS_UNAPPLICABLE; break; } pSession->ReleaseAccess((ANSC_HANDLE)pSession); if ( bFinishSocket ) { pClientSocket->Finish((ANSC_HANDLE)pClientSocket); } return returnStatus; }
ULONG HttpSpoPrvwoQuery ( ANSC_HANDLE hThisObject, ANSC_HANDLE hSocket, PVOID buffer, ULONG ulSize, PANSC_HANDLE phQueryContext ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_PROXY_OBJECT pMyObject = (PHTTP_SIMPLE_PROXY_OBJECT )hThisObject; PHTTP_SIMPLE_PROXY_PROPERTY pProperty = (PHTTP_SIMPLE_PROXY_PROPERTY )&pMyObject->Property; PANSC_SIMPLE_PROXY_TCP_OBJECT pSimpleProxy = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy; PANSC_DAEMON_SOCKET_TCP_OBJECT pClientSocket = (PANSC_DAEMON_SOCKET_TCP_OBJECT)hSocket; PANSC_BROKER_SOCKET_TCP_OBJECT pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL; PANSC_BUFFER_DESCRIPTOR pBufferDesp = (PANSC_BUFFER_DESCRIPTOR )pClientSocket->GetBufferContext((ANSC_HANDLE)pClientSocket); PHTTP_PROXY_SESSION_OBJECT pSession = NULL; ULONG ulSptoPmode = ANSC_SPTOWO_PMODE_PROCESS_SYNC; ULONG ulPsoQmode = HTTP_PSO_QMODE_PROCESS; AnscAcquireLock(&pMyObject->SyncLock); pSession = (PHTTP_PROXY_SESSION_OBJECT)pClientSocket->GetClientContext((ANSC_HANDLE)pClientSocket); if ( !pSession ) { AnscReleaseLock(&pMyObject->SyncLock); return ANSC_SPTOWO_PMODE_FINISH; } else { pSession->AcquireAccess((ANSC_HANDLE)pSession); } AnscReleaseLock(&pMyObject->SyncLock); pBufferDesp->BlockSize += ulSize; ulPsoQmode = pSession->QueryForClient ( (ANSC_HANDLE)pSession, buffer, ulSize, (ANSC_HANDLE)pBufferDesp ); switch ( ulPsoQmode ) { case HTTP_PSO_QMODE_COLLECT : pBufferDesp->BlockSize -= ulSize; ulSptoPmode = ANSC_SPTOWO_PMODE_COLLECT; break; case HTTP_PSO_QMODE_FORWARD : case HTTP_PSO_QMODE_PROCESS : ulSptoPmode = ANSC_SPTOWO_PMODE_PROCESS_SYNC; break; default : ulSptoPmode = ANSC_SPTOWO_PMODE_FINISH; break; } *phQueryContext = (ANSC_HANDLE)ulPsoQmode; pSession->ReleaseAccess((ANSC_HANDLE)pSession); return ulSptoPmode; }
ANSC_STATUS HttpSpoPrvwoRemove ( ANSC_HANDLE hThisObject, ANSC_HANDLE hSocket ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_PROXY_OBJECT pMyObject = (PHTTP_SIMPLE_PROXY_OBJECT )hThisObject; PHTTP_SIMPLE_PROXY_PROPERTY pProperty = (PHTTP_SIMPLE_PROXY_PROPERTY )&pMyObject->Property; PANSC_SIMPLE_PROXY_TCP_OBJECT pSimpleProxy = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy; PHTTP_WAM_INTERFACE pWamIf = (PHTTP_WAM_INTERFACE )pMyObject->hWamIf; PANSC_DAEMON_SOCKET_TCP_OBJECT pClientSocket = (PANSC_DAEMON_SOCKET_TCP_OBJECT)hSocket; PANSC_BROKER_SOCKET_TCP_OBJECT pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL; PANSC_BUFFER_DESCRIPTOR pBufferDesp = (PANSC_BUFFER_DESCRIPTOR )pClientSocket->GetBufferContext((ANSC_HANDLE)pClientSocket); PHTTP_PROXY_SESSION_OBJECT pSession = NULL; AnscTrace ( "PrvwoRemove removes the client connection of %d.%d.%d.%d / TCP %d\n", pClientSocket->PeerAddress.Dot[0], pClientSocket->PeerAddress.Dot[1], pClientSocket->PeerAddress.Dot[2], pClientSocket->PeerAddress.Dot[3], pClientSocket->PeerPort ); AnscAcquireLock(&pMyObject->SyncLock); pSession = (PHTTP_PROXY_SESSION_OBJECT)pClientSocket->GetClientContext((ANSC_HANDLE)pClientSocket); if ( pSession ) { pSession->AcquireAccess((ANSC_HANDLE)pSession); pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)pSession->GetServerSocket((ANSC_HANDLE)pSession); } else { pServerSocket = NULL; } if ( pServerSocket ) { pServerSocket->SetClientContext((ANSC_HANDLE)pServerSocket, (ANSC_HANDLE)NULL ); pServerSocket->ToClean ((ANSC_HANDLE)pServerSocket, TRUE, HTTP_SPO_SOCKET_TTC); } AnscReleaseLock(&pMyObject->SyncLock); /* * Just a couple regular clean-up tasks to do: * * (1) dis-associate the proxy session object from the client socket * (2) clean the foreign buffer associated with the client socket * (3) dis-associate the proxy session object from the server socket * * Note that we CANNOT clean the foreign buffer associated with the server socket because the * access to that buffer is NOT synchornized between the prv_recv() and pub_recv routines. It * SHOULD be done in the pub_remove() function. */ pClientSocket->SetClientContext((ANSC_HANDLE)pClientSocket, (ANSC_HANDLE)NULL); pClientSocket->SetBufferContext((ANSC_HANDLE)pClientSocket, NULL, 0, (ANSC_HANDLE)NULL); if ( pBufferDesp ) { AnscFreeBdo((ANSC_HANDLE)pBufferDesp); } if ( !pSession ) { return ANSC_STATUS_SUCCESS; } pSession->ReleaseAccess((ANSC_HANDLE)pSession); pSession->Close ((ANSC_HANDLE)pSession); pSession->Return ((ANSC_HANDLE)pSession); return ANSC_STATUS_SUCCESS; }
BOOL HttpSpoPrvwoAccept ( ANSC_HANDLE hThisObject, ANSC_HANDLE hSocket, PANSC_HANDLE phClientContext ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_PROXY_OBJECT pMyObject = (PHTTP_SIMPLE_PROXY_OBJECT )hThisObject; PHTTP_SIMPLE_PROXY_PROPERTY pProperty = (PHTTP_SIMPLE_PROXY_PROPERTY )&pMyObject->Property; PANSC_SIMPLE_PROXY_TCP_OBJECT pSimpleProxy = (PANSC_SIMPLE_PROXY_TCP_OBJECT )pMyObject->hSimpleProxy; PHTTP_WAM_INTERFACE pWamIf = (PHTTP_WAM_INTERFACE )pMyObject->hWamIf; PHTTP_SBC_INTERFACE pSbcIf = (PHTTP_SBC_INTERFACE )pMyObject->hSbcIf; PHTTP_CBC_INTERFACE pCbcIf = (PHTTP_CBC_INTERFACE )pMyObject->hCbcIf; PHTTP_PBC_INTERFACE pPbcIf = (PHTTP_PBC_INTERFACE )pMyObject->hPbcIf; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PANSC_DAEMON_SOCKET_TCP_OBJECT pClientSocket = (PANSC_DAEMON_SOCKET_TCP_OBJECT)hSocket; PANSC_BROKER_SOCKET_TCP_OBJECT pServerSocket = (PANSC_BROKER_SOCKET_TCP_OBJECT)NULL; PHTTP_PROXY_SESSION_OBJECT pSession = (PHTTP_PROXY_SESSION_OBJECT )pMyObject->AcquirePso((ANSC_HANDLE)pMyObject); PANSC_BUFFER_DESCRIPTOR pBufferDesp = NULL; AnscTrace ( "PrvwoAccept accepts a new client connection from %d.%d.%d.%d / TCP %d\n", pClientSocket->PeerAddress.Dot[0], pClientSocket->PeerAddress.Dot[1], pClientSocket->PeerAddress.Dot[2], pClientSocket->PeerAddress.Dot[3], pClientSocket->PeerPort ); *phClientContext = (ANSC_HANDLE)NULL; /* * This routine is called when there's a new incoming connection (i.e., requested by the HTTP * client) is to be established. Following are the processing procedures applied: * * (1) create a new HTTP Proxy Session Object for the connection * (2) call sbc_connect(), the Server Behavior Controller either denies the * connection or allows it. * (3) create buffer_descriptor object and associate it with the socket object */ if ( !pSession ) { return FALSE; } else { pSession->SetWamIf ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pWamIf ); pSession->SetSbcIf ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pSbcIf ); pSession->SetCbcIf ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pCbcIf ); pSession->SetPbcIf ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pPbcIf ); pSession->SetHfpIf ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pHfpIf ); pSession->SetClientSocket((ANSC_HANDLE)pSession, (ANSC_HANDLE)pClientSocket); } if ( !pSession->AcceptClient ( (ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL ) ) { pSession->Return((ANSC_HANDLE)pSession); return FALSE; } else { pSession->SetSessionState((ANSC_HANDLE)pSession, HTTP_PSO_STATE_CLIENT_CONNECTED); pSession->Open ((ANSC_HANDLE)pSession); } pBufferDesp = (PANSC_BUFFER_DESCRIPTOR)AnscAllocateBdo ( HTTP_SPO_MAX_MESSAGE_SIZE, 0, 0 ); if ( pBufferDesp ) { pClientSocket->SetBufferContext ( (ANSC_HANDLE)pClientSocket, AnscBdoGetEndOfBlock(pBufferDesp), AnscBdoGetLeftSize (pBufferDesp), (ANSC_HANDLE)pBufferDesp ); } *phClientContext = (ANSC_HANDLE)pSession; return TRUE; }