diff -r e8c1ea2c6496 -r 8758140453c0 http/src/testhttpbuffersizestep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/http/src/testhttpbuffersizestep.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,261 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Contains implementation of CTestHttpBufferSizeStep class +// @internalAll +// +// + +// System Include +// for StartC32() +#include +#include +#include + +// User Include +#include "testhttpbuffersizestep.h" + +// File system root +_LIT(KFileSystemRoot,"C:\\"); + +// Standard headers used by default +_LIT8(KUserAgent, "TestHttpBufferSize"); +_LIT8(KAccept, "*/*"); + + +/** +Constructor: Sets the test step name. +@internalTechnology +@test +*/ +CTestHttpBufferSizeStep::CTestHttpBufferSizeStep() + { + //Call base class method to set human readable name for test step + SetTestStepName(KTestHttpBufferSizeStep); + //Set the iChunkSize to the default buffer size of 6144 Bytes + iChunkSize = 1024; + } + + +/** +Destructor: Closes the iFileServ. +@internalTechnology +@test +*/ +CTestHttpBufferSizeStep::~CTestHttpBufferSizeStep() + { + } + + +/** +Sets the proxy and HttpDataOptimiser implemetation to session +based on the patameter values in ini file and calls InvokeHttpMethodL() +@internalTechnology +@test +@param None +@return None +*/ +void CTestHttpBufferSizeStep::StartClientL() + { + TPtrC uri; + + if (!GetStringFromConfig(ConfigSection(), KIniUri, uri)) + { + ERR_PRINTF2(_L("Problem in reading values from ini. \ + \nExpected fields are: \n%S\n" + ),&KIniUri); + SetTestStepResult(EFail); + return; + } + + THTTPHdrVal hdrVal ( 1024 ); + RHTTPConnectionInfo httpConnInfo = iSess.ConnectionInfo(); + httpConnInfo.SetPropertyL ( iSess.StringPool().StringF(HTTP::ERecvBufferSize,RHTTPSession::GetTable()), hdrVal ); + INFO_PRINTF1(_L("Receive buffer size has been set to 1024 bytes\n")); + + RStringPool strP = iSess.StringPool(); + RStringF method; + + // method + method = strP.StringF(HTTP::EGET,RHTTPSession::GetTable()); + TBuf8<256> url8; + url8.Copy(uri); + TRAPD(err,InvokeHttpMethodL(url8, method)); + if (err != KErrNone) + { + ERR_PRINTF2(_L("Teststep Failed: Leave occured in CTestHttpBufferSizeStep::InvokeHttpMethodL: %D\n" + ),err + ); + SetTestStepResult(EFail); + } + method.Close(); + ValidateTest(); + } + + +/** +Invoke the http method +This actually creates the transaction, sets the headers and HttpDataOptimiser implemetation to transaction +and then starts the transaction +@internalTechnology +@test +@param aUri Requested uri +@param aMethod Requested method +@return None +*/ +void CTestHttpBufferSizeStep::InvokeHttpMethodL(const TDesC8& aUri, RStringF aMethod) + { + + TUriParser8 uri; + uri.Parse( aUri ); + + // Opening a transaction + iTrans = iSess.OpenTransactionL(uri, *this, aMethod); + RHTTPHeaders hdr = iTrans.Request().GetHeaderCollection(); + // Add headers appropriate to all methods + SetHeaderL(hdr, HTTP::EUserAgent, KUserAgent); + SetHeaderL(hdr, HTTP::EAccept, KAccept); + + // submit the transaction + iTrans.SubmitL(); + // Start the scheduler, once the transaction completes or is cancelled on an error the scheduler will be + // stopped in the event handler + CActiveScheduler::Start(); + } + + +/** +This is the implementation of interface method CTestHttpBufferSizeStep::MHFRunL +If there is a reponse body it will be copied to a file. +Just printing the fired events to the log file. +@internalTechnology +@test +@param aTransaction Transaction which is being processed currently +@param THTTPEvent Event for which it is called +@return None +*/ +void CTestHttpBufferSizeStep::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent) + { + switch (aEvent.iStatus) + { + case THTTPEvent::EGotResponseHeaders: + { + // HTTP response headers have been received. We can determine now if there is + // going to be a response body to save. + RHTTPResponse resp = aTransaction.Response(); + TInt status = resp.StatusCode(); + RStringF statusStr = resp.StatusText(); + TBuf<32> statusStr16; + statusStr16.Copy(statusStr.DesC()); + INFO_PRINTF3(_L("Status: %D (%S)\n"),status, &statusStr16); + + if (resp.HasBody() && (status >= 200) && (status < 300) && (status != 204)) + { + TInt dataSize = resp.Body()->OverallDataSize(); + if (dataSize >= 0) + INFO_PRINTF2(_L("Response body size is %d\n"), dataSize); + else + INFO_PRINTF1(_L("Response body size is unknown\n")); + } + } break; + case THTTPEvent::EGotResponseBodyData: + { + // Get the body data supplier + iRespBody = aTransaction.Response().Body(); + INFO_PRINTF1(_L("Receiving response body...\n")); + + TPtrC8 bodyData; + TBool lastChunk = iRespBody->GetNextDataPart(bodyData); + if(bodyData.Size() > iChunkSize) + { + iChunkSize = bodyData.Size(); + } + iRespBody->ReleaseData(); + } break; + case THTTPEvent::EResponseComplete: + { + // The transaction's response is complete + INFO_PRINTF1(_L("\nTransaction Complete\n")); + } break; + case THTTPEvent::ESucceeded: + { + INFO_PRINTF1(_L("Transaction Successful\n")); + aTransaction.Close(); + CActiveScheduler::Stop(); + } break; + case THTTPEvent::EFailed: + { + INFO_PRINTF1(_L("Transaction Failed\n")); + aTransaction.Close(); + CActiveScheduler::Stop(); + } break; + case THTTPEvent::ERedirectedPermanently: + { + INFO_PRINTF1(_L("Permanent Redirection\n")); + } break; + case THTTPEvent::ERedirectedTemporarily: + { + INFO_PRINTF1(_L("Temporary Redirection\n")); + } break; + case THTTPEvent::ERedirectRequiresConfirmation: + { + // 301(Moved Permanently), 302(Found) or 307(Temporary Redirect) status is received + // from a transaction and hence ERedirectRequiresConfirmation is sent by filter + // client has opted to close the transaction + INFO_PRINTF1(_L("Redirect requires confirmation\n")); + aTransaction.Close(); + CActiveScheduler::Stop(); + } break; + default: + { + INFO_PRINTF2(_L("\n"), aEvent.iStatus); + // close off the transaction if it's an error + if (aEvent.iStatus < 0) + { + aTransaction.Close(); + CActiveScheduler::Stop(); + } + } break; + } + } + + +/** +This is the implementation of interface method CTestHttpBufferSizeStep::MHFRunError +@internalTechnology +@test +@param aError Error which has been raised. +@param aTransaction Transaction which is being processed currently +@param THTTPEvent Event which it is being handled currently. +@return None +*/ +TInt CTestHttpBufferSizeStep::MHFRunError(TInt aError, RHTTPTransaction /*aTransaction*/, const THTTPEvent& /*aEvent*/) + { + INFO_PRINTF2(_L("MHFRunError fired with error code %D\n"), aError); + return KErrNone; + } + +void CTestHttpBufferSizeStep::ValidateTest() + { + if(iChunkSize <= 1024) + { + ERR_PRINTF1(_L("Teststep Passed: Buffer Size Feature is working\n")); + } + else + { + ERR_PRINTF2(_L("Received a chunk of size: %D\n"), iChunkSize); + ERR_PRINTF1(_L("Received a chunk of size greater than the specified size of 1024 Bytes.\n")); + ERR_PRINTF1(_L("Teststep Failed: Buffer Size Feature is not working\n")); + SetTestStepResult(EFail); + } + }