applayerprotocols/httpservice/test/httpservicetest/ctestserverstreammanager.cpp
changeset 0 b16258d2340f
child 7 337070b4fa18
child 23 ea9c9681bbaf
equal deleted inserted replaced
-1:000000000000 0:b16258d2340f
       
     1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include "ctestserverstreammanager.h"
       
    17 #include <minputstream.h>
       
    18 #include <moutputstream.h>
       
    19 #include "httptestutils.h"
       
    20 #include "chttpclienttestparams.h"
       
    21 
       
    22 const TUint KCarriageReturn = '\r';
       
    23 const TUint KLineFeed       = '\n';
       
    24 const TUint KSpace          = ' ';
       
    25 
       
    26 CLocalTestServerStreamManager* CLocalTestServerStreamManager::NewL(CHTTPTestUtils& aTestUtils, MInputStream* aInStream, MOutputStream* aOutStream, CHttpClientTestParamArray& aTestParamArray)
       
    27 	{
       
    28 	CLocalTestServerStreamManager* self = new(ELeave) CLocalTestServerStreamManager(aTestUtils, aInStream, aOutStream, aTestParamArray);
       
    29 	CleanupStack::PushL(self);
       
    30 	
       
    31 	CleanupStack::Pop();	
       
    32 	return self;
       
    33 	} 
       
    34 	
       
    35 CLocalTestServerStreamManager::~CLocalTestServerStreamManager()
       
    36 	{
       
    37     if(iInputStream != NULL)
       
    38         {
       
    39         iInputStream->Close();
       
    40         }
       
    41     if(iOutputStream != NULL)
       
    42         {
       
    43         iOutputStream->Close();
       
    44         }	
       
    45 	delete iRequestStream;	
       
    46 	delete iResponseStream;
       
    47 	}
       
    48 	
       
    49 CLocalTestServerStreamManager::CLocalTestServerStreamManager(CHTTPTestUtils& aTestUtils, MInputStream* aInStream, MOutputStream* aOutStream, CHttpClientTestParamArray& aTestParamArray)
       
    50 : iTestUtils(aTestUtils),
       
    51 iInputStream(aInStream),
       
    52 iOutputStream(aOutStream),
       
    53 iTestParamArray(aTestParamArray)
       
    54 	{
       
    55     iInputStream->Bind(*this);
       
    56     iOutputStream->Bind(*this);	
       
    57 	}
       
    58 	
       
    59 // From MInputStreamObserver
       
    60 void CLocalTestServerStreamManager::ReceivedDataIndL(const TDesC8& aBuffer)
       
    61 	{
       
    62     _LIT(KTxtConnection, "Stream Manager - Data received.");
       
    63     iTestUtils.LogIt(KTxtConnection());
       
    64 	
       
    65 	if(iRequestStream == NULL)
       
    66 	    {
       
    67 	    iRequestStream = aBuffer.AllocL();
       
    68 	    }
       
    69 	else
       
    70 	    {
       
    71 	    // Check to see if the buffer needs to grow
       
    72         TInt maxLength  = iRequestStream->Des().MaxLength();
       
    73         TInt reqdLength = iRequestStream->Length() + aBuffer.Length();
       
    74 	    if (reqdLength > maxLength)
       
    75 	        {
       
    76 	        HBufC8* largerBuffer = iRequestStream->ReAllocL(maxLength + aBuffer.Length());
       
    77 
       
    78 	        // Switch buffers. The old one was removed by ReAlloc.
       
    79 	        iRequestStream = largerBuffer;
       
    80 	        }
       
    81 
       
    82 	    // Can now append confidently
       
    83 	    iRequestStream->Des().Append(aBuffer);
       
    84 	    }
       
    85 	   iInputStream->ReceivedDataRes();	    
       
    86 	ProcessRequestStreamL();
       
    87 	}
       
    88 	
       
    89 void CLocalTestServerStreamManager::SecureServerCnf()
       
    90 	{
       
    91 	}
       
    92 	
       
    93 void CLocalTestServerStreamManager::InputStreamCloseInd(TInt /* aError */)
       
    94 	{
       
    95 	iInputStream = NULL;		
       
    96 	}
       
    97 	
       
    98 void CLocalTestServerStreamManager::MInputStreamObserver_Reserved()
       
    99 	{
       
   100 	}
       
   101 	
       
   102 MHttpResponse* CLocalTestServerStreamManager::CurrentResponse()
       
   103 	{
       
   104 	return NULL;		
       
   105 	}
       
   106 	
       
   107 void CLocalTestServerStreamManager::OnReceiveTimeOut()	
       
   108 	{
       
   109 	}
       
   110 	
       
   111 // From MOutputStreamObserver
       
   112 void CLocalTestServerStreamManager::SendDataCnfL()
       
   113 	{
       
   114    _LIT(KTxtSendData, "Stream Manager - Sending data.");
       
   115     iTestUtils.LogIt(KTxtSendData());
       
   116 	
       
   117 	if(iSendingBodyData)
       
   118 	    {
       
   119 	    SendDataL ();
       
   120 	    }
       
   121 	else
       
   122 	    {
       
   123 	    if(iCurrentTestParam->RequestBody().Length() > 0)
       
   124 	        {
       
   125 	        iInputStream->ShutdownReq();
       
   126 	        return;
       
   127 	        }
       
   128 	    if(iRequestStream == NULL)
       
   129 	        return;
       
   130 	    // Remove the current request from the request stream.
       
   131 	    TPtr8 ptrStream = iRequestStream->Des();
       
   132 	    TInt lenToRemove = iCurrentTestParam->RawRequest().Length();
       
   133 	    TPtrC8 dataWindow;
       
   134 	    if(lenToRemove < iRequestStream->Length())
       
   135 	        {
       
   136 	        dataWindow.Set(iRequestStream->Mid(lenToRemove));
       
   137 	        }
       
   138 	    TPtrC8 dataToCompare(iRequestStream->Ptr(), lenToRemove);
       
   139 	    if(!iCurrentTestParam->IsFileSending() && iCurrentTestParam->RawRequest().CompareF(dataToCompare) != 0)
       
   140 	        {
       
   141 	        User::Leave(KErrCorrupt);
       
   142 	        }
       
   143 	    delete iRequestStream;
       
   144         iRequestStream = NULL;
       
   145         iRequestStream = dataWindow.AllocL();
       
   146 	        
       
   147 	    if(iRequestStream->Length() > 0)
       
   148 	        {
       
   149 	        iCurrentTestParam = NULL;
       
   150 	        iSendingBodyData = EFalse;
       
   151 	        ProcessRequestStreamL();
       
   152 	        }
       
   153 	    }
       
   154 	}
       
   155 	
       
   156 void CLocalTestServerStreamManager::SecureClientCnf()
       
   157 	{
       
   158 	}
       
   159 	
       
   160 void CLocalTestServerStreamManager::OutputStreamCloseInd(TInt /* aError */)
       
   161 	{
       
   162 	iOutputStream = NULL;		
       
   163 	}
       
   164 	
       
   165 void CLocalTestServerStreamManager::MOutputStreamObserver_Reserved()
       
   166 	{
       
   167 	}
       
   168 
       
   169 void CLocalTestServerStreamManager::OnSendTimeOut()
       
   170     {
       
   171     }
       
   172 
       
   173 TInt CLocalTestServerStreamManager::SendTimeOutVal()
       
   174 	{
       
   175 	return 0;
       
   176 	}
       
   177 
       
   178 void CLocalTestServerStreamManager::SendDataL()
       
   179     {
       
   180     delete iResponseStream;
       
   181     iResponseStream = NULL;
       
   182     if(!iSendingBodyData)
       
   183         {
       
   184         iResponseStream = iCurrentTestParam->RawResponse().AllocL();
       
   185         iSendingBodyData = ETrue;
       
   186         }
       
   187     else
       
   188         {
       
   189         delete iResponseStream;
       
   190         iResponseStream = NULL;
       
   191         _LIT8(KPostMethod, "POST");
       
   192         if(iCurrentTestParam->RequestBody().Length() == 0 && iCurrentTestParam->Method().CompareF(KPostMethod()) == 0)
       
   193             {
       
   194             iCurrentTestParam->SinkFile().Close();
       
   195             iInputStream->ShutdownReq();
       
   196             return;
       
   197             }
       
   198         if(iCurrentTestParam->IsFileSending())
       
   199             {
       
   200             iResponseStream = iCurrentTestParam->ReadFromFile().AllocL();
       
   201             iSendingBodyData = iCurrentTestParam->IsPendingRead();
       
   202             }
       
   203         else
       
   204             {
       
   205             if(iCurrentTestParam->ResponseBody().Length() > 0)
       
   206                 {
       
   207                 iResponseStream = iCurrentTestParam->ResponseBody().AllocL();
       
   208                 }
       
   209             iSendingBodyData = EFalse;
       
   210             }
       
   211         
       
   212         
       
   213         }
       
   214     if(iResponseStream)
       
   215         iOutputStream->SendDataReqL(*iResponseStream);
       
   216     }
       
   217 
       
   218 void CLocalTestServerStreamManager::ProcessRequestStreamL()
       
   219     {
       
   220     if(iSendingBodyData)
       
   221         return;
       
   222     _LIT8(KResponseTimeoutURI, "GET /index17.html HTTP/1.1\r\nHost: 127.0.0.1\r\nUser-Agent: HTTP Client API Test\r\n\r\n");
       
   223     // First see whether we received a request. by checking whether the startline
       
   224     // exists.
       
   225     _LIT8(KLineEnd, "\r\n");
       
   226     TPtrC8 ptrStream(*iRequestStream);
       
   227     TInt pos = ptrStream.FindF(KLineEnd);
       
   228     if(pos != KErrNotFound)
       
   229         {
       
   230         // Ok now we have a URI that matches. Now check if the URI is a timeout URI.
       
   231         if(ptrStream.CompareF(KResponseTimeoutURI) != 0)
       
   232             {
       
   233             _LIT8(KPostMethod, "POST");
       
   234             TPtrC8 startLine = ptrStream.Left(pos);
       
   235             iCurrentTestParam = iTestParamArray.MatchingParam(startLine); 
       
   236             if(iCurrentTestParam && !iCurrentTestParam->NeedDisconnection() &&  iCurrentTestParam->Method().CompareF(KPostMethod) != 0
       
   237                     && (iCurrentTestParam->ResponseBody().Length() > 0 || iCurrentTestParam->IsFileSending()))
       
   238                 {            
       
   239                 SendDataL();
       
   240                 }
       
   241             else if(iCurrentTestParam && iCurrentTestParam->NeedDisconnection())
       
   242                 {
       
   243                 iInputStream->ShutdownReq();
       
   244                 } 
       
   245             else if(iCurrentTestParam && (ptrStream.Length() == iCurrentTestParam->RawRequest().Length()) && !iCurrentTestParam->IsFileSending())
       
   246                 {
       
   247                 SendDataL();
       
   248                 }
       
   249             
       
   250             if(iCurrentTestParam && iCurrentTestParam->Method().CompareF(KPostMethod) == 0 && iCurrentTestParam->IsFileSending() && iCurrentTestParam->RequestBody().Length() == 0)
       
   251                 {
       
   252                 iWritingUploadFile = ETrue;
       
   253                 }
       
   254             }
       
   255         }
       
   256     if(iWritingUploadFile)
       
   257         {
       
   258         iCurrentTestParam->WriteToFile(ptrStream);
       
   259         delete iRequestStream;
       
   260         iRequestStream = NULL;
       
   261         TInt reqLen =  iCurrentTestParam->RawRequest().Length();
       
   262         TInt totalLen = (reqLen + iCurrentTestParam->SendingFileSize());
       
   263         if(iCurrentTestParam->ReceivingFileSize() == totalLen)
       
   264             {
       
   265             SendDataL();
       
   266             }
       
   267         }
       
   268     }