xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpRequest.cpp
branchRCL_3
changeset 18 fbd2e7cec7ef
parent 0 c8caa15ef882
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpRequest.cpp	Wed Sep 01 12:23:14 2010 +0100
@@ -0,0 +1,681 @@
+/*
+* 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:   CXcapHttpRequest
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <hal.h>
+#include <e32math.h>
+#include "XdmCredentials.h"
+#include "XcapHttpRequest.h"
+#include "XcapHttpResponse.h"
+#include "XcapHttpTransport.h"
+#include "XcapHttpHeaderModel.h"
+#include "XcapHttpAuthManager.h"
+#include "XcapHttpRequestTimer.h"
+
+// ================= MEMBER FUNCTIONS =======================
+//
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::CXcapHttpRequest
+// 
+// ----------------------------------------------------------
+//
+CXcapHttpRequest::CXcapHttpRequest( RHTTPSession& aHttpSession,
+                                    CXcapHttpAuthManager& aAuthManager,
+                                    CXcapHttpTransport& aTransportMain ) :
+                                    iHttpSession( aHttpSession ),
+                                    iTransportMain( aTransportMain ),
+                                    iSent( EFalse ),
+                                    iActive( EFalse ),
+                                    iCancelled( EFalse ),
+                                    iConstructed( EFalse ),
+                                    iAuthManager( aAuthManager )
+                                        
+    {
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::BaseConstructL
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::BaseConstructL( const TDesC& aRequestUri )
+    {
+    SetRequestUriL( aRequestUri );
+    iHttpResponse = CXcapHttpResponse::NewL( this, iTransportMain );
+    iResponseBuffer = CBufSeg::NewL( 250 );
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::~CXcapHttpRequest
+// 
+// ----------------------------------------------------------
+//
+CXcapHttpRequest::~CXcapHttpRequest()
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::~CXcapHttpRequest()" ) );    
+    #endif
+    delete iExpiryTimer;
+    delete iHttpResponse;
+    delete iRequestUriBuf;
+    ReleaseResponseData();
+    delete iResponseBuffer;
+    delete iWholeUri;
+    iHeaderCollection.Close();
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::DispatchRequestL
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C void CXcapHttpRequest::DispatchRequestL( TRequestStatus& aClientStatus )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::DispatchMessageL()" ) );
+        iSendTime = TimeL();
+    #endif
+    ConstructRequestL();
+    DoSetHeadersL();
+    iCurrentDataLength = 0;
+    aClientStatus = KRequestPending;
+    iClientStatus = &aClientStatus;
+    iHttpTransaction.SubmitL();
+    SetStatus( ETrue );
+    iActive = ETrue;
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::ConstructRequest
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::ConstructRequestL()
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::ConstructRequestL() - Constructed: %d" ), iConstructed );
+    #endif
+    if( !iConstructed )
+        {    
+        RStringF method = ConstructMethodStringL();
+        CleanupClosePushL( method );
+        iHttpTransaction = iHttpSession.OpenTransactionL( iRequestUri, *iHttpResponse, method );
+        CleanupStack::PopAndDestroy();  //method
+        RHTTPHeaders hdrs = iHttpTransaction.Request().GetHeaderCollection();
+        iConstructed = ETrue;
+        }
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::UpdateRequestUriL
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C void CXcapHttpRequest::UpdateRequestUriL( const TDesC8& aUpdatedUri )
+    {
+    HBufC* temp = HBufC::NewLC( aUpdatedUri.Length() );
+    temp->Des().Copy( aUpdatedUri );
+    SetRequestUriL( temp->Des() );
+    CleanupStack::PopAndDestroy();
+    }
+    
+// ----------------------------------------------------------
+// CXcapHttpRequest::ResetUriL
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C void CXcapHttpRequest::ResetUriL( const TDesC& aNewUri )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::ResetUriL()" ) );
+    #endif
+    delete iRequestUriBuf;
+    iRequestUriBuf = NULL;
+    delete iWholeUri;
+    iWholeUri = NULL;
+    iWholeUri = HBufC8::NewL( aNewUri.Length() );
+    iWholeUri->Des().Copy( aNewUri );
+    iRequestUri.Parse( iWholeUri->Des() );
+    #ifdef _DEBUG
+        TPtrC8 address( iRequestUri.UriDes() );
+        iTransportMain.WriteToLog( _L8( "  New URI %S"), &address );
+    #endif
+    }
+    
+// ----------------------------------------------------------
+// CXcapHttpRequest::RequestUriL
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C TPtrC8 CXcapHttpRequest::RequestUriL() const
+    {
+    return iRequestUriBuf != NULL ? iRequestUriBuf->Des() : TPtrC8();
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::ResendL
+// 
+// ----------------------------------------------------------
+//
+CXcapHttpAuthManager& CXcapHttpRequest::AuthManager()
+    {
+    return iAuthManager;
+    }
+   
+// ----------------------------------------------------------
+// CXcapHttpRequest::ResendWithAuthL
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::ResendWithAuthL( TInt aAuthType )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::ResendWithAuthL() - Auth type: %d" ), aAuthType );
+    #endif
+    iHttpTransaction.Cancel();
+    if( iExpiryTimer != NULL && iExpiryTimer->IsActive() )
+    	iExpiryTimer->Cancel();
+    RHTTPHeaders hdrs = iHttpTransaction.Request().GetHeaderCollection();
+    AppendAuthorizationHeaderL( hdrs, aAuthType );
+    iHttpTransaction.SubmitL();
+    SetStatus( ETrue );
+    iActive = ETrue;
+    }
+        
+// ----------------------------------------------------------
+// CXcapHttpRequest::Transaction
+// 
+// ----------------------------------------------------------
+//
+RHTTPTransaction& CXcapHttpRequest::Transaction()
+    {
+    return iHttpTransaction;
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::RelativeUri
+// 
+// ----------------------------------------------------------
+//
+TPtrC8 CXcapHttpRequest::RelativeUri() const
+    {
+    TPtrC8 absolute( iRequestUri.UriDes() );
+    TPtrC8 temp( absolute.Mid( absolute.FindF( _L8( "//" ) ) + 2 ) );
+    return temp.Mid( temp.LocateF( '/' ) );
+    }
+    
+// ----------------------------------------------------------
+// CXcapHttpRequest::SetStatus
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::SetRequestUriL( const TDesC& aRequestUri )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetRequestUriL()") );
+    #endif
+    delete iRequestUriBuf;
+    iRequestUriBuf = NULL;
+    iRequestUriBuf = HBufC8::NewL( aRequestUri.Length() );
+    iRequestUriBuf->Des().Copy( aRequestUri );
+    TPtrC8 document = iRequestUriBuf->Des();
+    TPtrC8 root = iTransportMain.RootUri();
+    delete iWholeUri;
+    iWholeUri = NULL;
+    iWholeUri = HBufC8::NewL( root.Length() + document.Length() );
+    iWholeUri->Des().Copy( root );
+    iWholeUri->Des().Append( document );
+    iRequestUri.Parse( iWholeUri->Des() );
+    #ifdef _DEBUG
+        TPtrC8 address( iRequestUri.UriDes() );
+        iTransportMain.WriteToLog( _L8( "  URI %S"), &address );
+    #endif
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::SetStatus
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::SetStatus( const TBool aSent )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetStatus()" ) );
+    #endif
+    iSent = aSent;
+    if( iSent )
+        {
+        if( iExpiryTimer != NULL && !iExpiryTimer->IsActive() )
+            iExpiryTimer->ActivateTimer( iExpiryTime );
+        }
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetStatus(): Status %d"), iSent );
+    #endif
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::SetHeaderL
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C void CXcapHttpRequest::SetHeaderL( const TDesC8& aHeaderName,
+                                            const TDesC8& aHeaderValue )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetHeaderL()" ) );
+        iTransportMain.WriteToLog( _L8( "  Header name:    %S" ), &aHeaderName );
+        iTransportMain.WriteToLog( _L8( "  Header value:   %S" ), &aHeaderValue );
+    #endif
+    CXcapHttpHeaderModel* model = CXcapHttpHeaderModel::NewL( aHeaderName, aHeaderValue, iTransportMain );
+    CleanupStack::PushL( model );
+    User::LeaveIfError( iHeaderCollection.Append( model ) );
+    CleanupStack::Pop();  //model
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::HeaderValue
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C TPtrC8 CXcapHttpRequest::HeaderValue( const HTTP::TStrings aHeaderName ) const
+    {
+    THTTPHdrVal value;
+    RStringPool stringPool = iHttpSession.StringPool();
+    RHTTPHeaders headerCollection = iHttpTransaction.Response().GetHeaderCollection();
+    RStringF hdrName = stringPool.StringF( aHeaderName, RHTTPSession::GetTable() );
+    headerCollection.GetField( hdrName, 0, value );
+    hdrName.Close();
+    if( value.Type() == THTTPHdrVal::KStrVal )
+        return value.Str().DesC();
+    else if( value.Type() == THTTPHdrVal::KStrFVal )
+        return value.StrF().DesC();
+    else return TPtrC8();
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::DoSetHeadersL
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::DoSetHeadersL()
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::DoSetHeadersL()" ) );
+    #endif
+    TInt count = iHeaderCollection.Count();
+    RHTTPHeaders hdrs = iHttpTransaction.Request().GetHeaderCollection();
+    if( iAuthManager.IsAuthorized() )
+        AppendAuthorizationHeaderL( hdrs, KAuthTypeNormal );
+    if( iConstructed && count > 0 )
+        {
+        #ifdef _DEBUG
+            iTransportMain.WriteToLog( _L8( "--------------------" ) );
+            iTransportMain.WriteToLog( _L8( "User-set headers:" ) );
+        #endif
+        for( TInt i = 0;i < count;i++ )
+            {
+            TPtrC8 name = iHeaderCollection[i]->HeaderName();
+            TPtrC8 value = iHeaderCollection[i]->HeaderValue();
+            RStringF nameString = iHttpSession.StringPool().OpenFStringL( name );
+            CleanupClosePushL( nameString );
+            RStringF valueString = iHttpSession.StringPool().OpenFStringL( value );
+            CleanupClosePushL( valueString );
+            hdrs.SetFieldL( nameString, valueString );
+            #ifdef _DEBUG
+                iTransportMain.WriteToLog( _L8( "* %S: %S" ), &name, &value );
+            #endif
+            CleanupStack::PopAndDestroy( 2 );  //valueString, nameString
+            }
+        #ifdef _DEBUG
+            iTransportMain.WriteToLog( _L8( "--------------------" ) );
+        #endif
+        }
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::AppendAuthorizationHeaderL
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::AppendAuthorizationHeaderL( RHTTPHeaders& aHeaderCollection, TInt aAuthType )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::AppendAuthorizationHeaderL()" ) );
+    #endif
+    HBufC8* authorization = iAuthManager.AuthorizationL( *this );
+    if( authorization != NULL )
+        {
+        RemoveDuplicateAuth();
+        CleanupStack::PushL( authorization );
+        RStringF valStr = iHttpSession.StringPool().OpenFStringL( *authorization );
+        CleanupClosePushL( valStr );
+        switch( aAuthType )
+            {
+            case KAuthTypeNormal:
+                aHeaderCollection.SetFieldL( iHttpSession.StringPool().StringF( 
+                    HTTP::EAuthorization, RHTTPSession::GetTable() ), valStr );
+                break;
+            case KAuthTypeProxy:
+                aHeaderCollection.SetFieldL( iHttpSession.StringPool().StringF( 
+                    HTTP::EProxyAuthorization, RHTTPSession::GetTable() ), valStr );
+                break;
+            default:
+                #ifdef _DEBUG
+                    iTransportMain.WriteToLog( _L8( "  Default case: %d" ), aAuthType );
+                #endif
+                break;
+            }
+        CleanupStack::PopAndDestroy( 2 );  //valStr, authorization
+        }
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::RemoveDuplicateAuth
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::RemoveDuplicateAuth()
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::RemoveDuplicateAuth()" ) );
+    #endif
+    RStringPool spool = iHttpSession.StringPool();								  
+    RHTTPHeaders requestHeaders( iHttpTransaction.Request().GetHeaderCollection() );
+    //Check for existence of the header is not needed, remove both if they're there
+    requestHeaders.RemoveField( spool.StringF( HTTP::EAuthorization, RHTTPSession::GetTable() ) );
+    requestHeaders.RemoveField( spool.StringF( HTTP::EProxyAuthorization, RHTTPSession::GetTable() ) );
+    }
+               
+// ----------------------------------------------------------
+// CXcapHttpRequest::AppendDataL
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::AppendDataL( const TPtrC8& aBodyPart )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::AppendDataL() - Current: %d" ),
+                                        iCurrentDataLength );
+    #endif
+    iResponseBuffer->ResizeL( iCurrentDataLength + aBodyPart.Length() );
+    iResponseBuffer->Write( iCurrentDataLength, aBodyPart );
+    iCurrentDataLength = iCurrentDataLength + aBodyPart.Length();
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "  Current: %d" ), iCurrentDataLength );
+        iTransportMain.WriteToLog( _L8( "  Buffer size: %d" ), iResponseBuffer->Size() );
+    #endif
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::SetStatus
+// 
+// ----------------------------------------------------------
+//
+RHTTPSession& CXcapHttpRequest::Session()
+    {
+    return iHttpSession;
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::SetStatus
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C TXdmCompletionData* CXcapHttpRequest::ResponseData()
+    {
+    return &iRespData;
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::ReleaseResponseData
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C void CXcapHttpRequest::ReleaseResponseData()
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::ReleaseResponseData()" ) );
+    #endif
+    if( iRespData.iETag != NULL )
+        {
+        delete iRespData.iETag;
+        iRespData.iETag = NULL;
+        }
+    if( iRespData.iStatusText != NULL )
+        {
+        delete iRespData.iStatusText;
+        iRespData.iStatusText = NULL;
+        }
+    if( iRespData.iResponseData != NULL )
+        {
+        delete iRespData.iResponseData;
+        iRespData.iResponseData = NULL;
+        }
+    if( iConstructed )
+        {
+        iConstructed = EFalse;
+        iHttpTransaction.Close();
+        }
+    iHeaderCollection.ResetAndDestroy();
+    }
+    
+// ----------------------------------------------------------
+// CXcapHttpRequest::SetExpiryTimeL
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C void CXcapHttpRequest::SetExpiryTimeL( MXcapHttpRequestTimerCallback* /*aCallback*/,
+                                                const TTimeIntervalMicroSeconds32 aExpiryTime )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetExpiryTimeL()" ) );
+    #endif
+    if( iExpiryTimer == NULL )
+        iExpiryTimer = CXcapHttpRequestTimer::NewL( iTransportMain, this );
+    iExpiryTime = aExpiryTime;
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::FinaliseRequestL
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::FinaliseRequestL( TInt aErrorCode )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::FinaliseRequestL()" ) );
+        iTransportMain.WriteToLog( _L8( "  Error:  %d" ), aErrorCode );
+        iTransportMain.WriteToLog( _L8( "  Active: %d" ), iActive );
+    #endif
+    if( iActive )
+        {
+        iActive = EFalse;
+        if( iExpiryTimer )
+            iExpiryTimer->Cancel();
+        PrepareResponseBodyL();
+        CompileResponseDataL( aErrorCode );
+        User::RequestComplete( iClientStatus, aErrorCode );
+        delete iWholeUri;
+        iWholeUri = NULL;
+        }
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::CancelRequest
+// 
+// ----------------------------------------------------------
+//
+EXPORT_C void CXcapHttpRequest::CancelRequest()
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::CancelRequest()" ) );
+    #endif
+    if( iActive )
+        {
+        #ifdef _DEBUG
+            iTransportMain.WriteToLog( _L8( " Request is active, cancelling..." ) );
+        #endif
+        if( iExpiryTimer )
+            iExpiryTimer->Cancel();
+        iActive = EFalse;
+        iConstructed = EFalse;
+        iHttpTransaction.Close();
+        iRespData.iETag = NULL;
+        iRespData.iStatusText = NULL;
+        iRespData.iResponseData = NULL;
+        iRespData.iCompletion = KErrCancel;
+        iRespData.iHttpStatus = KErrCancel;
+        User::RequestComplete( iClientStatus, KErrCancel );
+        #ifdef _DEBUG
+            iTransportMain.WriteToLog( _L8( " Request completed with KErrCancel" ) );
+        #endif
+        }
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::CompileResponseData
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::CompileResponseDataL( TInt aErrorCode )
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L( "CXcapHttpRequest::CompileResponseData()" ) );
+    #endif
+    RHTTPResponse response = iHttpTransaction.Response();
+    TInt statusInt = response.StatusCode();
+    RStringF statusStr = response.StatusText();
+    HBufC8* statusBuf = statusStr.DesC().AllocLC();
+    TPtrC8 etagDesc( HeaderValue( HTTP::EETag ) );
+    HBufC8* eTag = etagDesc.Length() > 0 ? etagDesc.AllocL() : NULL;
+    iRespData.iETag = eTag;
+    iRespData.iHttpStatus = statusInt;
+    iRespData.iStatusText = statusBuf;
+    iRespData.iCompletion = aErrorCode;
+    iRespData.iResponseData = iFlatResponse;
+    CleanupStack::Pop();  //statusBuf
+    #ifdef _DEBUG
+        if( iRespData.iResponseData != NULL )
+            {
+            TBuf<32> response( _L( "response" ) );
+            response.AppendNum( iHttpTransaction.Id() );
+            response.Append( _L( ".xml" ) );
+            DumpResponseL( *iRespData.iResponseData, response );
+            }
+    #endif
+    }
+
+#ifdef _DEBUG
+// ---------------------------------------------------------
+// CXcapHttpRequest::DumpResponseL
+//
+// ---------------------------------------------------------
+//
+void CXcapHttpRequest::DumpResponseL( const TDesC8& aRespData, const TDesC& aDumpName ) 
+    {
+    RFile file;
+    RFs session;
+    TBuf<512> path( _L( "C:\\logs\\XDM\\"  ) ); 
+    path.Append( aDumpName );
+    User::LeaveIfError( session.Connect() );
+    TInt error( file.Replace( session, path, EFileWrite ) );
+    if( error == KErrNone )
+        {
+        file.Write( aRespData );
+        file.Close();
+        }
+    session.Close();
+    }
+#endif
+    
+// ----------------------------------------------------------
+// CXcapHttpRequest::PrepareResponseBodyL
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::PrepareResponseBodyL()
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::PrepareResponseBodyL()" ) );
+    #endif
+    iResponseBuffer->Compress();
+    TInt dataLength = iResponseBuffer->Size();
+    #ifdef _DEBUG
+        TInt contentLength = iHttpResponse->ContentLengthL();
+        if( contentLength >= 0 && contentLength < KMaxTInt )
+            {
+            TPtrC8 result;
+            contentLength == dataLength ? result.Set( _L8( "Correct" ) ) :
+                                          result.Set( _L8( "Values do not match!" ) );
+            iTransportMain.WriteToLog( _L8( "  Actual length: %d *** Content-Length: %d => %S" ),
+                                            dataLength, contentLength, &result );
+            }
+    #endif
+    if( dataLength > 0 )
+        {
+        iFlatResponse = HBufC8::NewL( dataLength );
+        TPtr8 pointer( iFlatResponse->Des() );
+        iResponseBuffer->Read( 0, pointer, dataLength );
+        //pointer.Copy( iResponseBuffer->Ptr( 0 ) );
+        iResponseBuffer->Reset();
+        iCurrentDataLength = 0;
+        }
+    }
+
+// ----------------------------------------------------------
+// CXcapHttpRequest::HandleTimerEventL
+// 
+// ----------------------------------------------------------
+//
+void CXcapHttpRequest::HandleTimerEventL()
+    {
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::HandleTimerEventL()" ) );
+    #endif
+    iHttpTransaction.Close();
+    iActive = EFalse;
+    iConstructed = EFalse;
+    iRespData.iETag = NULL;
+    iRespData.iStatusText = NULL;
+    iRespData.iResponseData = NULL;
+    iRespData.iCompletion = KErrTimedOut;
+    iRespData.iHttpStatus = KErrTimedOut;
+    User::RequestComplete( iClientStatus, KErrTimedOut );
+    #ifdef _DEBUG
+        iTransportMain.WriteToLog( _L8( " Request completed with KErrTimedOut" ) );
+    #endif
+    }
+
+// ---------------------------------------------------------
+// CXcapHttpRequest::TimeL
+// 
+// ---------------------------------------------------------
+//
+TInt CXcapHttpRequest::TimeL() const
+    {
+    TInt period = 0;
+    User::LeaveIfError( HAL::Get( HALData::ESystemTickPeriod, period ) );
+    TInt millisecsPerTick = period / 1000;
+    return User::TickCount() * millisecsPerTick;
+    }
+
+// End of file
+