コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
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;
}
コード例 #5
0
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;
}
コード例 #6
0
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;
}
コード例 #7
0
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;
}
コード例 #8
0
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;
}
コード例 #9
0
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;
}
コード例 #10
0
/**********************************************************************

    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);
    }
}
コード例 #11
0
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;
}
コード例 #12
0
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;
}
コード例 #13
0
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;
}
コード例 #14
0
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;
}
コード例 #15
0
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;
}