static ULONG
AnscGetIanaTypeByName
    (
        PANSC_UTILBOX_IANA_MEDIA    pSet,
        ULONG                       ulCount,
        PUCHAR                      pName,
        ULONG                       ulNameLen
    )
{
    ULONG                           Type    = 0;
    ULONG                           i;
    PANSC_UTILBOX_IANA_MEDIA        pInfo;

    if (!pName || ulNameLen == 0)
    {
        return 0;
    }

    for (i = 0; i < ulCount; i ++)
    {
        pInfo   = (PANSC_UTILBOX_IANA_MEDIA)&pSet[i];

        if ( pInfo->Name == NULL || 
                (ulNameLen == AnscSizeOfString(pInfo->Name) && 
                AnscEqualString2(pName, pInfo->Name, ulNameLen, FALSE)) )
        {
            return pInfo->Type;
        }
    }

    return 0;
}
BOOL
Bmc2ComeoSoaIsBuiltInObject
    (
        ANSC_HANDLE                 hThisObject,
        char*                       obj_name
    )
{
    PBMC2_PEC_INTERFACE             pBmc2PecIf      = (PBMC2_PEC_INTERFACE)hThisObject;
    ULONG                           i;
    ULONG                           ulLen;
    ULONG                           ulObjNameLen    = obj_name ? AnscSizeOfString(obj_name) : 0;
    PUCHAR                          pObjName;

    for (i = 0; i < sizeof(s_Bmc2BuiltinObjs)/sizeof(s_Bmc2BuiltinObjs[0]); i ++)
    {
        pObjName        = (PUCHAR)s_Bmc2BuiltinObjs[i];
        ulLen           = AnscSizeOfString(pObjName);

        if ( ulObjNameLen != ulLen )
        {
            continue;
        }

        if ( AnscEqualString2(obj_name, pObjName, ulLen, TRUE) )
        {
            return TRUE;
        }
    }

    return FALSE;
}
static
char*
Bmc2EnvcoFindSubStrNoCase
    (
        char*                       pString,
        char*                       pSub
    )
{
    int                             i, nStringLen, nSubLen;

    if ( !pString || !pSub )
    {
        return NULL;
    }

    nStringLen = AnscSizeOfString(pString);
    nSubLen    = AnscSizeOfString(pSub);

    for ( i = 0; i <= nStringLen - nSubLen; i ++ )
    {
        if ( AnscEqualString2(pString+i, pSub, nSubLen, FALSE) )
        {
            return pString+i;
        }
    }

    return  NULL;
}
ANSC_STATUS
SlapBmc2OutoMoveCursor
    (
        ANSC_HANDLE                 hThisObject,
        char*                       pWhere          /* UP/DOWN/LEFT/RIGHT/HOME/END */
    )
{
    ANSC_STATUS                     returnStatus       = ANSC_STATUS_SUCCESS;
    PSLAP_BMC2_OUTPUT_OBJECT        pMyObject          = (PSLAP_BMC2_OUTPUT_OBJECT)hThisObject;
    char*                           pCmd               = NULL;
    char*                           pCmd2              = NULL;
    int                             nSizeWhere         = AnscSizeOfString(pWhere);

    if ( nSizeWhere == 2 && AnscEqualString2(pWhere, "UP", 2, FALSE) )
    {
        pCmd = TELNET_ANSI_TTY_CODE_Cursor_Up;
    }
    else if ( nSizeWhere == 4 && AnscEqualString2(pWhere, "DOWN", 4, FALSE) )
    {
        pCmd = TELNET_ANSI_TTY_CODE_Cursor_Down;
    }
    else if ( nSizeWhere == 4 && AnscEqualString2(pWhere, "LEFT", 4, FALSE) )
    {
        pCmd = TELNET_ANSI_TTY_CODE_Cursor_Backward;
    }
    else if ( nSizeWhere == 5 && AnscEqualString2(pWhere, "RIGHT", 5, FALSE) )
    {
        pCmd = TELNET_ANSI_TTY_CODE_Cursor_Forward;
    }
    else if ( nSizeWhere == 4 && AnscEqualString2(pWhere, "HOME", 4, FALSE) )
    {
        pCmd  = TELNET_ANSI_TTY_CODE_ANSI_Cursor_Home;
        pCmd2 = TELNET_ANSI_TTY_CODE_VT100_Cursor_Home;
    }
    else if ( nSizeWhere == 3 && AnscEqualString2(pWhere, "END", 3, FALSE) )
    {
        pCmd  = TELNET_ANSI_TTY_CODE_ANSI_Cursor_End;
        pCmd2 = TELNET_ANSI_TTY_CODE_VT100_Cursor_End;
    }

    if ( pCmd != NULL )
    {
        returnStatus = pMyObject->Write((ANSC_HANDLE)pMyObject, pCmd);
    }

    if ( pCmd2 != NULL )
    {
        returnStatus = pMyObject->Write((ANSC_HANDLE)pMyObject, pCmd2);
    }

    return  returnStatus;
}
BOOL
BwrmEcoRamIsPageCachedForced
    (
        ANSC_HANDLE                 hThisObject,
        char*                       page_path
    )
{
    ANSC_STATUS                     returnStatus     = ANSC_STATUS_SUCCESS;
    PBWRM_ENV_CONTROLLER_OBJECT     pMyObject        = (PBWRM_ENV_CONTROLLER_OBJECT  )hThisObject;
    PBWRM_ENV_CONTROLLER_PROPERTY   pProperty        = (PBWRM_ENV_CONTROLLER_PROPERTY)&pMyObject->Property;
    PSINGLE_LINK_ENTRY              pSLinkEntry      = (PSINGLE_LINK_ENTRY         )NULL;
    PBWRM_ENV_CACHE_FORCED_PAGE     pCacheForcedPage = (PBWRM_ENV_CACHE_FORCED_PAGE)NULL;
    BOOL                            bForced          = FALSE;
    ULONG                           ulLen            = AnscSizeOfString(page_path);

    AnscAcquireLock(&pMyObject->AccessLock);

    pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->ForcedCachedPages);

    while ( pSLinkEntry )
    {
        pCacheForcedPage = ACCESS_BWRM_ENV_CACHE_FORCED_PAGE(pSLinkEntry);
        pSLinkEntry      = AnscQueueGetNextEntry(pSLinkEntry);

        if ( ulLen == AnscSizeOfString(pCacheForcedPage->PagePath) &&
             AnscEqualString2(pCacheForcedPage->PagePath, page_path, ulLen, FALSE) )
        {
            bForced = TRUE;
            break;
        }
    }

    AnscReleaseLock(&pMyObject->AccessLock);

    return  bForced;
}
ULONG
AnscIsvpGetIdByString
    (
        const ANSC_ID_STRING_PAIR   pIsvp[],
        ULONG                       ulIsvpLen,
        PUCHAR                      pStr,
        ULONG                       ulStrLen,
        BOOL                        bCaseSensitive,
        ULONG                       ulUnmappedValue
    )
{
    ULONG                           i;

    for (i = 0; i < ulIsvpLen; i ++)
    {
        if (AnscSizeOfString(pIsvp[i].string) == ulStrLen &&
            AnscEqualString2(pIsvp[i].string, pStr, ulStrLen, bCaseSensitive))
        {
            return pIsvp[i].id;
        }
    }

    return ulUnmappedValue;
}
char*
HttpBmoGetHeaderValueByName2
    (
        ANSC_HANDLE                 hThisObject,
        char*                       name,
        ULONG                       ulIndex
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PHTTP_BASIC_MESSAGE_OBJECT      pMyObject    = (PHTTP_BASIC_MESSAGE_OBJECT   )hThisObject;
    PHTTP_HFP_INTERFACE             pHfpIf       = (PHTTP_HFP_INTERFACE          )pMyObject->hHfpIf;
#ifndef _CCSP_CWMP_TCP_CONNREQ_HANDLER
    PHTTP_HELPER_CONTAINER_OBJECT   pHttpHco     = (PHTTP_HELPER_CONTAINER_OBJECT)pMyObject->hContainerContext;
#endif
    PHTTP_HEADER_FIELD              pHttpHfo     = NULL;
    char*                           pHttpHfValue = NULL;
    char*                           pHttpHfColon = NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry  = NULL;
    ULONG                           ulHeaderId   = HTTP_HEADER_ID_RESERVED;
    ULONG                           i            = 0;
    ULONG                           ulCount      = 0;

    ulHeaderId =
#ifdef _CCSP_CWMP_TCP_CONNREQ_HANDLER
        AnscHttpGetHeaderCode(name);
#else
        pHttpHco->GetHeaderId
            (
                (ANSC_HANDLE)pHttpHco,
                name
            );
#endif

    if ( ulHeaderId != HTTP_HEADER_ID_RESERVED )
    {
        return  pMyObject->GetHeaderValueById2((ANSC_HANDLE)pMyObject, ulHeaderId, ulIndex);
    }

    AnscAcquireLock(&pMyObject->HfoTableLock);

    for ( i = 0; i < HTTP_BMO_HFO_TABLE_SIZE; i++ )
    {
        pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->HfoTable[i]);

        while ( pSLinkEntry )
        {
            pHttpHfo    = ACCESS_HTTP_HEADER_FIELD(pSLinkEntry);
            pSLinkEntry = AnscQueueGetNextEntry(pSLinkEntry);

            if ( !(pHttpHfo->Flags & HTTP_FIELD_FLAG_LINE_PRESENT) )
            {
                continue;
            }
            else if ( AnscSizeOfString(pHttpHfo->HeaderLine) < AnscSizeOfString(name) )
            {
                continue;
            }
            else
            {
                pHttpHfColon = _ansc_strchr(pHttpHfo->HeaderLine, ':');
            }

            if ( !pHttpHfColon )
            {
                continue;
            }
            else if ( ((ULONG)pHttpHfColon - (ULONG)pHttpHfo->HeaderLine) != AnscSizeOfString(name) )
            {
                continue;
            }
            else if ( AnscEqualString2
                        (
                            pHttpHfo->HeaderLine,
                            name,
                            AnscSizeOfString(name),
                            FALSE
                        ) )
            {
                if ( ulCount != ulIndex )
                {
                    ulCount ++;
                    continue;
                }

                AnscReleaseLock(&pMyObject->HfoTableLock);

                AnscHttpGetHfValue(pHttpHfo->HeaderLine, AnscSizeOfString(pHttpHfo->HeaderLine), pHttpHfValue);

                return  pHttpHfValue;
            }
        }
    }

    AnscReleaseLock(&pMyObject->HfoTableLock);

    return  NULL;
}
BOOL
HttpSmpoUtilParseAbsoluteURI
    (
        ANSC_HANDLE                 hHttpSmpo,
        ANSC_HANDLE                 hRequestUri,
        PUCHAR                      pBuf,
        ULONG                       ulSize
    )
{
    /* absoluteURI = scheme ":" *( uchar | reserved ) */

    PHTTP_REQUEST_URI               pUri    = (PHTTP_REQUEST_URI)hRequestUri;
    PUCHAR                          pScheme = pBuf;
    PUCHAR                          pNext;
    ULONG                           ulLen;
    BOOL                            bHttp   = FALSE;
    USHORT                          usPort  = 0;
    PUCHAR                          pHost;
    PUCHAR                          pLast   = pBuf + ulSize - 1;

    pNext   = _ansc_memchr(pBuf, HTTP_SMPO_CHAR_COLON, ulSize);

    if (!pNext)
    {
        return FALSE;
    }

    pHost   = pNext + 1;

    ulLen   = pNext - pBuf;

    if ( ulLen == HTTP_SMPO_PROTOCOL_HTTPS_LENGTH &&
        AnscEqualString2(pScheme, HTTP_SMPO_PROTOCOL_HTTPS, HTTP_SMPO_PROTOCOL_HTTPS_LENGTH, FALSE) )
    {
        pUri->Flag  |= HTTP_URI_FLAG_HTTPS;
        bHttp       = TRUE;
        usPort      = HTTPS_PORT;
    }
    else 
        if ( ulLen == 4 && AnscEqualString2(pScheme, "http", 4, FALSE) )
        {
            bHttp   = TRUE;
            usPort  = HTTP_PORT;
        }

    pNext   = _ansc_memchr(pBuf, HTTP_SMPO_CHAR_SLASH, pNext - pScheme);

    if (pNext)
    {
        /* scheme name shouldn't have slash in it */

        return FALSE;
    }

    pUri->Type  = HTTP_URI_TYPE_ABSOLUTE_URI;
    HttpSmpoUtilCopyHeaderString(pBuf, ulSize, pUri->HostName, ANSC_DOMAIN_NAME_SIZE);

    if (bHttp)
    {
        PUCHAR                      pLast   = pBuf + ulSize - 1;

        pUri->HostPort  = usPort;

        pNext   = pHost;

        if ( *(pNext + 1) == HTTP_SMPO_CHAR_SLASH )
        {
            pHost   = pNext + 2;
        }

        if (pHost)
        {
            BOOL                    bPath       = TRUE;
            PUCHAR                  pPort;
            PUCHAR                  pHostEnd    = NULL;

            pNext   = _ansc_memchr(pHost, HTTP_SMPO_CHAR_SLASH, pLast - pHost + 1);

            if (!pNext)
            {
                pNext       = _ansc_memchr(pHost, HTTP_SMPO_CHAR_SPACE, pLast - pHost + 1);
                bPath       = FALSE;
                pHostEnd    = pLast;
            }
            else
            {
                pHostEnd    = pNext - 1;
            }

            if (TRUE)
            {
                if (bPath && pNext)
                {
                    HttpSmpoUtilParseAbsPath(hHttpSmpo, hRequestUri, pNext, pLast - pNext + 1);
                    pUri->Type  = HTTP_URI_TYPE_ABSOLUTE_URI;
                }
                else
                {
                    pUri->PathArray[0][0]   = '/';
                    pUri->PathArray[0][1]   = 0;
                }

                if (pNext)
                {
                    pPort   = _ansc_memchr(pHost, HTTP_SMPO_CHAR_COLON, pNext - pHost);
                }
                else
                {
                    pPort   = _ansc_memchr(pHost, HTTP_SMPO_CHAR_COLON, pHostEnd - pHost + 1);
                }

                if (pPort)
                {
                    pUri->HostPort = _ansc_atoi(pPort + 1);
                }
                else
                {
                    pUri->HostPort  = usPort;
                }

                HttpSmpoUtilCopyHeaderString
                    (
                        pHost, 
                        pPort ? (pPort - pHost) : ( pNext ? (pNext - pHost) : (pLast - pHost + 1) ), 
                        pUri->HostName, 
                        ANSC_DOMAIN_NAME_SIZE
                    );
            }
        }
    }

    return TRUE;
}
ANSC_STATUS
BwrmEcoRamForcePageCache
    (
        ANSC_HANDLE                 hThisObject,
        char*                       page_path,
        BOOL                        bCachedForced
    )
{
    ANSC_STATUS                     returnStatus     = ANSC_STATUS_SUCCESS;
    PBWRM_ENV_CONTROLLER_OBJECT     pMyObject        = (PBWRM_ENV_CONTROLLER_OBJECT  )hThisObject;
    PBWRM_ENV_CONTROLLER_PROPERTY   pProperty        = (PBWRM_ENV_CONTROLLER_PROPERTY)&pMyObject->Property;
    PSINGLE_LINK_ENTRY              pSLinkEntry      = (PSINGLE_LINK_ENTRY         )NULL;
    PBWRM_ENV_CACHE_FORCED_PAGE     pCacheForcedPage = (PBWRM_ENV_CACHE_FORCED_PAGE)NULL;
    BOOL                            bFound           = FALSE;
    ULONG                           ulLen            = AnscSizeOfString(page_path);

    AnscAcquireLock(&pMyObject->AccessLock);

    pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->ForcedCachedPages);

    while ( pSLinkEntry )
    {
        pCacheForcedPage = ACCESS_BWRM_ENV_CACHE_FORCED_PAGE(pSLinkEntry);
        pSLinkEntry      = AnscQueueGetNextEntry(pSLinkEntry);

        if ( ulLen == AnscSizeOfString(pCacheForcedPage->PagePath) &&
             AnscEqualString2(pCacheForcedPage->PagePath, page_path, ulLen, FALSE) )
        {
            bFound = TRUE;
            break;
        }
    }

    if ( bFound && !bCachedForced )
    {
        /* remove it from the list */
        AnscQueuePopEntryByLink(&pMyObject->ForcedCachedPages, &pCacheForcedPage->Linkage);
    }
    else if ( bCachedForced && !bFound )
    {
        pCacheForcedPage = (PBWRM_ENV_CACHE_FORCED_PAGE)AnscAllocateMemory(sizeof(BWRM_ENV_CACHE_FORCED_PAGE));

        if ( pCacheForcedPage )
        {
            pCacheForcedPage->PagePath = AnscCloneString(page_path);

            if ( pCacheForcedPage->PagePath )
            {
                AnscQueuePushEntry(&pMyObject->ForcedCachedPages, &pCacheForcedPage->Linkage);
            }
            else
            {
                BwrmEnvRemoveCacheForcedPage(pCacheForcedPage);
            }
        }
    }

    AnscReleaseLock(&pMyObject->AccessLock);

    return  returnStatus;
}
ANSC_HANDLE
Bmc2EnvcoDelCommandProperty
    (
        ANSC_HANDLE                 hThisObject,
        char*                       pCommandName,
        char*                       pDomainNamePattern
    )
{
    ANSC_STATUS                     returnStatus         = ANSC_STATUS_SUCCESS;
    PBMC2_ENV_CONTROLLER_OBJECT     pMyObject            = (PBMC2_ENV_CONTROLLER_OBJECT  )hThisObject;
    PBMC2_ENV_CONTROLLER_PROPERTY   pProperty            = (PBMC2_ENV_CONTROLLER_PROPERTY)&pMyObject->Property;
    PBMC2_COMMAND_PROPERTY          pBmc2CommandProperty = (PBMC2_COMMAND_PROPERTY       )NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry          = (PSINGLE_LINK_ENTRY           )NULL;
    ULONG                           ulHashIndex          = AnscHashString(pCommandName, AnscSizeOfString(pCommandName), BMC2_ENVCO_COMPO_TABLE_SIZE);
    PBMC2_COMMAND_PROPERTY          pBmc2CommandRef      = (PBMC2_COMMAND_PROPERTY       )NULL;

    AnscAcquireLock(&pMyObject->CompoTableLock);

    pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->CompoTable[ulHashIndex]);

    while ( pSLinkEntry )
    {
        pBmc2CommandProperty = ACCESS_BMC2_COMMAND_PROPERTY(pSLinkEntry);
        pSLinkEntry          = AnscQueueGetNextEntry(pSLinkEntry);

        if ( AnscEqualString
                (
                    pBmc2CommandProperty->CommandName,
                    pCommandName,
                    FALSE
                ) )
        {
            BOOL                    bDomainMatched = FALSE;

            /* check if the specified domain matches pattern defined in command property */
            if ( !pDomainNamePattern && !pBmc2CommandProperty->DomainNamePattern )
            {
                bDomainMatched = TRUE;
            }
            else if ( !pDomainNamePattern && pBmc2CommandProperty->DomainNamePattern )
            {
                if ( AnscEqualString(pBmc2CommandProperty->DomainNamePattern, "*", TRUE) )
                {
                    bDomainMatched = TRUE;
                }
            }
            else if ( !pBmc2CommandProperty->DomainNamePattern || 
                 AnscEqualString(pBmc2CommandProperty->DomainNamePattern, "*", TRUE) )
            {
                if ( !pDomainNamePattern || AnscEqualString(pDomainNamePattern, "*", TRUE) )
                {
                    bDomainMatched = TRUE;
                }
            }
            else
            {
                ULONG               ulDNLen      = AnscSizeOfString(pBmc2CommandProperty->DomainNamePattern);
                ULONG               ulCmdDNLen   = AnscSizeOfString(pDomainNamePattern);
                ULONG               ulCmpLen     = (ulDNLen > ulCmdDNLen) ? ulCmdDNLen : ulDNLen;

                if ( !pBmc2CommandRef && AnscEqualString2(pDomainNamePattern, pBmc2CommandProperty->DomainNamePattern, ulCmpLen, FALSE) )
                {
                    pBmc2CommandRef = pBmc2CommandProperty;
                }
                else if ( !pBmc2CommandRef && 
                          (!pBmc2CommandProperty->DomainNamePattern || 
                            AnscEqualString(pBmc2CommandProperty->DomainNamePattern, "*", TRUE)) )
                {
                    pBmc2CommandRef = pBmc2CommandProperty;
                }
                else
                {
                    BOOL                bEndWithStar = (pBmc2CommandProperty->DomainNamePattern[ulDNLen - 1] == '*');

                    if ( bEndWithStar &&
                         AnscEqualString2(pDomainNamePattern, pBmc2CommandProperty->DomainNamePattern, ulDNLen - 1, FALSE) )
                    {
                        pBmc2CommandRef = pBmc2CommandProperty;
                    }
                }

                bDomainMatched = 
                    AnscEqualString
                        (
                            pBmc2CommandProperty->DomainNamePattern, 
                            pDomainNamePattern, 
                            FALSE
                        );
            }

            if ( !bDomainMatched )
            {
                continue;
            }

            AnscQueuePopEntryByLink(&pMyObject->CompoTable[ulHashIndex], &pBmc2CommandProperty->Linkage);

            AnscReleaseLock(&pMyObject->CompoTableLock);

            Bmc2FreeCommandProperty(pBmc2CommandProperty);

            return  (ANSC_HANDLE)NULL;
        }
    }

    AnscReleaseLock(&pMyObject->CompoTableLock);

    return  (ANSC_HANDLE)pBmc2CommandRef;
}
Esempio n. 11
0
void
AnscTrace3
    (
        char*                       pTraceId,
        char*                       pDebugStr,
        ...
    )
{
    BOOL                            bTraceIdMatched = FALSE;
    ULONG                           ulTraceIdCount  = sizeof(g_tTraceIdTable) / sizeof(char*);
    ULONG                           i               = 0;

    if ( g_bSelectTraceId )
    {
        for ( i = 0; i < ulTraceIdCount; i++ )
        {
            if ( (AnscSizeOfString(pTraceId) >= AnscSizeOfString(g_tTraceIdTable[i]))&&
                 AnscEqualString2
                    (
                        pTraceId,
                        g_tTraceIdTable[i],
                        AnscSizeOfString(g_tTraceIdTable[i]),
                        FALSE
                    ) )
            {
                bTraceIdMatched = TRUE;

                break;
            }
        }
    }
    else
    {
        bTraceIdMatched = TRUE;
    }

    if ( bTraceIdMatched )
    {
        char*                       pTempChar = (char*)AnscAllocateMemory(1024);
        va_list				        val;

        if ( !pTempChar )
        {
            return;
        }
        else
        {
            va_start(val, pDebugStr);
            _ansc_vsprintf(pTempChar, pDebugStr, val);
            va_end(val);
        }

        #ifdef   _ANSC_KERNEL
            KernelTrace(pTempChar);
        #else
            UserTrace  (pTempChar);
        #endif

        AnscFreeMemory(pTempChar);
    }

    return;
}
/**********************************************************************

    prototype:

        ANSC_STATUS
        CcspCwmpAcscoRequestOny
            (
                ANSC_HANDLE                 hThisObject
            );

    description:

        This function is called to send the last empty request to ACS.

    argument:

                ANSC_HANDLE                 hThisObject
                The caller object.

    return:     the status of the operation;

**********************************************************************/
ANSC_STATUS
CcspCwmpAcscoRequestOnly
    (
        ANSC_HANDLE                 hThisObject
    )
{
    PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject      = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject;

    return  pMyObject->Request((ANSC_HANDLE)pMyObject, NULL, NULL, 0, 0);

#if 0
    PHTTP_SIMPLE_CLIENT_OBJECT      pHttpClient     = (PHTTP_SIMPLE_CLIENT_OBJECT)pMyObject->hHttpSimpleClient;
    PCCSP_CWMP_SESSION_OBJECT       pWmpSession     = (PCCSP_CWMP_SESSION_OBJECT   )pMyObject->hCcspCwmpSession;
    PCCSP_CWMP_MCO_INTERFACE        pCcspCwmpMcoIf  = (PCCSP_CWMP_MCO_INTERFACE    )pWmpSession->hCcspCwmpMcoIf;
    PHTTP_HFP_INTERFACE             pHttpHfpIf      = (PHTTP_HFP_INTERFACE)pHttpClient->GetHfpIf((ANSC_HANDLE)pHttpClient);
    PHTTP_CAS_INTERFACE             pHttpCasIf      = NULL;
    PHTTP_REQUEST_URI               pHttpReqInfo    = NULL;
    ANSC_STATUS                     returnStatus    = ANSC_STATUS_SUCCESS;
    ANSC_ACS_INTERN_HTTP_CONTENT    intHttpContent  = { 0 };
    PANSC_ACS_INTERN_HTTP_CONTENT   pHttpGetReq     = &intHttpContent;
    BOOL                            bApplyTls       = FALSE;
    PCHAR                           pRequestURL     = NULL;
    PCHAR                           pTempString     = NULL;
    PHTTP_AUTH_CLIENT_OBJECT        pAuthClientObj  = NULL;
    char                            pNewUrl[257]    = { 0 };
    ULONG                           uRedirect       = 0;
    ULONG                           uMaxRedirect    = 5;

    if( pMyObject->AcsUrl == NULL || AnscSizeOfString(pMyObject->AcsUrl) <= 10 || pHttpHfpIf == NULL)
    {
        return ANSC_STATUS_NOT_READY;
    }

    CcspTr069PaTraceDebug(("CcspCwmpAcscoRequest -- AcsUrl = '%s'\n", pMyObject->AcsUrl));

    pRequestURL = pMyObject->AcsUrl;

    if ( AnscEqualString2(pRequestURL, "https", 5, FALSE) )
    {
        bApplyTls = TRUE;
    }
    else if ( AnscEqualString2(pRequestURL, "http", 4, FALSE) )
    {
        bApplyTls = FALSE;
    }
    else
    {
        return ANSC_STATUS_NOT_SUPPORTED;
    }

    pHttpCasIf  = (PHTTP_CAS_INTERFACE)pHttpClient->GetCasIf((ANSC_HANDLE)pHttpClient);

    if ( pHttpCasIf != NULL)
    {
        if( pMyObject->Username == NULL || AnscSizeOfString(pMyObject->Username) == 0)
        {
            pHttpCasIf->EnableAuth(pHttpCasIf->hOwnerContext, FALSE);
        }
        else
        {
            pHttpCasIf->EnableAuth(pHttpCasIf->hOwnerContext, TRUE);

            pAuthClientObj  = (PHTTP_AUTH_CLIENT_OBJECT)pHttpClient->GetClientAuthObj((ANSC_HANDLE)pHttpClient);

            if ( pAuthClientObj != NULL)
            {
                pAuthClientObj->SetAcmIf((ANSC_HANDLE)pAuthClientObj, (ANSC_HANDLE)pMyObject->hHttpAcmIf);
            }
            else
            {
                CcspTr069PaTraceError(("Failed to Get HttpAuthClient object.\n"));
            }
        }
    }

    pHttpReqInfo =
        (PHTTP_REQUEST_URI)pHttpHfpIf->ParseHttpUrl
            (
                pHttpHfpIf->hOwnerContext,
                pRequestURL,
                AnscSizeOfString(pRequestURL)
            );

    if ( !pHttpReqInfo )
    {
        return ANSC_STATUS_INTERNAL_ERROR;
    }

    pHttpReqInfo->Type = HTTP_URI_TYPE_ABS_PATH;


    CcspTr069PaTraceInfo(("Send empty request to now at: %u\n", (unsigned int)AnscGetTickInSeconds()));

    returnStatus =
        pHttpClient->Request
            (
                (ANSC_HANDLE)pHttpClient,
                (ULONG      )HTTP_METHOD_CODE_POST,
                (ANSC_HANDLE)pHttpReqInfo,
                (ANSC_HANDLE)NULL,
                bApplyTls
            );

    AnscSleep(500);

    CcspTr069PaFreeMemory(pHttpReqInfo);

    return returnStatus;
#endif
}
ANSC_STATUS
CcspCwmpAcscoRequest
    (
        ANSC_HANDLE                 hThisObject,
        char*                       pSoapMessage,
        char*                       pMethodName,
        ULONG                       ulReqEnvCount,
        ULONG                       ulRepEnvCount
    )
{
    PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject      = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject;
    PHTTP_SIMPLE_CLIENT_OBJECT      pHttpClient     = (PHTTP_SIMPLE_CLIENT_OBJECT)pMyObject->hHttpSimpleClient;
    PCCSP_CWMP_SESSION_OBJECT       pWmpSession     = (PCCSP_CWMP_SESSION_OBJECT   )pMyObject->hCcspCwmpSession;
    PCCSP_CWMP_CPE_CONTROLLER_OBJECT pCcspCwmpCpeController = (PCCSP_CWMP_CPE_CONTROLLER_OBJECT)pWmpSession->hCcspCwmpCpeController;
    PCCSP_CWMP_STAT_INTERFACE       pCcspCwmpStatIf = (PCCSP_CWMP_STAT_INTERFACE)pCcspCwmpCpeController->hCcspCwmpStaIf;
	PCCSP_CWMP_CFG_INTERFACE		pCcspCwmpCfgIf	= (PCCSP_CWMP_CFG_INTERFACE)pCcspCwmpCpeController->hCcspCwmpCfgIf;
    PCCSP_CWMP_MCO_INTERFACE        pCcspCwmpMcoIf  = (PCCSP_CWMP_MCO_INTERFACE        )pWmpSession->hCcspCwmpMcoIf;
    PHTTP_HFP_INTERFACE             pHttpHfpIf      = (PHTTP_HFP_INTERFACE)pHttpClient->GetHfpIf((ANSC_HANDLE)pHttpClient);
    PHTTP_CAS_INTERFACE             pHttpCasIf      = NULL;
    PHTTP_REQUEST_URI               pHttpReqInfo    = NULL;
    ANSC_STATUS                     returnStatus    = ANSC_STATUS_SUCCESS;
    PANSC_ACS_INTERN_HTTP_CONTENT   pHttpGetReq     = &intHttpContent;
    BOOL                            bApplyTls       = FALSE;
    PCHAR                           pRequestURL     = NULL;
    PCHAR                           pTempString     = NULL;
    PHTTP_AUTH_CLIENT_OBJECT        pAuthClientObj  = NULL;
    char                            pNewUrl[257]    = { 0 };
    ULONG                           uRedirect       = 0;
    ULONG                           uMaxRedirect    = 5;
	ULONG							ulRpcCallTimeout= CCSP_CWMPSO_RPCCALL_TIMEOUT; 

    /* If the response is 401 authentication required, we need to try again */
    int                             nMaxAuthRetries = 2;

    if( pMyObject->AcsUrl == NULL || AnscSizeOfString(pMyObject->AcsUrl) <= 10 || pHttpHfpIf == NULL)
    {
        return ANSC_STATUS_NOT_READY;
    }

    AnscZeroMemory(pHttpGetReq, sizeof(ANSC_ACS_INTERN_HTTP_CONTENT));

    CcspTr069PaTraceDebug(("CcspCwmpAcscoRequest -- AcsUrl = '%s'\n", pMyObject->AcsUrl));

    pHttpCasIf  = (PHTTP_CAS_INTERFACE)pHttpClient->GetCasIf((ANSC_HANDLE)pHttpClient);

    if ( pHttpCasIf != NULL)
    {
        if( pMyObject->Username == NULL || AnscSizeOfString(pMyObject->Username) == 0)
        {
            pHttpCasIf->EnableAuth(pHttpCasIf->hOwnerContext, FALSE);
        }
        else
        {
            pHttpCasIf->EnableAuth(pHttpCasIf->hOwnerContext, TRUE);

            pAuthClientObj  = (PHTTP_AUTH_CLIENT_OBJECT)pHttpClient->GetClientAuthObj((ANSC_HANDLE)pHttpClient);

            if ( pAuthClientObj != NULL)
            {
                pAuthClientObj->SetAcmIf((ANSC_HANDLE)pAuthClientObj, (ANSC_HANDLE)pMyObject->hHttpAcmIf);
            }
            else
            {
                CcspTr069PaTraceError(("Failed to Get HttpAuthClient object.\n"));
            }
        }
    }

#ifdef   _DEBUG
    if ( !pSoapMessage )
    {
        CcspTr069PaTraceDebug(("CPE Request:\n<EMPTY>\n"));
    }
    else if ( AnscSizeOfString(pSoapMessage) <= CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH )
    {
        CcspTr069PaTraceDebug(("CPE Request:\n%s\n", pSoapMessage));
    }
    else
    {
        char                        partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+1+8];

        AnscCopyMemory(partSoap, pSoapMessage, CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH);
        partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH] = '\n';
        partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+1] = '.';
        partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+2] = '.';
        partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+3] = '.';
        partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+4] = '\n';
        partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+5] = 0;
        CcspTr069PaTraceDebug(("CPE Request:\n%s\n", partSoap));
    }
