--- /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 <f32file.h>
+#include <x509cert.h>
+
+#include "trans.h"
+#include <http.h>
+
+//For Proxy Info.
+#include <cdblen.h>
+#include <cdbcols.h>
+#include <commsdat.h>
+#include <comms-infras/dbaccess.h>
+#include <metadatabase.h>
+#include <commsdattypesv1_1.h>
+#include <commsdattypeinfov1_1.h>
+
+_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; ii<endItem; ++ii)
+ {
+ TPtrC itemPtr(iIniFile->Section(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<KCommsDbSvrMaxFieldLength> serviceType;
+ TBuf<KCommsDbSvrMaxFieldLength> protName;
+ TBuf<KCommsDbSvrMaxFieldLength> 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<CCDConnectionPrefsRecord*>(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<CCDIAPRecord*>(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<CCDProxiesRecord*>(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<CCDProxiesRecord>* pProxiesRecordSet = new (ELeave)CMDBRecordSet<CCDProxiesRecord>(KCDTIdProxiesRecord);
+ CleanupStack::PushL(pProxiesRecordSet);
+
+ CCDProxiesRecord* primingProxyRecord = static_cast <CCDProxiesRecord*> (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);
+ }