diff -r 000000000000 -r b16258d2340f applayerprotocols/httptransportfw/Test/T_HttpIntegration/HttpTransactionCmds.cpp --- /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 +#include "CHTTPFamily.h" +#include "HttpFrmwrk.h" +#include "HttpTransactionCmds.h" +#include "httptransaction.h" + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Command: TRANSACTION command. +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// +// Form(s): +// TRANSACTION +// TRANSACTION +// 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 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: and +// 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 +//----------------------------------------------------------------------------- +