#endif
    
START:
    pRequestURL = pMyObject->AcsUrl;

    pHttpReqInfo =
        (PHTTP_REQUEST_URI)pHttpHfpIf->ParseHttpUrl
            (
                pHttpHfpIf->hOwnerContext,
                pRequestURL,
                AnscSizeOfString(pRequestURL)
            );

    if ( !pHttpReqInfo )
    {
        return ANSC_STATUS_INTERNAL_ERROR;
    }

    pHttpReqInfo->Type = HTTP_URI_TYPE_ABS_PATH;

    /* init the request */
    AnscZeroMemory(pHttpGetReq, sizeof(ANSC_ACS_INTERN_HTTP_CONTENT));
    pHttpGetReq->bIsRedirect    = FALSE;
    pHttpGetReq->SoapMessage    = pSoapMessage;

    /* When there is more than one envelope in a single HTTP Request,
     * when there is a SOAP response in an HTTP Request, or when there is a
     * SOAP Fault response in an HTTP Request, the SOAPAction header in the
     * HTTP Request MUST have no value (with no quotes), indicating that this
     * header provides no information as to the intent of the message."
     */
    if( ulReqEnvCount == 1 && ulRepEnvCount == 0)
    {
        pHttpGetReq->MethodName     = pMethodName;
    }

    AnscInitializeEvent(&pHttpGetReq->CompleteEvent);

    while ( nMaxAuthRetries > 0 )
    {
        CcspTr069PaTraceInfo(("ACS Request now at: %u\n", (unsigned int)AnscGetTickInSeconds()));

        if ( AnscEqualString2(pRequestURL, "https", 5, FALSE) )
        {
            bApplyTls = TRUE;
        }
        else if ( AnscEqualString2(pRequestURL, "http", 4, FALSE) )
        {
            if ( bIsComcastImage() ){                
#ifdef _SUPPORT_HTTP
               CcspTr069PaTraceInfo(("HTTP request from ACS is supported\n"));
               bApplyTls = FALSE;
#else
               CcspTr069PaTraceInfo(("TR-069 blocked unsecured traffic from ACS\n"));
               pHttpGetReq->CompleteStatus = ANSC_STATUS_NOT_SUPPORTED;
               pHttpGetReq->bUnauthorized = TRUE;
               pHttpGetReq->bIsRedirect = FALSE;
               break;
#endif
            }
            else {
               bApplyTls = FALSE; 
            }
        }
        else
        {
             pHttpGetReq->CompleteStatus = ANSC_STATUS_NOT_SUPPORTED;
             pHttpGetReq->bUnauthorized = FALSE;
             pHttpGetReq->bIsRedirect = FALSE;
             break;
        }

        if(pHttpGetReq->pContent != NULL)
        {
            CcspTr069PaFreeMemory(pHttpGetReq->pContent);

            pHttpGetReq->pContent = NULL;
        }

        pHttpGetReq->CompleteStatus = ANSC_STATUS_FAILURE;
        pHttpGetReq->bUnauthorized  = FALSE;
        AnscResetEvent     (&pHttpGetReq->CompleteEvent);

        returnStatus =
            pHttpClient->Request
                (
                    (ANSC_HANDLE)pHttpClient,
                    (ULONG      )HTTP_METHOD_CODE_POST,
                    (ANSC_HANDLE)pHttpReqInfo,
                    (ANSC_HANDLE)pHttpGetReq,
                    bApplyTls
                );

        if( returnStatus != ANSC_STATUS_SUCCESS)
        {
            CcspTr069PaTraceError(("ACS Request failed: returnStatus = %.X\n", (unsigned int)returnStatus));
			break;
        }

		if ( pCcspCwmpCfgIf && pCcspCwmpCfgIf->GetCwmpRpcTimeout )
		{
			ulRpcCallTimeout = pCcspCwmpCfgIf->GetCwmpRpcTimeout(pCcspCwmpCfgIf->hOwnerContext);	
			if ( ulRpcCallTimeout < CCSP_CWMPSO_RPCCALL_TIMEOUT )
			{
				ulRpcCallTimeout = CCSP_CWMPSO_RPCCALL_TIMEOUT;
			}
		}

        AnscWaitEvent(&pHttpGetReq->CompleteEvent, ulRpcCallTimeout * 1000);
        if ( pHttpGetReq->CompleteStatus == ANSC_STATUS_SUCCESS && pHttpGetReq->bUnauthorized && nMaxAuthRetries > 0 )
        {
            CcspTr069PaTraceError(("ACS Request is not authenticated, try again.\n"));
            nMaxAuthRetries --;
			
#ifdef _ANSC_USE_OPENSSL_
            if( bApplyTls )
        	{
	        	if ( ANSC_STATUS_SUCCESS == CcspTr069PaSsp_GetTr069CertificateLocationForSyndication( &openssl_client_ca_certificate_files ) )
        		{
					openssl_load_ca_certificates( SSL_CLIENT_CALLS );
        		}
        	}
#endif /* _ANSC_USE_OPENSSL_ */
        }
        else
        {
            CcspTr069PaTraceInfo(("ACS Request has completed with status code %lu, at %lu\n", pHttpGetReq->CompleteStatus, AnscGetTickInSeconds()));

            break;
        }
    }

    /* AnscResetEvent (&pHttpGetReq->CompleteEvent); */
    AnscFreeEvent(&pHttpGetReq->CompleteEvent);

    CcspTr069PaFreeMemory(pHttpReqInfo);

    if ( pHttpGetReq->CompleteStatus != ANSC_STATUS_SUCCESS )
    {
        if ( pHttpGetReq->CompleteStatus == ANSC_STATUS_RESET_SESSION )
        {
            goto  REDIRECTED;
        }
        else
        {
            returnStatus = pHttpGetReq->CompleteStatus;

            goto  EXIT;
        }
    }
    else if( pHttpGetReq->bUnauthorized)
    {
        returnStatus = ANSC_STATUS_FAILURE;

        if( pCcspCwmpStatIf)
        {
            pCcspCwmpStatIf->IncTcpFailure(pCcspCwmpStatIf->hOwnerContext);
        }

        goto EXIT;
    }

