diff -r 000000000000 -r b16258d2340f applayerprotocols/httptransportfw/Test/Acceptance/Iter2/trans.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httptransportfw/Test/Acceptance/Iter2/trans.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,986 @@ +// Copyright (c) 2004-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: +// + +#include +#include + +#include "trans.h" +#include + +//For Proxy Info. +#include +#include +#include +#include +#include +#include +#include + +_LIT(KProxyServerName, "10.29.23.12"); +_LIT(KProtocolName, "http"); +const TInt KPortNumber = 9003; + + +_LIT(KItemName, "name"); + +// Proxy server set as either a session property or transaction property +_LIT(KItemProxy, "proxy"); +_LIT(KItemTransactionProxy, "transactionproxy"); +_LIT(KItemProxyPort, "proxy_port"); +_LIT(KItemTransactionProxyPort, "proxy_trans_port"); + +// Proxy usage at either session or transaction level. Turning off proxy at +// the session level has no effect or the transaction proxy settings and vice +// versa +_LIT(KItemProxyUsage, "proxyUsage"); +_LIT(KItemTransactionProxyUsage, "transactionProxyUsage"); +_LIT8(KItemProxyOff, "ProxyOff"); + +_LIT(KItemMethod, "method"); +_LIT(KItemUri, "uri"); +_LIT(KItemUrisch, "uri_scheme"); //new +_LIT(KItemUriport, "port"); // new +_LIT(KItemUripath, "path"); //new +_LIT(KItemBody, "body"); +_LIT(KItemBodyFile, "bodyfile"); +_LIT(KItemAccept, "Accept"); +_LIT(KItemAcceptCharset, "Accept-Charset"); +_LIT(KItemAcceptEncoding, "Accept-Encoding"); +_LIT(KItemContentType, "Content-Type"); +_LIT(KItemContentLength, "Content-Length"); +_LIT(KItemExpect, "Expect"); +_LIT(KItemExpectedStatusCode, "test_validation_param_statuscode"); +_LIT(KItemExpectedError, "test_validation_param_expectederror"); +_LIT(KItemTransactionNumber, "Transaction"); +_LIT(KItemHeader, "header"); +_LIT(KUserName, "username"); +_LIT(KPassword, "password"); +_LIT(KFrom, "from"); +_LIT(KItemRedirectCheck, "test_validation_param_numredirects"); + +_LIT8(KMethodGet, "GET"); +_LIT8(KUriSymbian, "www.symbian.com"); +_LIT8(KUrisch, "http://"); //new + +_LIT(KItemDefaultProxyUsage, "defaultProxyUsage"); +_LIT8(KItemDefaultProxyOn, "On"); + + + +const TDesC& CHttpTestTransactions::TestName() + { + return iTestName; + } + +CHttpTestTransactions::~CHttpTestTransactions() + { + delete iBody; + } + +void CHttpTestTransactions::CloseTestSession() + { + iUsername.Close(); + iPassword.Close(); + delete iBody; + iBody = NULL; + } + +// Returns back index of the item in the section that is the end of +// transaction, used to find where transactions are for multiple transactions +TInt CHttpTestTransactions::FindEndOfTransaction(TInt aStartItem) + { + TInt count= iIniFile->Section(iSectionNumber).Items().Count(); + TInt ii = aStartItem; + for (; ii < count; ++ii) + { + //Start of a new transaction + if (iIniFile->Section(iSectionNumber).Item(ii).Item().CompareF( + KItemTransactionNumber) == 0) + { + return ii -1; + } + } + // Got to end of section; + return ii; + } + +HBufC8* CHttpTestTransactions::FindItemLC(const TDesC& aItem, TInt aStart, TInt aEnd, const TDesC8 aDefault) + { + for (TInt ii = aStart; ii< aEnd; ++ii) + { + if (iIniFile->Section(iSectionNumber).Item(ii).Item().CompareF(aItem) == 0) + { + TPtrC valuePtr(iIniFile->Section(iSectionNumber).Item(ii).Value()); + HBufC8* value8 = HBufC8::NewLC(valuePtr.Length()); + TPtr8 valuePtr8= value8->Des(); + valuePtr8.Copy(valuePtr); + return value8; + } + } + return aDefault.AllocLC(); + } + +RHTTPTransaction CHttpTestTransactions::CreateTransactionL(TInt aStartItem) + { + TInt endItem= FindEndOfTransaction(aStartItem); + + // Get the method + HBufC8* method = FindItemLC(KItemMethod,aStartItem,endItem, KMethodGet); + TPtr8 methodPtr8= method->Des(); + + // Get the uri value + HBufC8* urisch = FindItemLC(KItemUrisch, aStartItem,endItem, KUrisch); + HBufC8* uriport = FindItemLC(KItemUriport, aStartItem,endItem, KNullDesC8); + HBufC8* uripath = FindItemLC(KItemUripath, aStartItem,endItem, KNullDesC8); + + HBufC8* uri = FindItemLC(KItemUri, aStartItem,endItem, KUriSymbian); + TPtr8 uritempPtr8= uri->Des(); + + HBufC8* newtempUri8 = TSrvAddrVal::ReplaceHostNameL(uritempPtr8, iIniSettingsFile); + CleanupStack::PushL(newtempUri8); + TPtr8 Bufsch(urisch->Des()); + TPtr8 Bufuri=newtempUri8->Des(); + TPtr8 Bufport(uriport->Des()); + TPtr8 Bufpath=uripath->Des(); + TInt len; + + len=Bufsch.Size()+Bufuri.Size()+Bufport.Size()+Bufpath.Size()+1; + //HBufC8* newUri8; + HBufC8* newUri8=HBufC8::NewL(len); + CleanupStack::PushL(newUri8); + TPtr8 newUriPtr8(newUri8->Des()); + + if (uritempPtr8.Find(_L8("http://"))==KErrNotFound) + { + newUriPtr8.Copy(Bufsch); + newUriPtr8.Append(Bufuri); + if(Bufport.Size()>0) + { + newUriPtr8.Append(_L8(":")); //add ":" before the port number + } + newUriPtr8.Append(Bufport); + newUriPtr8.Append(Bufpath); + } + else + { + newUriPtr8.Copy(uritempPtr8); // Compatible with old uri format + + } +// + TUriParser8 testUri; + testUri.Parse(newUriPtr8); + + //open a transaction and log it + RHTTPTransaction transaction = iSession.OpenTransactionL(testUri, *this, iMyStrP.OpenFStringL(*method)); + iOpenTransactionCount++; + TSrvAddrVal::LogUsing8BitDesL(iEngine, _L8("Transaction Created:\t method ")); + TSrvAddrVal::LogUsing8BitDesL(iEngine, methodPtr8); + TSrvAddrVal::LogUsing8BitDesL(iEngine, _L8("Transaction Created:\t URI ")); + TSrvAddrVal::LogUsing8BitDesL(iEngine, newUriPtr8); + iEngine->Utils().LogIt(_L("Transaction Created in Session")); + + //Get a handle of the request and its headers in iTransaction + RHTTPRequest myRequest = transaction.Request(); + RHTTPHeaders myHeaders = myRequest.GetHeaderCollection(); + + TBool allowTransactionProxySetting = ETrue; + // check for transaction proxy support first + HBufC8* proxyUsage = FindItemLC(KItemTransactionProxyUsage,aStartItem, endItem,KNullDesC8); + if (proxyUsage->Length() > 0 && proxyUsage->CompareF(KItemProxyOff) == 0) + { + RHTTPTransactionPropertySet transactionProperties = transaction.PropertySet(); + RStringPool strP = iSession.StringPool(); + + THTTPHdrVal proxyUsage(strP.StringF(HTTP::EDoNotUseProxy, RHTTPSession::GetTable())); + transactionProperties.SetPropertyL(strP.StringF(HTTP::EProxyUsage, RHTTPSession::GetTable()), proxyUsage); + + allowTransactionProxySetting = EFalse; + } + + CleanupStack::PopAndDestroy(proxyUsage); + + + for (TInt ii = aStartItem; iiSection(iSectionNumber).Item(ii).Item()); + HBufC8* itemBuff8 = HBufC8::NewLC(itemPtr.Length()); + TPtr8 itemPtr8= itemBuff8->Des(); + itemPtr8.Copy(itemPtr); + RStringF item=iMyStrP.OpenFStringL(itemPtr8); + CleanupClosePushL ( item ); + + TPtrC valuePtr(iIniFile->Section(iSectionNumber).Item(ii).Value()); + HBufC8* valueBuff8 = HBufC8::NewLC(valuePtr.Length()); + TPtr8 valuePtr8= valueBuff8->Des(); + valuePtr8.Copy(valuePtr); + RStringF value =iMyStrP.OpenFStringL(valuePtr8); + CleanupClosePushL ( value ); + + if (itemPtr.CompareF(KItemHeader)==0) + DoHeaderL(myHeaders,*valueBuff8); + else if (itemPtr.CompareF(KUserName)==0) + iUsername= iMyStrP.OpenStringL(valuePtr8); + else if (itemPtr.CompareF(KPassword)==0) + iPassword= iMyStrP.OpenStringL(valuePtr8); + else if (itemPtr.CompareF(KItemExpect) == 0 && + valuePtr.CompareF(_L("100-continue"))==0) + myHeaders.SetFieldL(item, value); + else if (itemPtr.CompareF(KFrom) == 0) + myHeaders.SetFieldL(item, value); + + + else if (itemPtr.CompareF(KItemContentType)==0) + myHeaders.SetFieldL(item, value); + else if (itemPtr.CompareF(KItemContentLength)==0) + { + //convert content-length to TInt + TLex lex(valuePtr); + TInt length = 0; + lex.Val(length); + myHeaders.SetFieldL(item, length); + } + else if (itemPtr.CompareF(KItemAccept)==0) + CreateAcceptStringL(myHeaders); + else if (itemPtr.CompareF(KItemAcceptCharset)==0) + CreateAcceptCharsetStringL(myHeaders); + else if (itemPtr.CompareF(KItemAcceptEncoding)==0) + CreateAcceptEncodingStringL(myHeaders); + else if (itemPtr.CompareF(KItemBody)==0) + { + iBody= (*valueBuff8).AllocL(); + myRequest.SetBody(*this ); + } + else if (itemPtr.CompareF(KItemBodyFile)==0) + { + LoadBodyFromFileL(valuePtr); + myRequest.SetBody(*this ); + } + else if (itemPtr.CompareF(KItemExpectedStatusCode)==0) + { + //get the 'test_validation_param_statuscode' from the ini file... + TPtrC expectedStatusCodePtr = iIniFile->Section(iSectionNumber).ItemL(KItemExpectedStatusCode).Value(); + TLex statusCodeLex(expectedStatusCodePtr); + TInt statuscode; + statusCodeLex.Val(statuscode); + // ...and put it into iExpectedStatusCode + iExpectedStatusCode = statuscode; + } + else if (itemPtr.CompareF(KItemExpectedError)==0) + { + //get the 'test_validation_param_expectederror' from the + //ini file... + TPtrC expectedParamPtr = iIniFile->Section(iSectionNumber).ItemL(KItemExpectedError).Value(); + TLex paramLex(expectedParamPtr); + TInt param; + paramLex.Val(param); + // ...and put it into iExpectedError + iExpectedError = param; + } + else if (itemPtr.CompareF(KItemTransactionProxy)==0 && + allowTransactionProxySetting) + // set proxy settings on transaction + { + // Get the proxy value + TPtrC proxyPtr16 = iIniFile->Section(iSectionNumber).ItemL(KItemTransactionProxy).Value(); + // Get the proxy port + HBufC8* Transactionport = FindItemLC(KItemTransactionProxyPort,aStartItem,endItem, KNullDesC8); // new + TPtr8 TransactionportPtr8= Transactionport->Des(); + + HBufC16* proxyUrl16 = TSrvAddrVal::ReplaceHostNameL(proxyPtr16, iIniSettingsFile); + CleanupStack::PushL(proxyUrl16); + TPtr16 proxyUrlPtr16 = proxyUrl16->Des(); + if (TransactionportPtr8.Length()) + { + len=proxyUrlPtr16.Length() + TransactionportPtr8.Length() +1; + } + else + len=proxyUrlPtr16.Length(); + + // Converting proxyUrl16 to 8 bit + HBufC8* proxyUrl8 = HBufC8::NewLC(len); + TPtr8 proxyUrlPtr8 = proxyUrl8->Des(); + proxyUrlPtr8.Copy(proxyUrlPtr16); + if (TransactionportPtr8.Length()) + { + proxyUrlPtr8.Append(_L(":")); + proxyUrlPtr8.Append(TransactionportPtr8); + } + + if (proxyPtr16.Length() > 0) + { + RHTTPTransactionPropertySet transactionProperties = transaction.PropertySet(); + RStringPool strP = iSession.StringPool(); + RStringF proxyAddr = strP.OpenFStringL(proxyUrlPtr8); + CleanupClosePushL(proxyAddr); + THTTPHdrVal proxyUsage(strP.StringF(HTTP::EUseProxy, RHTTPSession::GetTable())); + transactionProperties.SetPropertyL(strP.StringF(HTTP::EProxyUsage,RHTTPSession::GetTable()), proxyUsage); + transactionProperties.SetPropertyL(strP.StringF(HTTP::EProxyAddress,RHTTPSession::GetTable()), proxyAddr); + CleanupStack::PopAndDestroy(1,&proxyAddr); + } + CleanupStack::PopAndDestroy(3, Transactionport);// and proxyUrl16, proxyUrl8 + } + + CleanupStack::PopAndDestroy ( 2 ); // item, value + CleanupStack::PopAndDestroy(2);// valueBuff8, itemBuff8 + } + + CleanupStack::PopAndDestroy(7, method); // Urisch,Uriport, Utipath, uri, newtempUri8, newUri + + + + + return transaction; + } + +void CHttpTestTransactions::ConstructL(CScriptFile& aIniFile, CScriptFile* aIniSettingsFile, const TInt aSectionNumber) + { + iUsernameUsed = EFalse; + iIniFile =&aIniFile; + iIniSettingsFile = aIniSettingsFile; + iSectionNumber=aSectionNumber; + //get the 'Name' section item + iTestName.Append(iIniFile->Section(iSectionNumber).ItemL(KItemName).Value()); + + _LIT(KLogCert, "LogCert"); + if(aIniFile.Section(aSectionNumber).Item(KLogCert) != NULL) + iLogCert = ETrue; + } + +TBool CHttpTestTransactions::GetNextDataPart(TPtrC8& aDataChunk) + { + //add a body + aDataChunk.Set(*iBody); + return ETrue; + } + +void CHttpTestTransactions::ReleaseData() + { + } + +TInt CHttpTestTransactions::OverallDataSize() + { + return iBody->Length(); + } + +// aHeader will be in the format field:value +void CHttpTestTransactions::DoHeaderL(RHTTPHeaders aRequestHeaders, const TDesC8& aHeader) + { + // get the field + TInt colonPos = aHeader.Locate(':'); + if (colonPos == KErrNotFound) + return; + + RStringF field = iMyStrP.OpenFStringL(aHeader.Left(colonPos)); + CleanupClosePushL(field); + TPtrC8 value8 = aHeader.Mid(colonPos+1, aHeader.Length() - (colonPos+1)); + + RStringF value = iMyStrP.OpenFStringL(value8); + CleanupClosePushL(value); + + aRequestHeaders.SetFieldL(field,value); + CleanupStack::PopAndDestroy(2, &field); // and value + } + + +void CHttpTestTransactions::CreateAcceptStringL(RHTTPHeaders aRequestHeaders) + { + // parse the accept header + TLex input(iIniFile->Section(iSectionNumber).ItemL(KItemAccept).Value()); + TPtrC accept; + + // go through all the accept values and add to the header + // + while (CScriptFile::GetNextWord(input, ',', accept) == KErrNone) + { + // There may be parameters that will have to be store along with the + // accept value Accept: text/plain, text/html; q=0.8, + TPtrC paramPtr(accept); + if (paramPtr.Locate(';') != KErrNotFound) + { + // extra parameter exists and this needs to be stored + TLex param(paramPtr); + + // skip any leading whitespace + param.SkipSpaceAndMark(); + + // anything upto the semicolon (;) is the normal value + while (param.Peek() != ';') + param.Inc(); + TPtrC acceptVal = param.MarkedToken(); + + // skip over the semicolon (;) + param.Inc(); + + // skip any leading whitespace + param.SkipSpaceAndMark(); + + // anything upto the equal sign (=) is the parameter name + while (param.Peek() != '=') + param.Inc(); + param.MarkedToken(); // qParam should be 'q' + // skip over the equals sign (=) + param.Inc(); + + // skip any leading whitespace + param.SkipSpaceAndMark(); + TPtrC qParamVal=param.Remainder(); // qParamVal is the value of q + + // store each value in the header class + HBufC8* acceptValBuff8= HBufC8::NewLC(acceptVal.Length()); + TPtr8 acceptVal8= acceptValBuff8->Des(); + acceptVal8.Copy(acceptVal); + RStringF acceptStr= iMyStrP.OpenFStringL(acceptVal8); + CleanupClosePushL(acceptStr); + THTTPHdrVal acceptHdr(acceptStr); + // store each Q-value in the header class + HBufC8* qParamValBuff8= HBufC8::NewLC(qParamVal.Length()); + TPtr8 qParamVal8= qParamValBuff8->Des(); + qParamVal8.Copy(qParamVal); + TLex8 str(qParamVal8); + TReal qReal=0; + str.Val(qReal); + THTTPHdrVal::TQConv qVal(qReal); + THTTPHdrVal qHdr(qVal); + aRequestHeaders.SetFieldL(iMyStrP.StringF(HTTP::EAccept, RHTTPSession::GetTable()), acceptHdr, iMyStrP.OpenFStringL(_L8("q")), qHdr); + + CleanupStack::PopAndDestroy(3, acceptValBuff8); // and acceptStr, qParamValBuff8 + } + else + { + TPtrC acceptVal = accept; + + // store each value in the header class + TBuf8<1000> acceptVal8; + acceptVal8.Copy(acceptVal); + + RStringF accept= iMyStrP.OpenFStringL(acceptVal8); + CleanupClosePushL ( accept ); + THTTPHdrVal acceptHdr(accept); + aRequestHeaders.SetFieldL(iMyStrP.StringF(HTTP::EAccept, RHTTPSession::GetTable()),acceptHdr); + CleanupStack::PopAndDestroy ( &accept ); + } + } + } + +void CHttpTestTransactions::CreateAcceptCharsetStringL(RHTTPHeaders aRequestHeaders) + { + // parse the accept header + TLex input(iIniFile->Section(iSectionNumber).ItemL(KItemAcceptCharset).Value()); + TPtrC accept; + + // go through all the accept values and add to the header + // + while (CScriptFile::GetNextWord(input, ',', accept) == KErrNone) + { + // There may be parameters that will have to be store along with the + // accept value Accept: text/plain, text/html; q=0.8, + TPtrC paramPtr(accept); + if (paramPtr.Locate(';') != KErrNotFound) + { + // extra parameter exists and this needs to be stored + TLex param(paramPtr); + + // skip any leading whitespace + param.SkipSpaceAndMark(); + + // anything upto the semicolon (;) is the normal value + while (param.Peek() != ';') + param.Inc(); + TPtrC acceptVal = param.MarkedToken(); + + // skip over the semicolon (;) + param.Inc(); + + // skip any leading whitespace + param.SkipSpaceAndMark(); + + // anything upto the equal sign (=) is the parameter name + while (param.Peek() != '=') + param.Inc(); + param.MarkedToken(); + + // skip over the equals sign (=) + param.Inc(); + + // skip any leading whitespace + param.SkipSpaceAndMark(); + param.Remainder(); + + // store each value in the header class + HBufC8* acceptValBuff8= HBufC8::NewLC(acceptVal.Length()); + TPtr8 acceptVal8= acceptValBuff8->Des(); + acceptVal8.Copy(acceptVal); + + RStringF acceptStr= iMyStrP.OpenFStringL(acceptVal8); + CleanupClosePushL(acceptStr); + THTTPHdrVal acceptHdr(acceptStr); + + aRequestHeaders.SetFieldL(iMyStrP.StringF(HTTP::EAcceptCharset, RHTTPSession::GetTable()),acceptHdr); + CleanupStack::PopAndDestroy(2, acceptValBuff8); // and acceptStr + } + else + { + TPtrC acceptVal = accept; + + // store each value in the header class + TBuf8<1000> acceptVal8; + acceptVal8.Copy(acceptVal); + RStringF accept= iMyStrP.OpenFStringL(acceptVal8); + CleanupClosePushL ( accept ); + THTTPHdrVal acceptHdr(accept); + aRequestHeaders.SetFieldL(iMyStrP.StringF(HTTP::EAcceptCharset, RHTTPSession::GetTable()),acceptHdr); + CleanupStack::PopAndDestroy ( &accept ); + } + } + } + + +void CHttpTestTransactions::CreateAcceptEncodingStringL(RHTTPHeaders aRequestHeaders) + { + // parse the accept header + TLex input(iIniFile->Section(iSectionNumber).ItemL(KItemAcceptEncoding).Value()); + TPtrC accept; + + // go through all the accept values and add to the header + // + while (CScriptFile::GetNextWord(input, ',', accept) == KErrNone) + { + // There may be parameters that will have to be store along with the + // accept value Accept: text/plain, text/html; q=0.8, + TPtrC paramPtr(accept); + if (paramPtr.Locate(';') != KErrNotFound) + { + // extra parameter exists and this needs to be stored + TLex param(paramPtr); + + // skip any leading whitespace + param.SkipSpaceAndMark(); + + // anything upto the semicolon (;) is the normal value + while (param.Peek() != ';') + param.Inc(); + TPtrC acceptVal = param.MarkedToken(); + + // skip over the semicolon (;) + param.Inc(); + + // skip any leading whitespace + param.SkipSpaceAndMark(); + + // anything upto the equal sign (=) is the parameter name + while (param.Peek() != '=') + param.Inc(); + param.MarkedToken(); + + // skip over the equals sign (=) + param.Inc(); + + // skip any leading whitespace + param.SkipSpaceAndMark(); + param.Remainder(); + + // store each value in the header class + HBufC8* acceptValBuff8= HBufC8::NewLC(acceptVal.Length()); + TPtr8 acceptVal8= acceptValBuff8->Des(); + acceptVal8.Copy(acceptVal); + + RStringF acceptStr= iMyStrP.OpenFStringL(acceptVal8); + CleanupClosePushL(acceptStr); + THTTPHdrVal acceptHdr(acceptStr); + + aRequestHeaders.SetFieldL(iMyStrP.StringF(HTTP::EAcceptEncoding, RHTTPSession::GetTable()),acceptHdr); + CleanupStack::PopAndDestroy(2, acceptValBuff8); // and acceptStr + } + else + { + TPtrC acceptVal = accept; + + // store each value in the header class + TBuf8<1000> acceptVal8; + acceptVal8.Copy(acceptVal); + RStringF accept= iMyStrP.OpenFStringL(acceptVal8); + CleanupClosePushL ( accept ); + THTTPHdrVal acceptHdr(accept); + aRequestHeaders.SetFieldL(iMyStrP.StringF(HTTP::EAcceptEncoding, RHTTPSession::GetTable()),acceptHdr); + CleanupStack::PopAndDestroy ( &accept ); + } + } + } + + +TBool CHttpTestTransactions::GetCredentialsL(const TUriC8& aURI, RString aRealm, RStringF aAuthenticationType, RString& aUsername, RString& aPassword) + { + if (!iUsernameUsed && !(((RStringTokenBase) iUsername).IsNull()) && !(((RStringTokenBase) iPassword).IsNull()) ) + { + iEngine->Utils().LogIt(_L("Supplying credentials")); + iEngine->Utils().DumpData(aURI.UriDes()); + iEngine->Utils().DumpData(aRealm.DesC()); + iEngine->Utils().DumpData(aAuthenticationType.DesC()); + aUsername= iUsername.Copy(); + aPassword= iPassword.Copy(); + iUsernameUsed = ETrue; + return ETrue; + } + else + return EFalse; + } + + +TReal CHttpTestTransactions::StrToReal(TPtr8 aStrToConvToReal) + { + // this function parses a real number of the type r = a.b + // and creates the correspondent real number 'result' + TLex8 str(aStrToConvToReal); + TReal result=0; + + // A is the part of the string before the point + str.Mark(); + while (str.Peek() != '.') + { + if(str.Peek() > 48 || str.Peek() < 57 ) + { + str.Val(result) ; + str.Inc(); + } + } + return result; + } + +void CHttpTestTransactions::SetProxyL(TInt aStartItem) + { + TInt endItem= FindEndOfTransaction(aStartItem); + + // Check to see if proxies have been disabled at the session level + HBufC8* proxyUsage = FindItemLC(KItemProxyUsage,aStartItem,endItem, KNullDesC8); + if (proxyUsage->Length() > 0 && proxyUsage->CompareF(KItemProxyOff) == 0) + { + CleanupStack::PopAndDestroy(1, proxyUsage); + return; // don't use a proxy so kip setting it + } + + // Check to see if proxy type was default/defined for the session. + HBufC8* proxyType = FindItemLC(KItemDefaultProxyUsage, aStartItem, endItem, KNullDesC8); + if(proxyType->Length() > 0) + { + if (proxyType->CompareF(KItemDefaultProxyOn) == 0) + {//Use default Proxy. + CleanupStack::PopAndDestroy(2, proxyUsage);//and proxyType + + iEngine->Utils().LogIt(_L("Create Default Proxy in DB and Set it")); + //Delete Proxy if found in Ced file. + TRAPD(cedErr, ConfigureDefaultProxyL(EDelete)); + //Create Default Proxy in CommsDat. + TRAP(cedErr, ConfigureDefaultProxyL(ECreate)); + #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS + iSession.SetupDefaultProxyFromCommsDatL(); + #endif //SYMBIAN_ENABLE_SPLIT_HEADERS + //Delete the Default Proxy stored in CommsDat. + TRAP(cedErr, ConfigureDefaultProxyL(EDelete)); + } + else + { + CleanupStack::PopAndDestroy(2, proxyUsage);//and proxyType + //Donot make Use of any type of Proxy. + } + } + else + { + + // Get the proxy if there is one and set it on the session + HBufC8* proxy = FindItemLC(KItemProxy,aStartItem,endItem, KNullDesC8); + TPtr8 proxyAddrPtr8 = proxy->Des(); + HBufC8* proxyport = FindItemLC(KItemProxyPort,aStartItem,endItem, KNullDesC8); //new + TPtr8 proxyportPtr8 = proxyport->Des(); + + HBufC8* proxyAddrUrl8 = TSrvAddrVal::ReplaceHostNameL(proxyAddrPtr8, iIniSettingsFile); + CleanupStack::PushL(proxyAddrUrl8); + TPtr8 proxyUrlAddrPtr8 = proxyAddrUrl8->Des(); + TInt len; + if(proxyportPtr8.Size()) + { + len= proxyUrlAddrPtr8.Size() + proxyportPtr8.Size()+1; + } + else + len= proxyUrlAddrPtr8.Size(); + + HBufC8* proxyUrl8 = HBufC8::NewL(len); //new + CleanupStack::PushL(proxyUrl8); + TPtr8 proxyUrlPtr8(proxyUrl8->Des()); + proxyUrlPtr8.Copy(proxyUrlAddrPtr8); + if(proxyportPtr8.Size()>0) + { + proxyUrlPtr8.Append(_L8(":")); + proxyUrlPtr8.Append(proxyportPtr8); + } + + if (proxy->Length() > 0) + { + RHTTPConnectionInfo connInfo = iSession.ConnectionInfo(); + RStringPool strP = iSession.StringPool(); + RStringF proxyAddr = strP.OpenFStringL(proxyUrlPtr8); + CleanupClosePushL(proxyAddr); + THTTPHdrVal proxyUsage(strP.StringF(HTTP::EUseProxy, RHTTPSession::GetTable())); + connInfo.SetPropertyL(strP.StringF(HTTP::EProxyUsage, RHTTPSession::GetTable()), proxyUsage); + connInfo.SetPropertyL(strP.StringF(HTTP::EProxyAddress, RHTTPSession::GetTable()), proxyAddr); + CleanupStack::PopAndDestroy(1,&proxyAddr); + } + CleanupStack::PopAndDestroy(6, proxyUsage); // and proxyType, proxy, proxyport, proxyAddrUrl8, proxyUrl8 + + } + + } + +void CHttpTestTransactions::SetMaxRedirectsL(TInt aStartItem) + { + TInt endItem= FindEndOfTransaction(aStartItem); + HBufC8* maxRedirectsText = FindItemLC(KItemRedirectCheck,aStartItem, endItem, KNullDesC8); + if (maxRedirectsText && maxRedirectsText->Length() > 0) + { + TLex8 paramLex(*maxRedirectsText); + TInt param; + paramLex.Val(param); + iExpectedNumberRedirects = param; + RHTTPConnectionInfo connInfo = iSession.ConnectionInfo(); + RStringPool p=iSession.StringPool(); + connInfo.SetPropertyL(p.StringF(HTTP::EMaxRedirect, RHTTPSession::GetTable()),THTTPHdrVal(iExpectedNumberRedirects)); + } + CleanupStack::PopAndDestroy(maxRedirectsText); + } + +void CHttpTestTransactions::LogCertificateL(TCertInfo aCertInfo) + { + TBuf<20> fingerprint; + fingerprint.Copy(aCertInfo.iFingerprint); + TBuf<64> subjectName; + subjectName.Copy(aCertInfo.iSubjectDNInfo.iCommonName); + TBuf<64> issuerName; + issuerName.Copy(aCertInfo.iIssuerDNInfo.iCommonName); + TBuf<32> serialNo; + const TInt serLength = aCertInfo.iSerialNo.Length(); + for(TInt index = 0; index < serLength; ++index) + { + serialNo.AppendFormat(_L("%02x"), aCertInfo.iSerialNo[index]); + } + serialNo.UpperCase(); + + // Log certificate data + iEngine->Utils().LogIt(_L("--Server Certificate:")); + iEngine->Utils().LogIt(_L("-----------------------------------")); + iEngine->Utils().LogIt(_L("--Subject: %S"), &subjectName); + iEngine->Utils().LogIt(_L("--Issuer: %S"), &issuerName); + iEngine->Utils().LogIt(_L("--Version: %d"), aCertInfo.iVersionNo); + iEngine->Utils().LogIt(_L("--Serial No: %S"), &serialNo); + iEngine->Utils().LogIt(_L("--Fingerprint: %S"), &fingerprint); + iEngine->Utils().LogIt(_L("--Digest: %d"), aCertInfo.iDigAlg ); + + _LIT(KDateFormat,"%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S.%C%:3"); + TBuf<40> dateTimeString; + aCertInfo.iStartValDate.FormatL(dateTimeString, KDateFormat); + iEngine->Utils().LogIt(_L("--Start Date: %S"), &dateTimeString); + aCertInfo.iEndValDate.FormatL(dateTimeString, KDateFormat); + iEngine->Utils().LogIt(_L("--End Date: %S"), &dateTimeString); + iEngine->Utils().LogIt(_L("-----------------------------------")); + } + +void CHttpTestTransactions::LogCertificateL(const CX509Certificate* aCertInfo) + { + HBufC* issuerName = aCertInfo->IssuerL(); + HBufC* subjectName = aCertInfo->SubjectL(); + + // Log certificate data + iEngine->Utils().LogIt(_L("--X905 Server Certificate:")); + iEngine->Utils().LogIt(_L("-----------------------------------")); + iEngine->Utils().LogIt(_L("-----------------------------------")); + + + CleanupStack::PopAndDestroy(2, issuerName); + } + + +void CHttpTestTransactions::LoadBodyFromFileL(const TDesC& aFilePath) + { + RFs fileSession; + User::LeaveIfError(fileSession.Connect()); + CleanupClosePushL(fileSession); + + RFile bodyFile; + TInt err = bodyFile.Open(fileSession, aFilePath, EFileRead & EFileShareReadersOnly); + if( err==KErrNotFound || err==KErrPathNotFound) + { + // Try and resolve the file location as it may reside on another drive + TParse fileName; + fileName.Set(aFilePath, NULL, NULL); + TPtrC resolvedFile; + if(fileName.DrivePresent()) + { + // Drive is present, so strip the drive letter off + resolvedFile.Set(aFilePath.Mid(2)); + } + else + { + resolvedFile.Set(aFilePath); + } + + // file finder will look in the session drive first, then Y->A,Z + // so set session drive to Y (save old and restore it afterwards) + TFileName* savedPath = new TFileName; + fileSession.SessionPath(*savedPath); + + _LIT(KTopDrive,"Y:\\"); + fileSession.SetSessionPath(KTopDrive); + TFindFile fileFinder(fileSession); + err = fileFinder.FindByDir(resolvedFile,KNullDesC); + if(err==KErrNone) + { + fileName.Set(fileFinder.File(),NULL,NULL); + err = bodyFile.Open(fileSession, fileName.FullName(), EFileRead & EFileShareReadersOnly); + } + + // Revert back to the original session path + fileSession.SetSessionPath(*savedPath); + + delete savedPath; + } + + User::LeaveIfError(err); + CleanupClosePushL(bodyFile); + + delete iBody; + iBody = NULL; + + TInt fileSize = 0; + User::LeaveIfError(bodyFile.Size(fileSize)); + iBody = HBufC8::NewL(fileSize); + TPtr8 buffer = iBody->Des(); + User::LeaveIfError(bodyFile.Read(buffer)); + + CleanupStack::PopAndDestroy(2, &fileSession); + } + +//Creates a Default Proxy in CommsDat database for use by the build machine. +//Once all test cases were executed, deletes the Proxy record that was successfully created. +void CHttpTestTransactions::ConfigureDefaultProxyL(TConfigureProxyAction aAction) + { + TInt32 defaultIapId = 0; + TUint32 serviceId = 0; + TBuf serviceType; + TBuf protName; + TBuf serverName; + + // use commsDat API + // Create CommmsDat session using latest version of commsdat + CMDBSession* dbSession = CMDBSession::NewLC(CMDBSession::LatestVersion()); + + //Read Default IAP inorder to get its service Id and type. + //Default IAP is the one in "connection preferences" table and with a "rank" of 1. + CCDConnectionPrefsRecord *connPrefRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdConnectionPrefsRecord)); + CleanupStack::PushL(connPrefRecord); + + // Set the direction of connection + connPrefRecord->iDirection = ECommDbConnectionDirectionOutgoing; + connPrefRecord->iRanking = 1; + + if(!connPrefRecord->FindL(*dbSession)) + { + User::Leave(KErrNotFound); + } + defaultIapId = connPrefRecord->iDefaultIAP; + iEngine->Utils().LogIt(_L("Default IAP value %d"), defaultIapId); + //Done with Connection Preference Table, Destroy it. + CleanupStack::PopAndDestroy (connPrefRecord); + + //Got the default IAP id which was its record id in IAP table. + //Get the Service ID and Serivce type of this IAP. + CCDIAPRecord* defaultIapRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord)); + CleanupStack::PushL(defaultIapRecord); + + //Set the ID. + defaultIapRecord->SetRecordId (defaultIapId); + //Load the record. + defaultIapRecord->LoadL(*dbSession); + //read its serice id and service type. + serviceId = defaultIapRecord->iService; + serviceType.Copy(defaultIapRecord->iServiceType); + //Done with IAP Record read, Destroy it. + CleanupStack::PopAndDestroy(defaultIapRecord); + iEngine->Utils().LogIt(_L("Default ServiceID:%d;ServiceType:%S"), serviceId, &serviceType); + // Now we've got serviceId and serviceType, + + if (aAction == ECreate) + {// Create proxy record for this Service ID and service Type + CCDProxiesRecord* pProxyRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdProxiesRecord)); + CleanupStack::PushL(pProxyRecord); + + pProxyRecord->iServiceType.SetMaxLengthL(serviceType.Length()); + pProxyRecord->iServiceType = serviceType; + + pProxyRecord->iService = serviceId; + pProxyRecord->iUseProxyServer = ETrue; + + serverName.Copy(KProxyServerName); + pProxyRecord->iServerName.SetMaxLengthL(serverName.Length()); + pProxyRecord->iServerName = serverName; + + protName.Copy(KProtocolName); + pProxyRecord->iProtocolName.SetMaxLengthL(protName.Length()); + pProxyRecord->iProtocolName = protName; + + pProxyRecord->iPortNumber = KPortNumber; + pProxyRecord->SetRecordId(KCDNewRecordRequest); + + TRAPD(storeErr, dbSession->OpenTransactionL()); + TRAP(storeErr, pProxyRecord->StoreL(*dbSession)); + iEngine->Utils().LogIt(_L("Created New Default Proxy:%S, at Port:%d"), &serverName, KPortNumber); + TRAP(storeErr, dbSession->CommitTransactionL()); + + CleanupStack::PopAndDestroy(pProxyRecord); + } + else if (aAction == EDelete) + {// Delete proxy record for this Service ID and service Type that was created earlier by us + CMDBRecordSet* pProxiesRecordSet = new (ELeave)CMDBRecordSet(KCDTIdProxiesRecord); + CleanupStack::PushL(pProxiesRecordSet); + + CCDProxiesRecord* primingProxyRecord = static_cast (CCDRecordBase::RecordFactoryL(KCDTIdProxiesRecord)); + CleanupStack::PushL(primingProxyRecord); + // build priming record for the search + primingProxyRecord->iServiceType.SetMaxLengthL(serviceType.Length()); + primingProxyRecord->iServiceType = serviceType; + + primingProxyRecord->iService = serviceId; + primingProxyRecord->iUseProxyServer = ETrue; + + pProxiesRecordSet->iRecords.AppendL(primingProxyRecord); + CleanupStack::Pop(primingProxyRecord); + + iEngine->Utils().LogIt(_L("Searching for this Default Proxy")); + + // Search for the priming record + if (pProxiesRecordSet->FindL(*dbSession)) + {//If exists Delete it + serverName.Copy(primingProxyRecord->iServerName); + TUint32 proxyPort = primingProxyRecord->iPortNumber; + iEngine->Utils().LogIt(_L("Found Default Proxy Record:%S at port%d"), &serverName, proxyPort); + TRAPD(deleteErr, dbSession->OpenTransactionL()); + + TRAP(deleteErr, primingProxyRecord->DeleteL(*dbSession)); + iEngine->Utils().LogIt(_L("Deleted Default Proxy")); + + TRAP(deleteErr, dbSession->CommitTransactionL()); + } + + CleanupStack::PopAndDestroy(pProxiesRecordSet); + } + CleanupStack::PopAndDestroy(dbSession); + }