applayerprotocols/httptransportfw/Test/T_HttpIntegration/HttpTransactionCmds.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httptransportfw/Test/T_HttpIntegration/HttpTransactionCmds.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,615 @@
+// Copyright (c) 2002-2009 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:
+// $Header$
+// This module implements the collection of HTTP Transaction test classes
+// by:		mjdavey, symbian@mjdss.com, August 2002
+// for:	Typhoon (7.0s) & JetStream (8.0)
+// Include Files  
+// 
+//
+
+#include <e32base.h>
+#include "CHTTPFamily.h"
+#include "HttpFrmwrk.h"
+#include "HttpTransactionCmds.h"
+#include "httptransaction.h"
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//	Command:	TRANSACTION command.
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//
+//	Form(s):
+//				TRANSACTION <connection name> <method> 
+//				TRANSACTION <connection name> <method> <URI>
+//	Example:	
+//				a)	TRANSACTION framework1 get $URI$
+//				b)	TRANSACTION framework2 get "http://news.bbc.co.uk/nol/shared/img/global_toolbar/logo.gif"
+//				c)	TRANSACTION framework2 post 
+//
+//	this assumes that <connection name> has already been defined (see CONNECT)
+//	examp a) assumes that define URI has already been created (see DEFINE) 
+//	examp b) is full form
+//	examp c) is for post and will be detailed later
+
+CCmdTransaction *CCmdTransaction::NewL(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase)
+	{
+	CCmdTransaction *self = NewLC( aCommandId, aKeyphrase, aHelpPhrase);
+	CleanupStack::Pop();
+	return self; 
+	}
+
+//-----------------------------------------------------------------------------
+
+CCmdTransaction *CCmdTransaction::NewLC(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase)
+	{
+	CCmdTransaction *self = new (ELeave) CCmdTransaction();
+	CleanupStack::PushL( self );
+	self->ConstructL(aCommandId, aKeyphrase, aHelpPhrase);
+	return self;
+	}
+
+//-----------------------------------------------------------------------------
+
+void CCmdTransaction::ConstructL(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase)
+	{
+	CCmdBase::ConstructL(aCommandId, aKeyphrase, aHelpPhrase);
+
+	//	set local vars for convenience
+	iTransactionIndex = -1;
+	iExpectedError = 0;
+	iExpectError = EFalse;
+	iTestFail = 0;
+	iExpectedStatusCode = 200;
+	eStrIndex = HTTP::ECONNECT;
+	iHasARequestBody = EFalse;
+	iExpectedNumberRedirects = 0;
+	}
+
+//-----------------------------------------------------------------------------
+
+CCmdTransaction::~CCmdTransaction(void) {}
+	
+//-----------------------------------------------------------------------------
+//	This must have three parameters: <connection tagname> <methodname> and <uri>
+//	the tagname must be checked against existing valid tags and the methodname
+//	against a list of our creation. the URI may be an existing define or 
+//	a string
+
+TInt CCmdTransaction::ProcessL(const TDesC& aCommand)
+	{
+
+	// Complete the test machine - will then get the next cmd
+	Machine()->CompleteRequest();
+
+	TPtrC transname;
+	TPtrC conname;
+	TPtrC transmthd;
+	TPtrC transURI;
+	TPtrC postData;
+
+	TInt error;
+	// ParseCmdArgs indirectly sets eStrIndex
+	
+	if (( error = ParseCmdArgs( aCommand, 
+							    transname, 
+								conname, 
+								transmthd, 
+								transURI, 
+								postData)) != KErrNone)
+		return error;
+
+	if (conname.Size() == 0)
+		{
+		(void) ShowTransactions () ;
+		return error;
+		}
+
+	//	Get the session object we need
+	//	If it is return error, if not create a session and ptr!
+
+	CAnyObject *cnx = (CAnyObject *)Machine()->Domains()->Name(conname);
+	
+	if (cnx == NULL)//	does not already exists
+		return Error(KErrArgument, THA_KErrInvalidConnect, &conname);
+	else
+		{
+		//	reset the received status 
+		iReceivedError = -1;
+
+		CFrmwrkSession *myConnection = (CFrmwrkSession *) cnx->Ptr();
+		// TPtrC myName = myConnection->Name() ;
+		
+		RHTTPSession mySession = myConnection->Session();
+	
+		CTestTransaction *transaction = NULL;
+
+		TRAPD(err, transaction = CTestTransaction::NewL( mySession,
+														 eStrIndex, 
+		                                                 transURI, 
+		                                                 postData, 
+		                                                 transname,
+		                                                 Machine()));
+		if (err != KErrNone) 
+			{
+			Log(_L("Failed to create Transaction %S"), &transname);
+			return err;
+			}
+		else
+			{
+			Log(_L("Transaction %S created successfully"), &transname);
+			}
+
+		TRAP ( err, transaction->SubmitL());
+
+		if (err != KErrNone) 
+			{
+			Log(_L("Transaction %S,  Submission failed"), &transname);
+			return err;
+			}
+		else
+			{
+			Log(_L("Transaction %S,  Submission succeeded"), &transname);
+			}
+
+
+		Machine()->Domains()->AddL(transname, eStrIndex, THA_KHTTP_Transaction, (TAny *) transaction);
+		}
+
+	if (error != KErrNone)
+		Log(TFR_KFmtErrFailed, &Keyphrase(), error);
+
+	return error;
+}
+
+//-----------------------------------------------------------------------------
+
+TInt CCmdTransaction::ParseCmdArgs( const TDesC& aCommand, 
+								    TPtrC& aTransName,
+								    TPtrC& aConName, 
+									TPtrC& aTransMthd, 
+									TPtrC& aTransURI,
+									TPtrC& aPostData)
+	{
+	aConName.Set(NULL, 0);
+	aTransName.Set(NULL, 0);
+	aTransMthd.Set(NULL, 0);
+	aTransURI.Set(NULL, 0);
+	aPostData.Set(NULL, 0);
+
+	//	get the command into a local string
+	TPtrC param;
+	TInt error = KErrNone;
+	TRAP(error, param.Set( ParamsL(aCommand)));
+	if (error != KErrNone)
+		return Error(error, TFR_KFmtErrBadCmd, &Keyphrase());
+
+	//	check its' valid
+	TLex parse(param);
+	if (!parse.Eos() && !parse.Peek().IsSpace())
+		return Error(error, TFR_KFmtErrBadCmd, &parse);
+
+	//	remove any spaces and see if its got params
+	parse.SkipSpace();
+	if (parse.Eos())	// If no params, print out present connections.
+		return error;
+
+	//-----------------------------
+	//	Get transaction name, must not exceed 16 characters.
+
+	TRAP(error, aTransName.Set(TfrLex::GetL(parse)));
+	if ( error != KErrNone) 
+		return Error(KErrArgument, TFR_KFmtErrBadCmd, &aTransName);
+
+	//	check transaction name is valid length
+	aTransName.Set(TfrLex::Peel(aTransName));
+
+	if (aTransName.Length() > 16) 
+		return Error(KErrArgument, THA_KErrParameterLong, &aTransName);
+
+	if (aTransName.Length() <= 0)
+		return Error(KErrArgument, TFR_KFmtErrMissingParams, &Keyphrase());
+
+	CAnyObject *cnx = (CAnyObject *)Machine()->Domains()->Name(aTransName);
+	
+	if (cnx != NULL)		//	already exists
+		return Error(KErrAlreadyExists, THA_KErrCnxionExists, &aTransName);
+
+
+	//-----------------------------
+	//	Get framework name, must not exceed 16 characters.
+	//	should be http or wsp (currently)
+
+	TRAP(error, aConName.Set(TfrLex::GetL(parse)));
+	if ( error != KErrNone) 
+		return Error(KErrArgument, TFR_KFmtErrBadCmd, &aConName);
+
+	//	check connection name is valid length
+	aConName.Set(TfrLex::Peel(aConName));
+	if (aConName.Length() > 16) 
+		return Error(KErrArgument, THA_KErrParameterLong, &aConName);
+
+	if (aConName.Length() <= 0)
+		return Error(KErrArgument, TFR_KFmtErrMissingParams, &Keyphrase());
+
+	//	check connection name exists
+	if (!checkConnectionExists(aConName))
+		return Error(KErrArgument, THA_KErrConnectionNotExists, &aConName);
+
+	//-----------------------------
+	// Get method value.
+	TRAP(error, aTransMthd.Set(TfrLex::GetL(parse)));
+	if (error != KErrNone) 
+		return Error(KErrArgument, TFR_KFmtErrBadCmd, &aTransMthd);
+
+	//	check method name is valid length
+	aTransMthd.Set(TfrLex::Peel(aTransMthd));
+	if (aTransMthd.Length() > 16) 
+		return Error(KErrArgument, THA_KErrParameterLong, &aTransMthd);
+
+	if (aTransMthd.Length() <= 0)
+		return Error(KErrArgument, TFR_KFmtErrMissingParams, &Keyphrase());
+
+	//	check method defined
+	if (!checkMethodExists(aTransMthd))
+		return Error(KErrArgument, THA_KErrMethodNotExists, &aTransMthd);
+
+	//-----------------------------
+	// Get URI value.
+
+	TRAP(error, aTransURI.Set(TfrLex::GetL(parse)));
+	if (error != KErrNone) 
+		return Error(KErrArgument, TFR_KFmtErrBadCmd, &aTransURI);
+
+	//	uri's may be enormous so lets not bother worrying about length!
+	aTransURI.Set(TfrLex::Peel(aTransURI));
+
+	if (aTransURI.Length() <= 0)
+		return Error(KErrArgument, TFR_KFmtErrMissingParams, &Keyphrase());
+
+	//-----------------------------
+	//	Get Additional Parameters
+	//	some commands (e.g. POST) may require an additional parameter
+	//	to provide either filename (for source data) or block of text
+	//	for posting...
+
+	TRAP(error, aPostData.Set(TfrLex::GetL(parse)));
+	if (error != KErrNone) 
+		return Error(KErrArgument, TFR_KFmtErrBadCmd, &aPostData);
+
+	//	datablocks and filenames may be enormous so lets not bother worrying about length!
+	aPostData.Set(TfrLex::Peel(aPostData));
+
+	//-----------------------------
+	//	There should not be anything more (currently)
+	//  Future additions MAY required optional parameters and therefore the following may
+	//	need to be dumped...
+
+	TPtrC remainder = TfrLex::Trim(parse.Remainder());
+	if (remainder.Length() > 0) 
+		return Error(KErrArgument, TFR_KFmtErrBadCmd, &remainder);
+
+	aConName.Set(TfrLex::Peel(aConName));
+	return (KErrNone);
+	}
+
+void CCmdTransaction::ShowTransactions() 
+	{
+	TInt iTrans = 0;
+	
+	CObjCatalogue *trnsctns = Machine()->Domains();
+	Log(_L("\tCurrent Transactions:"));
+	Log(_L("\tName  \tMethod  \tURI"));
+	for (TInt i = 0; i < trnsctns->Count(); ++i)
+		{
+		CAnyObject *obj = (CAnyObject *)trnsctns->At(i);
+		if (obj->Tag() == THA_KHTTP_Transaction)
+			{
+			TPtrC label = obj->Name();
+			TInt eStrIndex = obj->Index();
+			CTestTransaction *trans = (CTestTransaction *)obj->Ptr();
+			TBuf<256> uri;
+			uri.Copy (trans->Uri()) ;
+									
+			TPtrC mthd;
+						
+			switch (eStrIndex)
+				{
+				case HTTP::EGET : mthd.Set(THA_TxtCmdTransactionGET); break;
+				case HTTP::EPOST : mthd.Set(THA_TxtCmdTransactionPOST); break;
+				case HTTP::EPUT : mthd.Set(THA_TxtCmdTransactionPUT); break;
+				case HTTP::EDELETE : mthd.Set(THA_TxtCmdTransactionDELETE); break;
+				case HTTP::EHEAD : mthd.Set(THA_TxtCmdTransactionHEAD); break;
+				case HTTP::EOPTIONS : mthd.Set(THA_TxtCmdTransactionOPTIONS); break;
+				case HTTP::ETRACE : mthd.Set(THA_TxtCmdTransactionTRACE); break;
+				default : break;
+				}
+			++iTrans;
+			Log(_L("\t%d\t%S\t%S\t%S"), iTrans, 
+				&label, 
+				&mthd,
+				&uri);
+			}
+		}
+	if (iTrans == 0)
+		Log(_L("\tNo transactions have been defined"));
+	}
+
+//-----------------------------------------------------------------------------
+//	check connection name exists
+//	we have to connect to the object catalogue and look at sessions!
+
+TBool CCmdTransaction::checkConnectionExists(TPtrC &aName)
+	{
+	CObjCatalogue *sessions = Machine()->Domains();
+	for (TInt i = 0; i < sessions->Count(); ++i)
+		{
+		CAnyObject *obj = (CAnyObject *)sessions->At(i);
+		if (obj->Tag() == THA_KHTTP_Connect)
+			{
+			TPtrC sessname = obj->Name();
+			if (sessname.CompareF(aName) == 0)
+				return ETrue;
+			}
+		}
+
+	return EFalse;
+	}
+
+
+//-----------------------------------------------------------------------------
+//	check method name exists
+//	we have to compare supplied name to our existing list of method
+//	use crude compare for now, but perhaps add more elegant list facility?!
+//	the enums are from HttpStringConstants.h and should not be interferred with!!!
+
+TBool CCmdTransaction::checkMethodExists(TPtrC &aName)
+	{
+	if (aName.CompareF(THA_TxtCmdTransactionGET) == 0) 
+		{
+		eStrIndex = HTTP::EGET;
+		return ETrue;
+		}
+	else if (aName.CompareF(THA_TxtCmdTransactionPOST) == 0) 
+		{
+		eStrIndex = HTTP::EPOST;
+		return ETrue;
+		}
+	else if (aName.CompareF(THA_TxtCmdTransactionPUT) == 0) 
+		{
+		eStrIndex = HTTP::EPUT;
+		return ETrue;
+		}
+	else if (aName.CompareF(THA_TxtCmdTransactionHEAD) == 0) 
+		{
+		eStrIndex = HTTP::EHEAD;
+		return ETrue;
+		}
+	else if (aName.CompareF(THA_TxtCmdTransactionDELETE) == 0) 
+		{
+		eStrIndex = HTTP::EDELETE;
+		return ETrue;
+		}
+	else if (aName.CompareF(THA_TxtCmdTransactionOPTIONS) == 0) 
+		{
+		eStrIndex = HTTP::EOPTIONS;
+		return ETrue;
+		}
+	else if (aName.CompareF(THA_TxtCmdTransactionTRACE) == 0) 
+		{
+		eStrIndex = HTTP::ETRACE;
+		return ETrue;
+		}
+
+	return EFalse;
+	}
+
+
+CCmdEndTransaction *CCmdEndTransaction::NewL(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase)
+	{
+	CCmdEndTransaction *self = NewLC( aCommandId, aKeyphrase, aHelpPhrase);
+	CleanupStack::Pop();
+	return self; 
+	}
+
+//-----------------------------------------------------------------------------
+
+CCmdEndTransaction *CCmdEndTransaction::NewLC(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase)
+	{
+	CCmdEndTransaction *self = new (ELeave) CCmdEndTransaction();
+	CleanupStack::PushL( self );
+	self->ConstructL(aCommandId, aKeyphrase, aHelpPhrase);
+	return self;
+	}
+
+//-----------------------------------------------------------------------------
+
+void CCmdEndTransaction::ConstructL(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase)
+	{
+	CCmdBase::ConstructL(aCommandId, aKeyphrase, aHelpPhrase);
+	}
+
+//-----------------------------------------------------------------------------
+
+CCmdEndTransaction::~CCmdEndTransaction(void) {}
+
+//-----------------------------------------------------------------------------
+
+TInt CCmdEndTransaction::ParseCmdArgs( const TDesC& aCommand, 
+								    TPtrC& aTransName)
+	{
+	aTransName.Set(NULL, 0);
+
+	//	get the command into a local string
+	TPtrC param;
+	TInt error = KErrNone;
+	TRAP(error, param.Set( ParamsL(aCommand)));
+	if (error != KErrNone)
+		return Error(error, TFR_KFmtErrBadCmd, &Keyphrase());
+
+	//	check its' valid
+	TLex parse(param);
+	if (!parse.Eos() && !parse.Peek().IsSpace())
+		return Error(error, TFR_KFmtErrBadCmd, &parse);
+
+	//	remove any spaces and see if its got params
+	parse.SkipSpace();
+	if (parse.Eos())	// If no params, print out present connections.
+		return error;
+
+	//-----------------------------
+	//	Get transaction name, must not exceed 16 characters.
+
+	TRAP(error, aTransName.Set(TfrLex::GetL(parse)));
+	if ( error != KErrNone) 
+		return Error(KErrArgument, TFR_KFmtErrBadCmd, &aTransName);
+
+	//	check transaction name is valid length
+	aTransName.Set(TfrLex::Peel(aTransName));
+
+	if (aTransName.Length() > 16) 
+		return Error(KErrArgument, THA_KErrParameterLong, &aTransName);
+
+	if (aTransName.Length() <= 0)
+		return Error(KErrArgument, TFR_KFmtErrMissingParams, &Keyphrase());
+
+	return (KErrNone);
+	}
+
+
+TInt CCmdEndTransaction::ProcessL(const TDesC& aCommand)
+	{
+	// Complete the test machine - will then get the next cmd
+	Machine()->CompleteRequest();
+
+	TPtrC transname;
+	
+	TInt error = KErrNone;
+		
+	if (( error = ParseCmdArgs( aCommand, 
+							    transname)) != KErrNone)
+		return error;
+
+	CAnyObject *obj = (CAnyObject *)Machine()->Domains()->Name(transname);
+	
+	if ((obj == NULL) || (obj->Tag() != THA_KHTTP_Transaction))
+		return Error(KErrArgument, THA_KErrInvalidTransaction, &transname);
+	
+	CTestTransaction *transaction = (CTestTransaction *) obj->Ptr();
+
+	transaction->CloseTransaction();
+	delete transaction;
+	
+	Machine()->Domains()->Delete(transname);
+
+	return error;
+}
+
+CCmdShowTransaction *CCmdShowTransaction::NewL(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase)
+	{
+	CCmdShowTransaction *self = NewLC( aCommandId, aKeyphrase, aHelpPhrase);
+	CleanupStack::Pop();
+	return self; 
+	}
+
+//-----------------------------------------------------------------------------
+
+CCmdShowTransaction *CCmdShowTransaction::NewLC(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase)
+	{
+	CCmdShowTransaction *self = new (ELeave) CCmdShowTransaction();
+	CleanupStack::PushL( self );
+	self->ConstructL(aCommandId, aKeyphrase, aHelpPhrase);
+	return self;
+	}
+
+//-----------------------------------------------------------------------------
+
+void CCmdShowTransaction::ConstructL(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase)
+	{
+	CCmdBase::ConstructL(aCommandId, aKeyphrase, aHelpPhrase);
+	}
+
+//-----------------------------------------------------------------------------
+
+CCmdShowTransaction::~CCmdShowTransaction(void) {}
+
+//-----------------------------------------------------------------------------
+
+
+TInt CCmdShowTransaction::ProcessL(const TDesC& aCommand)
+	{
+	// Complete the test machine - will then get the next cmd
+	Machine()->CompleteRequest();
+	
+	TPtrC param;
+	TInt error = KErrNone;
+	TRAP(error, param.Set( ParamsL(aCommand)));
+	if (error != KErrNone)
+		return Error(error, TFR_KFmtErrBadCmd, &Keyphrase());
+	
+	CObjCatalogue *trnsctns = Machine()->Domains();
+	TInt iTrans = 0;
+
+	Log(_L("\tCurrent Transactions:"));
+	Log(_L("\tName  \tMethod  \tURI"));
+	for (TInt i = 0; i < trnsctns->Count(); ++i)
+		{
+		CAnyObject *obj = (CAnyObject *)trnsctns->At(i);
+		if (obj->Tag() == THA_KHTTP_Transaction)
+			{
+			TPtrC label = obj->Name();
+			TInt eStrIndex = obj->Index();
+			CTestTransaction *trans = (CTestTransaction *)obj->Ptr();
+			TBuf<256> uri;
+			uri.Copy (trans->Uri()) ;
+									
+			TPtrC mthd;
+						
+			switch (eStrIndex)
+				{
+				case HTTP::EGET : mthd.Set(THA_TxtCmdTransactionGET); break;
+				case HTTP::EPOST : mthd.Set(THA_TxtCmdTransactionPOST); break;
+				case HTTP::EPUT : mthd.Set(THA_TxtCmdTransactionPUT); break;
+				case HTTP::EDELETE : mthd.Set(THA_TxtCmdTransactionDELETE); break;
+				case HTTP::EHEAD : mthd.Set(THA_TxtCmdTransactionHEAD); break;
+				case HTTP::EOPTIONS : mthd.Set(THA_TxtCmdTransactionOPTIONS); break;
+				case HTTP::ETRACE : mthd.Set(THA_TxtCmdTransactionTRACE); break;
+				default : break;
+				}
+			++iTrans;
+//			if (trans->iState == CTestTransaction::EActive)
+			if (trans->State() == CTestTransaction::EActive)
+				{
+				Log(_L("\t%d\t%S\t%S\t%S"), iTrans, 
+					&label, 
+					&mthd,
+					&uri);
+				}
+			}
+		}
+	if (iTrans == 0)
+		Log(_L("\tNo transactions have been defined"));
+		
+	return KErrNone;
+	
+	}
+
+
+
+//-----------------------------------------------------------------------------
+// End of File
+//-----------------------------------------------------------------------------
+