REDIRECTED:
    if( pHttpGetReq->bIsRedirect)
    {
        if( _ansc_strstr((PCHAR)pHttpGetReq->pContent, "http") == pHttpGetReq->pContent)
        {
            if ( pMyObject->AcsUrl ) CcspTr069PaFreeMemory(pMyObject->AcsUrl);
            pMyObject->AcsUrl = CcspTr069PaCloneString(pHttpGetReq->pContent);
        }
        else
        {
            /* if it's partial path */
            pTempString = _ansc_strstr(pRequestURL, "//");

            if( pTempString == NULL)
            {
                returnStatus = ANSC_STATUS_FAILURE;

                goto EXIT;
            }

            pTempString += AnscSizeOfString("//");
            pTempString  = _ansc_strstr(pTempString, "/");

            if( pTempString == NULL)
            {
                returnStatus = ANSC_STATUS_FAILURE;

                goto EXIT;
            }

            AnscCopyMemory(pNewUrl, pRequestURL, (ULONG)(pTempString - pRequestURL));
            AnscCatString(pNewUrl, (PCHAR)pHttpGetReq->pContent);

            if ( pMyObject->AcsUrl ) CcspTr069PaFreeMemory(pMyObject->AcsUrl);
            pMyObject->AcsUrl = CcspTr069PaCloneString(pNewUrl);
        }

        uRedirect ++;

        if( uRedirect >= uMaxRedirect)
        {
            CcspTr069PaTraceDebug(("Maximum Redirection reached. Give up!\n"));

            returnStatus = ANSC_STATUS_FAILURE;

            goto EXIT;
        }
        else
        {
            CcspTr069PaTraceDebug(("Acs connection redirection #%u: '%s'\n", (unsigned int)uRedirect, pMyObject->AcsUrl));

            /* in case redirected ACS challenges CPE again */
            nMaxAuthRetries = 2;

            /* tear down current HTTP session before redirecting to new ACS,
             * otherwise, there might be case that ACS sends out redirection
             * response and immediately closes the socket, CWMP may be 
             * confused by closing CWMP session prematurely. 
             */
            pHttpClient->DelAllWcsos((ANSC_HANDLE)pHttpClient);

            goto START;
        }
    }

    if(pWmpSession != NULL)
    {
        if( pHttpGetReq->ulContentSize > 0 && pHttpGetReq->pContent != NULL)
        {
            CcspTr069PaTraceDebug(("Response:\n%s\n", (char*)pHttpGetReq->pContent));

            returnStatus =
                pWmpSession->RecvSoapMessage
                    (
                       pWmpSession,
                       (PCHAR)pHttpGetReq->pContent
                    );
        }
        else
        {
            CcspTr069PaTraceDebug(("Response: <EMPTY>\n"));

            returnStatus =
                pCcspCwmpMcoIf->NotifyAcsStatus
                    (
                        pCcspCwmpMcoIf->hOwnerContext,
                        TRUE,           /* no more requests */
                        FALSE
                    );
        }
    }

EXIT:

    if(pHttpGetReq->pContent != NULL)
    {
        CcspTr069PaFreeMemory(pHttpGetReq->pContent);

        pHttpGetReq->pContent = NULL;
    }

    /******************************************************************
                GRACEFUL ROLLBACK PROCEDURES AND EXIT DOORS
    ******************************************************************/

    return returnStatus;
}