xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpResponse.cpp
branchRCL_3
changeset 34 2669f8761a99
parent 31 2580314736af
child 35 fbd2e7cec7ef
--- a/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpResponse.cpp	Thu Aug 19 10:19:02 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,442 +0,0 @@
-/*
-* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:   CXcapHttpResponse
-*
-*/
-
-
-
-
-// INCLUDE FILES
-#include <XdmErrors.h>
-#include "XdmCredentials.h"
-#include "XcapHttpRequest.h"
-#include "XcapHttpResponse.h"
-#include "XcapHttpTransport.h"
-#include "XcapHttpAuthManager.h"
-
-const TUint KMaxRetryCount = 3;
-
-// ================= MEMBER FUNCTIONS =======================
-//
-
-
-// ----------------------------------------------------------
-// CXcapHttpResponse::CXcapHttpResponse
-// 
-// ----------------------------------------------------------
-//
-CXcapHttpResponse::CXcapHttpResponse( CXcapHttpRequest* aHttpRequest,
-                                      CXcapHttpTransport& aTransportMain ) :
-                                      iAuthPending( EFalse ),
-                                      iHttpRequest( aHttpRequest ),
-                                      iTransportMain( aTransportMain ),
-                                      iAuthManager( iHttpRequest->AuthManager() )                                       
-    {
-    }
-
-// ----------------------------------------------------
-// CXcapHttpResponse::NewL
-// 
-// ----------------------------------------------------
-//
-CXcapHttpResponse* CXcapHttpResponse::NewL( CXcapHttpRequest* aHttpRequest,
-                                            CXcapHttpTransport& aTransportMain )
-    {
-    CXcapHttpResponse* self = new ( ELeave ) CXcapHttpResponse( aHttpRequest, aTransportMain );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop();  //self
-    return self;
-    }
-    
-// ----------------------------------------------------
-// CXcapHttpResponse::ConstructL
-// 
-// ----------------------------------------------------
-//
-void CXcapHttpResponse::ConstructL()
-    {
-    }
-    
-// ----------------------------------------------------
-// CXcapHttpResponse::~CXcapHttpResponse()
-// Destructor
-// ----------------------------------------------------
-//
-CXcapHttpResponse::~CXcapHttpResponse()
-    {
-    }
-
-// ----------------------------------------------------
-// CXcapHttpResponse::MHFRunL
-// 
-// ----------------------------------------------------
-//
-void CXcapHttpResponse::MHFRunL( RHTTPTransaction aTransaction, const THTTPEvent& aEvent )
-    {
-    TInt status = aTransaction.Response().StatusCode();
-    #ifdef _DEBUG
-        iTransportMain.WriteToLog( _L8( "CXcapHttpResponse::MHFRunL()" ) );
-        iTransportMain.WriteToLog( _L8( "  HTTP status:  %d" ), status );
-		iTransportMain.WriteToLog( _L8( "  Event status: %d" ), aEvent.iStatus );
-        iTransportMain.WriteToLog( _L8( "  TransID:      %d " ), aTransaction.Id() );
-    #endif
-    switch( aEvent.iStatus )
-        {
-        case THTTPEvent::EGotResponseHeaders:
-            #ifdef _DEBUG
-                DumpHeadersL( aTransaction.Response().GetHeaderCollection(), aTransaction.Id() );
-                //DumpHeadersL( aTransaction.Request().GetHeaderCollection(), aTransaction.Id() );
-            #endif
-            TInt authType;
-            if( IsUnauthRequest( aTransaction, authType ) )
-                {
-                // If server keeps on sending 401 resposenses. Will stop
-                // sending new requests after 3 trys.
-                if ( KMaxRetryCount == iUnauthRequestCounter )
-                    {
-                    #ifdef _DEBUG
-                        iTransportMain.WriteToLog(
-                        _L8( "  Max retry count. Stop sending auth requests to server." ) );
-                    #endif   
-                    iHttpRequest->FinaliseRequestL( KErrCancel );
-                    aTransaction.Cancel();                   
-                    }                
-                //We only support Digest => If Basic is defined, stop.
-                else if( iAuthManager.ParseHeaderL( aTransaction, authType ) )
-                    {
-                    iHttpRequest->ResendWithAuthL( authType );
-                    iAuthPending = ETrue;
-                    }
-                else
-                    {
-                    #ifdef _DEBUG
-                        iTransportMain.WriteToLog( _L8( " Basic authentication not supported" ) );
-                    #endif
-                    iHttpRequest->FinaliseRequestL( KXcapErrorAuthentication );
-                    aTransaction.Cancel();
-                    }
-                }
-            else if( iAuthPending && ( status != 401 && status != 403 ) )
-                {
-                iAuthPending = EFalse;
-                iAuthManager.SetAuthorized( ETrue );
-                }
-            else if( !CheckAuthInfoHeaderL( aTransaction.Response().GetHeaderCollection() ) )
-                {
-                //This means that something was wrong with the Authentication-Info header
-                //the server returned. Do not take any chances here, but stop.
-                #ifdef _DEBUG
-                    iTransportMain.WriteToLog( _L8( " Something's wrong with Authentication-Info => STOP" ) );
-                #endif
-                iHttpRequest->FinaliseRequestL( KXcapErrorAuthentication );
-                aTransaction.Cancel();
-                }
-            break;
-        case THTTPEvent::EGotResponseBodyData:
-            #ifdef _DEBUG
-                iTransportMain.WriteToLog( _L8( "MHFRunL() - A body part received" ) );
-            #endif
-            HandleReceivedBodyDataL( aTransaction );
-            break;
-        case THTTPEvent::EResponseComplete:
-            #ifdef _DEBUG
-                iTransportMain.WriteToLog( _L8( " * Transaction complete") );
-            #endif
-            break;
-        case THTTPEvent::ESucceeded:
-            #ifdef _DEBUG
-                iTransportMain.WriteToLog( _L8( " * Transaction succeeded") );
-            #endif
-            iHttpRequest->FinaliseRequestL( KErrNone );
-            break;
-        case THTTPEvent::EFailed:
-            {
-            TInt completion = aEvent.iStatus < 0 ? aEvent.iStatus : KErrNone;
-            #ifdef _DEBUG
-                iTransportMain.WriteToLog( _L8( " * Transaction failed - Completion: %d"), completion );
-            #endif
-            iHttpRequest->FinaliseRequestL( completion );
-            }
-            break;
-        case THTTPEvent::ERedirectedPermanently:
-            break;
-        case THTTPEvent::ERedirectedTemporarily:
-            break;
-        default:
-            {
-            if( aEvent.iStatus < KErrNone )
-                {
-                #ifdef _DEBUG
-                    iTransportMain.WriteToLog( _L8( "  * Transaction failed, stop" ) );
-                #endif
-                iHttpRequest->FinaliseRequestL( aEvent.iStatus );
-                }
-            else
-                {
-                #ifdef _DEBUG
-                    iTransportMain.WriteToLog( _L8( "  * Unknown status, stop" ) );
-                #endif
-                iHttpRequest->FinaliseRequestL( KErrUnknown );
-                }
-            }
-            break;
-        }  
-    }
-
-// ----------------------------------------------------------
-// CXcapHttpAuthManager::CheckAuthInfoHeaderL
-// 
-// ----------------------------------------------------------
-//
-TBool CXcapHttpResponse::CheckAuthInfoHeaderL( RHTTPHeaders aHeaders )
-    {
-    #ifdef _DEBUG
-        iTransportMain.WriteToLog( _L8( "CXcapHttpResponse::CheckAuthInfoHeaderL()" ) );
-    #endif
-    THTTPHdrVal fieldVal;
-    TBool authOk = ETrue;
-    TPtrC8 rawData( _L8( "" ) );
-    RStringPool spool = iHttpRequest->Session().StringPool();
-    RStringF authInfo = spool.OpenFStringL( TPtrC8( KAuthInfoParamArray[ENfoAuthInfo] ) );
-    CleanupClosePushL( authInfo );
-    RStringF prxAuthInfo = spool.OpenFStringL( TPtrC8( KAuthInfoParamArray[ENfoPrxAuthInfo] ) );
-    CleanupClosePushL( prxAuthInfo );
-    if( aHeaders.GetRawField( authInfo, rawData ) == KErrNone ||
-        aHeaders.GetRawField( prxAuthInfo, rawData ) == KErrNone )
-        {
-        TInt length = 0;
-        HBufC8* tempCopy = rawData.AllocLC();
-        TPtr8 modDesc( tempCopy->Des() );
-        while( authOk && modDesc.Length() > 0 )
-            {
-            TPtrC8 value;
-            TAuthInfoParam name = ( TAuthInfoParam )-1;
-            if( ParseAuthInfoParam( length, name, value, modDesc ) )
-                authOk = iAuthManager.ConsumeAuthInfoParamL( name, value );
-            modDesc.Delete( 0, length );
-            modDesc.TrimLeft();
-            }
-        CleanupStack::PopAndDestroy();  //tempCopy
-        }
-    CleanupStack::PopAndDestroy( 2 );  //prxAuthInfo, authInfo
-    return authOk;
-    }
-
-// ----------------------------------------------------------
-// CXcapHttpAuthManager::ParseAuthInfoParam
-// 
-// ----------------------------------------------------------
-//
-TBool CXcapHttpResponse::ParseAuthInfoParam( TInt& aLength, TAuthInfoParam& aName, TPtrC8& aValue, TPtr8& aParam )
-    {
-    TBool found = EFalse;
-    TInt delim = aParam.Locate( ',' );
-    TPtrC8 param( delim > 0 ? aParam.Left( delim ) : aParam );
-    TInt index = param.Locate( '=' );
-    if( index > 0 )
-        {
-        TPtrC8 name( param.Left( index ) );
-        TPtrC8 value( param.Mid( index + 1 ) );
-        const TInt count = sizeof( KAuthInfoParamArray ) / sizeof( KAuthInfoParamArray[0] );
-        for( TInt i = 0;!found && i < count;i++ )
-            {
-            if( name.CompareF( TPtrC8( KAuthInfoParamArray[i] ) ) == 0 )
-                {
-                aValue.Set( value );
-                aName = ( TAuthInfoParam )i;
-                found = ETrue;
-                }
-            }
-        }
-    aLength = delim > 0 ? delim + 1 : aParam.Length();
-    return found;
-    }
-
-               
-// ----------------------------------------------------------
-// CXcapHttpResponse::IsUnauthRequest
-// 
-// ----------------------------------------------------------
-//
-TBool CXcapHttpResponse::IsUnauthRequest( RHTTPTransaction aTransaction, TInt& aAuthType )
-    {
-    iUnauthRequestCounter++;
-    TInt status = aTransaction.Response().StatusCode();
-    switch( status )
-        {
-        case 401:  //Normal authentication
-            aAuthType = 401;
-            return ETrue;
-        case 407:  //Proxy authentication
-            aAuthType = 407;
-            return ETrue;
-        default:
-            return EFalse;
-        }
-    }
-       
-// ----------------------------------------------------------
-// CXcapHttpResponse::HandleReceivedBodyDataL
-// 
-// ----------------------------------------------------------
-//
-TBool CXcapHttpResponse::HandleReceivedBodyDataL( const RHTTPTransaction aTransaction )
-    {
-    #ifdef _DEBUG
-        iTransportMain.WriteToLog( _L8( "CXcapHttpResponse::HandleReceivedBodyDataL()") );
-    #endif
-    TPtrC8 bodyData;
-    MHTTPDataSupplier* respBody = aTransaction.Response().Body();
-    TBool lastChunk = respBody->GetNextDataPart( bodyData );
-    iHttpRequest->AppendDataL( bodyData );
-    respBody->ReleaseData();
-    return lastChunk;
-    }
-
-// ----------------------------------------------------------
-// CImpsHttpTransactionSender::ContentLengthL
-// 
-// ----------------------------------------------------------
-//
-TInt CXcapHttpResponse::ContentLengthL() const
-    {
-    TInt retVal = KMaxTInt;
-    THTTPHdrVal fieldValue;
-    _LIT8( KContentLength, "Content-Length" );
-    RHTTPHeaders headers = ResponseHeaderCollection();
-    RStringPool stringPool = iHttpRequest->Session().StringPool();
-    RStringF lengthString = stringPool.OpenFStringL( KContentLength );
-    headers.GetField( lengthString, 0, fieldValue );
-    lengthString.Close();
-    if( fieldValue.Type() == THTTPHdrVal::KTIntVal )
-        retVal = fieldValue.Int();
-    return retVal;
-    }
-    
-// ----------------------------------------------------
-// CXcapHttpResponse::HeaderCollection
-// 
-// ----------------------------------------------------
-//
-RHTTPHeaders CXcapHttpResponse::ResponseHeaderCollection() const
-    {
-    return iHttpRequest->Transaction().Response().GetHeaderCollection();
-    }
-
-// ----------------------------------------------------
-// CXcapHttpResponse::HeaderCollection
-// 
-// ----------------------------------------------------
-//
-RHTTPHeaders CXcapHttpResponse::RequestHeaderCollection() const
-    {
-    return iHttpRequest->Transaction().Request().GetHeaderCollection();
-    }
-
-// ----------------------------------------------------
-// CXcapHttpResponse::MHFRunError
-// HTTP Stack callback interface
-// ----------------------------------------------------
-//
-TInt CXcapHttpResponse::MHFRunError( TInt /*aInt*/, RHTTPTransaction /*aTransaction*/,
-                                    const THTTPEvent& /*aEvent*/ )
-    {
-    return KErrNone;
-    }
-    
-#ifdef _DEBUG
-// ----------------------------------------------------
-// CXcapHttpResponse::DumpHeadersL
-// 
-// ----------------------------------------------------
-//
-void CXcapHttpResponse::DumpHeadersL( RHTTPHeaders aHeaders, TInt aId )
-    {
-    iTransportMain.WriteToLog( _L( "--------------------") );
-    iTransportMain.WriteToLog( _L( "Headers of the transaction %d: "), aId );
-    RStringPool strP = iHttpRequest->Session().StringPool();
-    THTTPHdrFieldIter it = aHeaders.Fields();
-    TBuf<KMaxHeaderNameLen>  fieldName16;
-    TBuf<KMaxHeaderValueLen> fieldVal16;
-
-    while( it.AtEnd() == EFalse )
-        {
-        RStringTokenF fieldName = it();
-        RStringF fieldNameStr = strP.StringF( fieldName );
-        THTTPHdrVal fieldVal;
-        if( aHeaders.GetField( fieldNameStr, 0, fieldVal ) == KErrNone )
-            {
-            const TDesC8& fieldNameDesC = fieldNameStr.DesC();
-            fieldName16.Copy( fieldNameDesC.Left( KMaxHeaderNameLen ) );
-            switch( fieldVal.Type() )
-                {
-            case THTTPHdrVal::KTIntVal:
-                iTransportMain.WriteToLog( _L("%S: %d"), &fieldName16, fieldVal.Int() );
-                break;
-            case THTTPHdrVal::KStrFVal:
-                {
-                RStringF fieldValStr = strP.StringF( fieldVal.StrF() );
-                const TDesC8& fieldValDesC = fieldValStr.DesC();
-                fieldVal16.Copy( fieldValDesC.Left( KMaxHeaderValueLen ) );
-                iTransportMain.WriteToLog( _L( "%S: %S" ), &fieldName16, &fieldVal16 );
-                }
-                break;
-            case THTTPHdrVal::KStrVal:
-                {
-                RString fieldValStr = strP.String(fieldVal.Str());
-                const TDesC8& fieldValDesC = fieldValStr.DesC();
-                fieldVal16.Copy( fieldValDesC.Left( KMaxHeaderValueLen ) );
-                iTransportMain.WriteToLog( _L( "%S: %S" ), &fieldName16, &fieldVal16 );
-                }
-                break;
-            case THTTPHdrVal::KDateVal:
-                {
-                TDateTime date = fieldVal.DateTime();
-                TBuf<40> dateTimeString;
-                TTime t(date);
-                t.FormatL( dateTimeString,KTransportDateFormat );
-                iTransportMain.WriteToLog( _L( "%S: %S" ), &fieldName16, &dateTimeString );
-                } 
-                break;
-            default:
-                iTransportMain.WriteToLog( _L( "%S: <unrecognised value type>" ), &fieldName16 );
-                break;
-                }
-            // Display realm for WWW-Authenticate header
-            RStringF wwwAuth = strP.StringF( HTTP::EWWWAuthenticate, RHTTPSession::GetTable() );
-            if( fieldNameStr == wwwAuth )
-                {
-                // check the auth scheme is 'basic'
-                RStringF basic = strP.StringF( HTTP::EBasic,RHTTPSession::GetTable() );
-                RStringF realm = strP.StringF( HTTP::ERealm,RHTTPSession::GetTable() );
-                THTTPHdrVal realmVal;
-                if ( (fieldVal.StrF() == basic ) && 
-                    ( !aHeaders.GetParam(wwwAuth, realm, realmVal) ) )
-                    {
-                    RStringF realmValStr = strP.StringF( realmVal.StrF() );
-                    fieldVal16.Copy( realmValStr.DesC() );
-                    iTransportMain.WriteToLog( _L( "Realm is: %S" ), &fieldVal16 );
-                    }
-                }
-            }
-        ++it;
-        }
-        iTransportMain.WriteToLog( _L( "--------------------") );
-    }
-    #endif
-
-// End of File  
-