applayerpluginsandutils/httpprotocolplugins/httpclient/chttpresponseparser.cpp
branchRCL_3
changeset 40 a0da872af3fa
parent 39 c0c2f28ace9c
child 53 c59bddbfd7b9
equal deleted inserted replaced
39:c0c2f28ace9c 40:a0da872af3fa
    25 #include "chttpconnectionmanager.h"
    25 #include "chttpconnectionmanager.h"
    26 #include "chttprequestcomposer.h"
    26 #include "chttprequestcomposer.h"
    27 #include "mhttpresponseobserver.h"
    27 #include "mhttpresponseobserver.h"
    28 #include "thttpclientpanic.h"
    28 #include "thttpclientpanic.h"
    29 #include "chttpconnectioninfo.h"
    29 #include "chttpconnectioninfo.h"
       
    30 #include <e32math.h>
    30 
    31 
    31 _LIT8(KHeaderSeparator,	"\n");
    32 _LIT8(KHeaderSeparator,	"\n");
    32 
    33 
    33 CHttpResponseParser* CHttpResponseParser::NewL(CProtTransaction& aProtTrans, MRxDataObserver& aObserver, MHttpResponseObserver& aResponseObserver)
    34 CHttpResponseParser* CHttpResponseParser::NewL(CProtTransaction& aProtTrans, MRxDataObserver& aObserver, MHttpResponseObserver& aResponseObserver)
    34 	{
    35 	{
   293 					}
   294 					}
   294 				}
   295 				}
   295 			
   296 			
   296 			}
   297 			}
   297 		else
   298 		else
   298 	        {
   299 	        {		    
   299 			// Need to map to appropriate error code if the disconnect notification is
   300             // Check client has asked to return Default Error occured while Disconnect received
   300 			// asked by the client
   301             if (clientTrans->PropogateDefaultError())
       
   302                {
       
   303                NotifyObserverError(aError);             
       
   304                return;
       
   305                }
       
   306             // Need to map to appropriate error code if the disconnect notification is
       
   307             // asked by the client			
   301 			if ( clientTrans->NeedDisconnectNotification() )
   308 			if ( clientTrans->NeedDisconnectNotification() )
   302 				{
   309 				{
   303 				CHttpRequestComposer& request = static_cast<CHttpRequestComposer&>(iProtTrans->TxData());
   310 				CHttpRequestComposer& request = static_cast<CHttpRequestComposer&>(iProtTrans->TxData());
   304 				// if we are consuming response then the request has been not sent fully.
   311 				// if we are consuming response then the request has been not sent fully.
   305 				if ( ConsumingResponse () || !request.RequestSent() )
   312 				if ( ConsumingResponse () || !request.RequestSent() )
   496                  #endif
   503                  #endif
   497                  manager->AppendPipelineFailedHost(hostVal.StrF().DesC());
   504                  manager->AppendPipelineFailedHost(hostVal.StrF().DesC());
   498                  }
   505                  }
   499 		}
   506 		}
   500 		
   507 		
       
   508  		if (name.DesC().CompareF(stringPool.StringF(HTTP::EWWWAuthenticate,RHTTPSession::GetTable()).DesC()) == KErrNone)
       
   509             {
       
   510             _LIT8(KNtlmProtocolName,"NTLM");
       
   511             if (aFieldValue.FindF(KNtlmProtocolName)!= KErrNotFound)
       
   512                 {
       
   513                 CHttpClientTransaction& protTran = static_cast<CHttpClientTransaction&>(*iProtTrans);
       
   514                 CHttpConnectionManager* manager = protTran.ConnectionManager();
       
   515                 _LIT8( KNtlmConnId, "NTLMConnId" );
       
   516                 if (aFieldValue.Length() >=  4 )
       
   517                     {
       
   518                     if (manager->GetNtlmConnId() == KErrNotFound)
       
   519                         {
       
   520                         TInt ntmlConnId= Math::Random()%5789; //some magic number to get random connection  id
       
   521                         manager->SetNtlmConnId(ntmlConnId);
       
   522                         RStringF ntlmId= stringPool.OpenFStringL( KNtlmConnId );
       
   523                         CleanupClosePushL(ntlmId);
       
   524                         THTTPHdrVal value;
       
   525                         value.SetInt( ntmlConnId );
       
   526                         trans.PropertySet().SetPropertyL( ntlmId, value );
       
   527                         CleanupStack::PopAndDestroy(&ntlmId);
       
   528                         }
       
   529                     else
       
   530                         {
       
   531                         RStringF ntlmId= stringPool.OpenFStringL( KNtlmConnId );
       
   532                         CleanupClosePushL(ntlmId);
       
   533                         THTTPHdrVal value;
       
   534                         value.SetInt(manager->GetNtlmConnId());
       
   535                         trans.PropertySet().SetPropertyL( ntlmId, value );    
       
   536                         CleanupStack::PopAndDestroy(&ntlmId);
       
   537                         }
       
   538                     }
       
   539                }
       
   540             }
       
   541  		
   501 		CleanupStack::PopAndDestroy(&name);
   542 		CleanupStack::PopAndDestroy(&name);
   502 		
   543 		
   503 		if( BodyComplete() && !GotTrailers() )	
   544 		if( BodyComplete() && !GotTrailers() )	
   504 			{
   545 			{
   505 			// This was a trailer header - flag that there are trailers.
   546 			// This was a trailer header - flag that there are trailers.
   657 	iFlags |= EMessageComplete;
   698 	iFlags |= EMessageComplete;
   658 
   699 
   659 	if( !ConsumingResponse() )
   700 	if( !ConsumingResponse() )
   660 		{
   701 		{
   661 		iResponseObserver.ResponseComplete(aExcessData);
   702 		iResponseObserver.ResponseComplete(aExcessData);
   662 
       
   663 		if ( iCancellingResponse )
   703 		if ( iCancellingResponse )
   664 			{
   704 			{
   665 			return;
   705 			return;
   666 			}
   706 			}
   667 		if( GotTrailers() )
   707 		if( GotTrailers() )
   766 	}
   806 	}
   767 
   807 
   768 TBool CHttpResponseParser::NeedCompletion ()
   808 TBool CHttpResponseParser::NeedCompletion ()
   769 	{
   809 	{
   770 	RHTTPTransaction trans = iProtTrans->Transaction ();
   810 	RHTTPTransaction trans = iProtTrans->Transaction ();
   771 	if ( HTTPStatus::IsRedirection ( trans.Response().StatusCode() ) )
   811 	TInt statusCode = trans.Response().StatusCode();
       
   812 	if ( HTTPStatus::IsRedirection ( statusCode )|| statusCode == HTTPStatus::EUnauthorized )
   772 		{
   813 		{
   773 		// If it is a redirection message then we need to complete the response
   814 		// If it is a redirection message then we need to complete the response
       
   815 		// for 401 error..we have to continue on the same port..so we need to complete the response immediately
   774 		return ETrue;			
   816 		return ETrue;			
   775 		}
   817 		}
   776 	return EFalse;		
   818 	return EFalse;		
   777 	}
   819 	}
   778 
   820