ANSC_STATUS WebSsoRegisterMdhIf ( ANSC_HANDLE hThisObject, PUCHAR pRequestUri, ANSC_HANDLE hMdhIf ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PWEB_SIMPLE_SERVER_OBJECT pMyObject = (PWEB_SIMPLE_SERVER_OBJECT)hThisObject; PHTTP_FUM_INTERFACE pFumIf = (PHTTP_FUM_INTERFACE )pMyObject->hFumIf; PHTTP_FUM_ENTITY pEntity = NULL; if ( (ANSC_HANDLE)NULL == pFumIf->GetMdhIf(pFumIf->hOwnerContext, pRequestUri) ) { HttpFumEntityAlloc(pEntity, pRequestUri, hMdhIf); if ( !pEntity ) { returnStatus = ANSC_STATUS_RESOURCES; } else { AnscAcquireLock(&pMyObject->MdhSListLock); AnscSListPushEntry(&pMyObject->MdhSList, &pEntity->Linkage); AnscReleaseLock(&pMyObject->MdhSListLock); } } return returnStatus; }
ANSC_STATUS BbhmDiagipAddEchoEntry ( ANSC_HANDLE hThisObject, USHORT SeqNumber, ULONG StartTime ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PBBHM_DIAG_IP_PING_OBJECT pMyObject = (PBBHM_DIAG_IP_PING_OBJECT )hThisObject; PBBHM_IP_PING_PROPERTY pProperty = (PBBHM_IP_PING_PROPERTY )&pMyObject->Property; PBBHM_IP_PING_TDO_OBJECT pStateTimer = (PBBHM_IP_PING_TDO_OBJECT )pMyObject->hStateTimer; PBBHM_IP_PING_SINK_OBJECT pSink = (PBBHM_IP_PING_SINK_OBJECT )pMyObject->hSinkObject; PSINGLE_LINK_ENTRY pSLinkEntry = NULL; PBBHM_IP_PING_ECHO_ENTRY pEchoEntry = NULL; ULONG ulHashIndex = SeqNumber % MAX_ECHO_TABLE_SIZE; pEchoEntry = (PBBHM_IP_PING_ECHO_ENTRY)AnscAllocateMemory(sizeof(BBHM_IP_PING_ECHO_ENTRY)); if ( !pEchoEntry ) { return ANSC_STATUS_FAILURE; } pEchoEntry->SeqId = SeqNumber; pEchoEntry->StartTime = StartTime; pEchoEntry->StopTime = 0; AnscAcquireLock(&pMyObject->EchoTableLock); AnscSListPushEntry(&pMyObject->EchoTable[ulHashIndex], &pEchoEntry->Linkage); AnscReleaseLock(&pMyObject->EchoTableLock); return returnStatus; }
ANSC_HANDLE BspTemplateRuntimeAcquireVariable ( ANSC_HANDLE hThisObject ) { PBSP_TEMPLATE_RUNTIME_OBJECT pMyObject = (PBSP_TEMPLATE_RUNTIME_OBJECT)hThisObject; PSINGLE_LINK_ENTRY pEntry = NULL; PBSP_TEMPLATE_VAR_POOL_ITEM pVarItem; PBSP_TEMPLATE_VAR_OBJECT pVar = NULL; /* search available variable object */ pEntry = AnscSListGetFirstEntry(&pMyObject->VariablePool); while (pEntry) { pVarItem = ACCESS_BSP_TEMPLATE_VAR_POOL_ITEM(pEntry); pVar = pVarItem->pVar; if (!pVarItem->bInUse) { pVarItem->bInUse = TRUE; break; } pEntry = AnscSListGetNextEntry(pEntry); } if (!pEntry) { pVarItem = (PBSP_TEMPLATE_VAR_POOL_ITEM)AnscAllocateMemory(sizeof(BSP_TEMPLATE_VAR_POOL_ITEM)); pVar = (PBSP_TEMPLATE_VAR_OBJECT)CreateBspEngVarComponent(NULL, (ANSC_HANDLE)pMyObject, NULL); if (pVar && pVarItem) { pVarItem->pVar = pVar; pVarItem->bInUse = TRUE; AnscSListPushEntry(&pMyObject->VariablePool, &pVarItem->Linkage); } else { if (pVarItem) { AnscFreeMemory(pVarItem); } if (pVar) { pVar->Remove((ANSC_HANDLE)pVar); } pVarItem = NULL; pVar = NULL; } } return (ANSC_HANDLE)pVar; }
ANSC_STATUS HttpSpoReleaseBmoRep ( ANSC_HANDLE hThisObject, ANSC_HANDLE hBmoRep ) { 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_BMO_REP_OBJECT pBmoRep = (PHTTP_BMO_REP_OBJECT )hBmoRep; pBmoRep->Reset((ANSC_HANDLE)pBmoRep); if ( pMyObject->ProxyMode & HTTP_SPO_MODE_COMPACT ) { pBmoRep->Remove((ANSC_HANDLE)pBmoRep); } else { AnscAcquireLock (&pMyObject->BmoRepSListLock); AnscSListPushEntry(&pMyObject->BmoRepSList, &pBmoRep->Linkage); AnscReleaseLock (&pMyObject->BmoRepSListLock); } 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 BwrmPmoAddPage ( ANSC_HANDLE hThisObject, char* root_path, char* file_path, ANSC_HANDLE hCookedPage ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PBWRM_PAGE_MANAGER_OBJECT pMyObject = (PBWRM_PAGE_MANAGER_OBJECT )hThisObject; PBWRM_PAGE_MANAGER_PROPERTY pProperty = (PBWRM_PAGE_MANAGER_PROPERTY )&pMyObject->Property; PANSC_TIMER_DESCRIPTOR_OBJECT pCacheTimerObject = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hCacheTimerObject; PBWRM_COOKED_PAGE_OBJECT pCookedPage = (PBWRM_COOKED_PAGE_OBJECT )hCookedPage; ULONG ulHashIndex = (ULONG )AnscHashString(file_path, AnscSizeOfString(file_path), BWRM_PMO_CPO_TABLE_SIZE); ULONG ulPageCount = 0; ULONG ulCurTime = AnscGetTickInSeconds(); pMyObject->Timestamp = ulCurTime; pCookedPage->SetRootPath ((ANSC_HANDLE)pCookedPage, root_path); pCookedPage->SetPagePath ((ANSC_HANDLE)pCookedPage, file_path); pCookedPage->SetTimestamp((ANSC_HANDLE)pCookedPage, ulCurTime); pCookedPage->IncRefCount ((ANSC_HANDLE)pCookedPage ); AnscAcquireLock (&pMyObject->CpoTableLock); AnscSListPushEntry(&pMyObject->CpoTable[ulHashIndex], &pCookedPage->Linkage); AnscReleaseLock (&pMyObject->CpoTableLock); if ( TRUE ) { ulPageCount = pMyObject->GetPageCount((ANSC_HANDLE)pMyObject); if ( ulPageCount == 1 ) { pCacheTimerObject->Start((ANSC_HANDLE)pCacheTimerObject); } else if ( ulPageCount > pProperty->CacheEntryCount ) { pCookedPage = (PBWRM_COOKED_PAGE_OBJECT)pMyObject->GetOldestPage((ANSC_HANDLE)pMyObject); if ( pCookedPage && 0 == pCookedPage->GetRefCount((ANSC_HANDLE)pCookedPage) ) { returnStatus = pMyObject->DelPage ( (ANSC_HANDLE)pMyObject, pCookedPage->GetRootPath((ANSC_HANDLE)pCookedPage), pCookedPage->GetPagePath((ANSC_HANDLE)pCookedPage) ); } } } return ANSC_STATUS_SUCCESS; }
ANSC_HANDLE HttpPsoVer2AddNewTro ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_PSO_VER2_OBJECT pMyObject = (PHTTP_PSO_VER2_OBJECT )hThisObject; PHTTP_ADVANCED_PROXY_OBJECT pAdvancedProxy = (PHTTP_ADVANCED_PROXY_OBJECT )pMyObject->hOwnerContext; 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)pMyObject->hClientSocket; PHTTP_TRANS_RECORD_OBJECT pTransRecord = NULL; pTransRecord = (PHTTP_TRANS_RECORD_OBJECT)pAdvancedProxy->AcquireTro((ANSC_HANDLE)pAdvancedProxy); if ( !pTransRecord ) { return (ANSC_HANDLE)NULL; } else { pTransRecord->SetWamIf ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pWamIf ); pTransRecord->SetSbcIf ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pSbcIf ); pTransRecord->SetCbcIf ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pCbcIf ); pTransRecord->SetPbcIf ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pPbcIf ); pTransRecord->SetHfpIf ((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pHfpIf ); pTransRecord->SetClientSocket((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)pClientSocket ); pTransRecord->SetServerSocket((ANSC_HANDLE)pTransRecord, (ANSC_HANDLE)NULL ); pTransRecord->SetTransState ((ANSC_HANDLE)pTransRecord, HTTP_TRO_STATE_CLIENT_CONNECTED); pTransRecord->Open ((ANSC_HANDLE)pTransRecord); } AnscAcquireLock(&pMyObject->TroSListLock); AnscSListPushEntry(&pMyObject->TroSList, &pTransRecord->Linkage); pTransRecord->AcquireAccess((ANSC_HANDLE)pTransRecord); AnscReleaseLock(&pMyObject->TroSListLock); return (ANSC_HANDLE)pTransRecord; }
ANSC_STATUS HttpSpoManufactureBmoRepPool ( 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_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PHTTP_BMO_REP_OBJECT pBmoRep = NULL; ULONG i = 0; if ( pMyObject->ProxyMode & HTTP_SPO_MODE_COMPACT ) { return ANSC_STATUS_SUCCESS; } for ( i = 0; i < HTTP_SPO_INITIAL_BMO_NUMBER; i++ ) { pBmoRep = (PHTTP_BMO_REP_OBJECT)HttpCreateBmoRep ( pMyObject->hContainerContext, (ANSC_HANDLE)pMyObject, (ANSC_HANDLE)NULL ); if ( !pBmoRep ) { continue; } else { pBmoRep->SetHfpIf ((ANSC_HANDLE)pBmoRep, (ANSC_HANDLE)pHfpIf); pBmoRep->SetRecvContext((ANSC_HANDLE)pBmoRep, (ANSC_HANDLE)NULL ); pBmoRep->SetSendContext((ANSC_HANDLE)pBmoRep, (ANSC_HANDLE)NULL ); } AnscAcquireLock (&pMyObject->BmoRepSListLock); AnscSListPushEntry(&pMyObject->BmoRepSList, &pBmoRep->Linkage); AnscReleaseLock (&pMyObject->BmoRepSListLock); } 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; }
/********************************************************************** caller: owner of this object prototype: void AnscAsn1AddAttribute ( ANSC_HANDLE hThisObject, PANSC_ATTR_OBJECT pAttrObject, BOOLEAN bAppend ); description: This function add a new attribute object. argument: ANSC_HANDLE hThisObject This handle is actually the pointer of this object itself. PANSC_ATTR_OBJECT pAttrObject, The new attribute object will be added; BOOLEAN bAppend Add to the first or append at the last return: the first encoding octet; **********************************************************************/ void AnscAsn1AddAttribute ( ANSC_HANDLE hThisObject, PANSC_ATTR_OBJECT pAttrObject, BOOLEAN bAppend ) { PANSC_ASN1_OBJECT pMyObject = (PANSC_ASN1_OBJECT)hThisObject; #if 0 PANSC_ATTR_OBJECT pAttr; PSINGLE_LINK_ENTRY pSListEntry; #endif if( hThisObject == NULL || pAttrObject == NULL) { return; } if( bAppend) { AnscSListPushEntryAtBack(&pMyObject->sAttrList, &pAttrObject->Linkage); } else { #if 0 /* * Check if this attribute already exists, ignore the new one. */ pSListEntry = AnscSListGetFirstEntry(&pMyObject->sAttrList); if( pSListEntry != NULL) { pAttr = ACCESS_ANSC_ATTR_OBJECT(pSListEntry); if( pAttrObject->EqualsTo(pAttrObject, pAttr)) { return; } } #endif AnscSListPushEntry(&pMyObject->sAttrList, &pAttrObject->Linkage); } }
ANSC_HANDLE HttpWcsoAddNewWcto ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_WEBC_SESSION_OBJECT pMyObject = (PHTTP_WEBC_SESSION_OBJECT )hThisObject; PHTTP_WEBC_SESSION_PROPERTY pProperty = (PHTTP_WEBC_SESSION_PROPERTY )&pMyObject->Property; PHTTP_SIMPLE_CLIENT_OBJECT pSimpleClient = (PHTTP_SIMPLE_CLIENT_OBJECT )pMyObject->hOwnerContext; PANSC_SIMPLE_CLIENT_TCP_OBJECT pTcpSimpleClient = (PANSC_SIMPLE_CLIENT_TCP_OBJECT)pMyObject->hTcpSimpleClient; PHTTP_BSP_INTERFACE pBspIf = (PHTTP_BSP_INTERFACE )pMyObject->hBspIf; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PHTTP_WEBC_TRANS_OBJECT pWebcTrans = NULL; pWebcTrans = (PHTTP_WEBC_TRANS_OBJECT)pSimpleClient->AcquireWcto((ANSC_HANDLE)pSimpleClient); if ( !pWebcTrans ) { return (ANSC_HANDLE)NULL; } else { pWebcTrans->SetBspIf ((ANSC_HANDLE)pWebcTrans, (ANSC_HANDLE)pBspIf ); pWebcTrans->SetHfpIf ((ANSC_HANDLE)pWebcTrans, (ANSC_HANDLE)pHfpIf ); pWebcTrans->SetWebcSession ((ANSC_HANDLE)pWebcTrans, (ANSC_HANDLE)pMyObject ); pWebcTrans->SetTcpSimpleClient((ANSC_HANDLE)pWebcTrans, (ANSC_HANDLE)pTcpSimpleClient); pWebcTrans->SetTransState ((ANSC_HANDLE)pWebcTrans, HTTP_WCTO_STATE_INITIALIZED ); pWebcTrans->Open ((ANSC_HANDLE)pWebcTrans); } AnscAcquireLock(&pMyObject->WctoSListLock); AnscSListPushEntry(&pMyObject->WctoSList, &pWebcTrans->Linkage); pWebcTrans->AcquireAccess((ANSC_HANDLE)pWebcTrans); AnscReleaseLock(&pMyObject->WctoSListLock); return (ANSC_HANDLE)pWebcTrans; }
ANSC_HANDLE HttpScoAddWcso ( ANSC_HANDLE hThisObject, char* host, USHORT port, ANSC_HANDLE hReqContext, BOOL bUseTls ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_CLIENT_OBJECT pMyObject = (PHTTP_SIMPLE_CLIENT_OBJECT )hThisObject; PHTTP_SIMPLE_CLIENT_PROPERTY pProperty = (PHTTP_SIMPLE_CLIENT_PROPERTY)&pMyObject->Property; PHTTP_BSP_INTERFACE pBspIf = (PHTTP_BSP_INTERFACE )pMyObject->hBspIf; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PHTTP_WEBC_SESSION_OBJECT pWebcSession = (PHTTP_WEBC_SESSION_OBJECT )pMyObject->AcquireWcso((ANSC_HANDLE)pMyObject); ULONG ulHashIndex = AnscHashString2(host, AnscSizeOfString(host), HTTP_SCO_WCSO_TABLE_SIZE); if ( !pWebcSession ) { AnscTrace("HttpScoAddWcso - can't acquire web client session object!\n"); return (ANSC_HANDLE)NULL; } else { ULONG ulWebcSessionMode = bUseTls? HTTP_WCSO_FLAG_tlsEnabled : 0; if ( pMyObject->ClientMode & HTTP_SCO_MODE_XSOCKET ) { ulWebcSessionMode |= HTTP_WCSO_FLAG_xsocketEnabled; } if ( pMyObject->ClientMode & HTTP_SCO_MODE_NOTIFY_ON_ALL_CONN_ONCE ) { ulWebcSessionMode |= HTTP_WCSO_FLAG_BspNotifyOnAllConnOnce; } pWebcSession->hBspReqContext = hReqContext; pWebcSession->Timestamp = AnscGetTickInSeconds(); pWebcSession->HashIndex = ulHashIndex; pWebcSession->SetPeerName ((ANSC_HANDLE)pWebcSession, host ); pWebcSession->SetPeerPort ((ANSC_HANDLE)pWebcSession, port ); pWebcSession->SetHostPort ((ANSC_HANDLE)pWebcSession, 0 ); pWebcSession->SetSessionFlags((ANSC_HANDLE)pWebcSession, ulWebcSessionMode ); pWebcSession->SetBspIf ((ANSC_HANDLE)pWebcSession, (ANSC_HANDLE)pBspIf); pWebcSession->SetHfpIf ((ANSC_HANDLE)pWebcSession, (ANSC_HANDLE)pHfpIf); } returnStatus = pWebcSession->Open((ANSC_HANDLE)pWebcSession); if ( returnStatus != ANSC_STATUS_SUCCESS ) { pWebcSession->Return((ANSC_HANDLE)pWebcSession); return (ANSC_HANDLE)NULL; } AnscAcquireLock (&pMyObject->WcsoTableLock); AnscSListPushEntry(&pMyObject->WcsoTable[ulHashIndex], &pWebcSession->Linkage); pWebcSession->AcquireAccess((ANSC_HANDLE)pWebcSession); AnscReleaseLock (&pMyObject->WcsoTableLock); return (ANSC_HANDLE)pWebcSession; }
ANSC_STATUS HttpAuthcoAddAuthInfo ( ANSC_HANDLE hThisObject, ANSC_HANDLE hRequest, ANSC_HANDLE hChallenge ) { ANSC_STATUS status = ANSC_STATUS_SUCCESS; PHTTP_AUTH_CLIENT_OBJECT pMyObject = (PHTTP_AUTH_CLIENT_OBJECT)hThisObject; PHTTP_BMO_REQ_OBJECT pRequest = (PHTTP_BMO_REQ_OBJECT )hRequest; PHTTP_AUTH_CHALLENGE pChallenge = (PHTTP_AUTH_CHALLENGE )hChallenge; PHTTP_AUTHO_INFO pAuthInfo = NULL; PHTTP_AUTHO_DIGEST_INFO pDigestInfo = NULL; PHTTP_ACM_INTERFACE pHttpAcmIf = (PHTTP_ACM_INTERFACE )pMyObject->hAcmIf; BOOL bDigestAuth = (pChallenge->AuthType == HTTP_AUTH_TYPE_DIGEST); PUCHAR pHostName = NULL; PUCHAR pUriPath = NULL; USHORT HostPort = 0; BOOL bParentUri = FALSE; if ( !pHttpAcmIf ) { return ANSC_STATUS_INTERNAL_ERROR; } status = pMyObject->GetRequestHostUri((ANSC_HANDLE)pMyObject, hRequest, &pHostName, &HostPort, &pUriPath); if ( status != ANSC_STATUS_SUCCESS ) { status = ANSC_STATUS_INTERNAL_ERROR; goto ABNORM; } AnscAcquireLock(&pMyObject->AuthInfoListLock); pAuthInfo = (PHTTP_AUTHO_INFO)pMyObject->FindAuthInfo2((ANSC_HANDLE)pMyObject, hRequest, &bParentUri); if ( pAuthInfo ) { AnscSListPopEntryByLink(&pMyObject->AuthInfoList, &pAuthInfo->Linkage); HttpAuthInfoRemove(pAuthInfo); pAuthInfo = NULL; } HttpAuthInfoCreate(pAuthInfo); if ( !pAuthInfo ) { status = ANSC_STATUS_RESOURCES; goto EXIT; } if ( bDigestAuth ) { HttpAuthDigestInfoCreate(pAuthInfo->pDigest); if ( !pAuthInfo->pDigest ) { status = ANSC_STATUS_RESOURCES; goto EXIT; } } /* set up authentication info */ pAuthInfo->AuthType = pChallenge->AuthType; status = pHttpAcmIf->GetCredential ( pHttpAcmIf->hOwnerContext, pHostName, HostPort, pUriPath, &pAuthInfo->pUserName, &pAuthInfo->pPassword ); if ( status != ANSC_STATUS_SUCCESS ) { goto EXIT; } pAuthInfo->pHostName = pHostName; pAuthInfo->HostPort = HostPort; pAuthInfo->pUri = pUriPath; if ( !bDigestAuth ) { /* basic authentication */ PHTTP_CHALLENGE_BASIC pBasicChal = &pChallenge->Challenge.Basic; pAuthInfo->pRealm = AnscCloneString(pBasicChal->Realm); } else { /* digest authentication */ PHTTP_CHALLENGE_DIGEST pDigestChal = &pChallenge->Challenge.Digest; PUCHAR pChal = (PUCHAR)pDigestChal->Realm; pMyObject->GetDigestAuthInfo ( (ANSC_HANDLE)pMyObject, (ANSC_HANDLE)pAuthInfo, pChal ); } /* sweep out old entries */ if ( TRUE ) { ULONG ulCount = (ULONG)AnscSListQueryDepth(&pMyObject->AuthInfoList); while ( ulCount >= pMyObject->AuthInfoMaxCount ) { PSINGLE_LINK_ENTRY pLastEntry = NULL; pLastEntry = AnscSListGetLastEntry(&pMyObject->AuthInfoList); AnscSListPopEntryByLink(&pMyObject->AuthInfoList, pLastEntry); ulCount --; } } AnscSListPushEntry(&pMyObject->AuthInfoList, &pAuthInfo->Linkage); status = ANSC_STATUS_SUCCESS; EXIT: AnscReleaseLock(&pMyObject->AuthInfoListLock); ABNORM: if ( status != ANSC_STATUS_SUCCESS ) { if ( pHostName ) { AnscFreeMemory(pHostName); } if ( pUriPath ) { AnscFreeMemory(pUriPath); } if ( pAuthInfo ) { HttpAuthInfoRemove(pAuthInfo); } } return status; }
ANSC_HANDLE HttpAuthcoFindAuthInfo2 ( ANSC_HANDLE hThisObject, ANSC_HANDLE hRequest, PBOOL pbParentUri ) { ANSC_STATUS status = ANSC_STATUS_SUCCESS; PHTTP_AUTH_CLIENT_OBJECT pMyObject = (PHTTP_AUTH_CLIENT_OBJECT)hThisObject; PHTTP_BMO_REQ_OBJECT pRequest = (PHTTP_BMO_REQ_OBJECT )hRequest; PHTTP_AUTHO_INFO pAuthInfo = NULL; PSINGLE_LINK_ENTRY pSLinkEntry = NULL; ANSC_HANDLE hAuthInfo = (ANSC_HANDLE)NULL; PUCHAR pHostName = NULL; PUCHAR pUriPath = NULL; USHORT HostPort = 0; PUCHAR pDomain = NULL; PUCHAR pMatchStr; *pbParentUri = FALSE; status = pMyObject->GetRequestHostUri((ANSC_HANDLE)pMyObject, hRequest, &pHostName, &HostPort, &pUriPath); if ( status != ANSC_STATUS_SUCCESS || !pUriPath || !pHostName ) { goto EXIT; } pSLinkEntry = AnscSListGetFirstEntry(&pMyObject->AuthInfoList); while (pSLinkEntry) { pAuthInfo = ACCESS_HTTP_AUTHO_INFO_OBJECT(pSLinkEntry); pSLinkEntry = AnscSListGetNextEntry(pSLinkEntry); if ( pAuthInfo->HostPort != HostPort ) { continue; } if ( !AnscEqualString(pAuthInfo->pHostName, pHostName, FALSE) ) { continue; } if ( AnscEqualString(pAuthInfo->pUri, pUriPath, TRUE ) ) { hAuthInfo = (ANSC_HANDLE)pAuthInfo; break; } pMatchStr = (PUCHAR)_ansc_strstr(pUriPath, pAuthInfo->pUri); if ( pMatchStr == pUriPath ) { hAuthInfo = (ANSC_HANDLE)pAuthInfo; break; } pMatchStr = (PUCHAR)_ansc_strstr(pAuthInfo->pUri, pUriPath); if ( pMatchStr == pAuthInfo->pUri ) { hAuthInfo = (ANSC_HANDLE)pAuthInfo; *pbParentUri = TRUE; break; } if ( pAuthInfo->AuthType == HTTP_AUTH_TYPE_DIGEST ) { PUCHAR *pURIs; ULONG i, ulCount; BOOL bMatch = FALSE; if ( pAuthInfo->pDigest->pDomainURIs ) { ulCount = pAuthInfo->pDigest->pDomainURIs->NumURIs; pURIs = pAuthInfo->pDigest->pDomainURIs->pURIs; for ( i = 0; i < ulCount; i ++) { pMatchStr = (PUCHAR)_ansc_strstr(pUriPath, pURIs[i]); if ( pMatchStr == pUriPath ) { bMatch = TRUE; break; } } if ( bMatch ) { hAuthInfo = (ANSC_HANDLE)pAuthInfo; break; } } else { pDomain = pAuthInfo->pDigest->pDomain; pMatchStr = (PUCHAR)_ansc_strstr(pUriPath, pDomain); if ( pMatchStr == pUriPath ) { hAuthInfo = (ANSC_HANDLE)pAuthInfo; break; } } } } EXIT: if ( pHostName ) { AnscFreeMemory(pHostName); } if ( pUriPath ) { AnscFreeMemory(pUriPath); } /* move this info to front-most */ if ( hAuthInfo ) { pAuthInfo = (PHTTP_AUTHO_INFO)hAuthInfo; AnscSListPopEntryByLink(&pMyObject->AuthInfoList, &pAuthInfo->Linkage); AnscSListPushEntry(&pMyObject->AuthInfoList, &pAuthInfo->Linkage); } return hAuthInfo; }
ANSC_HANDLE WebVhoAddGso ( ANSC_HANDLE hThisObject, char* identifier, PUCHAR address, USHORT port ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PWEB_VIRTUAL_HOST_OBJECT pMyObject = (PWEB_VIRTUAL_HOST_OBJECT )hThisObject; PWEB_VIRTUAL_HOST_PROPERTY pProperty = (PWEB_VIRTUAL_HOST_PROPERTY)&pMyObject->Property; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PWEB_LSM_INTERFACE pLsmIf = (PWEB_LSM_INTERFACE )pMyObject->hLsmIf; PWEB_GENERAL_SESSION_OBJECT pSession = NULL; ULONG ulHashIndex = 0; pMyObject->GlobalSidCount++; if ( pMyObject->GlobalSidCount >= 0x7FFFFFFF ) { pMyObject->GlobalSidCount = 0; } pSession = (PWEB_GENERAL_SESSION_OBJECT)WebCreateGeneralSession ( pMyObject->hContainerContext, (ANSC_HANDLE)pMyObject, (ANSC_HANDLE)NULL ); if ( !pSession ) { return (ANSC_HANDLE)NULL; } else { pSession->SetHfpIf ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pHfpIf ); pSession->SetSessionId ((ANSC_HANDLE)pSession, pMyObject->GlobalSidCount ); pSession->SetClientAddr ((ANSC_HANDLE)pSession, address ); pSession->SetClientPort ((ANSC_HANDLE)pSession, port ); pSession->SetLsmContext ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL ); pSession->SetLsmMaxAge ((ANSC_HANDLE)pSession, pProperty->LsmCookieMaxAge ); pSession->SetLsmExpire ((ANSC_HANDLE)pSession, pProperty->SessionTimeOut ); pSession->SetMaxLifespan((ANSC_HANDLE)pSession, pProperty->SessionMaxLifespan); } if ( identifier ) { pSession->SetLsmIdentifier((ANSC_HANDLE)pSession, identifier); returnStatus = pLsmIf->ClassifyClient ( pLsmIf->hOwnerContext, (ANSC_HANDLE)pSession ); } else { returnStatus = pLsmIf->NewContact ( pLsmIf->hOwnerContext, (ANSC_HANDLE)pSession ); } ulHashIndex = AnscHashUlong(pSession->SessionId, WEB_VHO_GSO_TABLE_SIZE); pSession->HashIndex = ulHashIndex; AnscAcquireLock(&pMyObject->GsoTableLock); pSession->AcquireAccess((ANSC_HANDLE)pSession); pSession->Engage ((ANSC_HANDLE)pSession); AnscSListPushEntry(&pMyObject->GsoTable[ulHashIndex], &pSession->Linkage); AnscReleaseLock(&pMyObject->GsoTableLock); return (ANSC_HANDLE)pSession; }