void CHttpHdrTest::TestLookupParamL()
	{
	// Open strings needed in this test
	RStringF qStr = iStrP.StringF(HTTP::EQ,RHTTPSession::GetTable());
	RStringF textHtmlStr = iStrP.StringF(HTTP::ETextHtml,RHTTPSession::GetTable());

	RStringF user1Str = iStrP.OpenFStringL(_L8("user1"));
	CleanupClosePushL(user1Str);
	RStringF value1Str = iStrP.OpenFStringL(_L8("value1"));
	CleanupClosePushL(value1Str);
	RStringF user2Str = iStrP.OpenFStringL(_L8("user2"));
	CleanupClosePushL(user2Str);
	RStringF value2Str = iStrP.OpenFStringL(_L8("value2"));
	CleanupClosePushL(value2Str);

	//
	CHeaderFieldPart* htmlPt = CHeaderFieldPart::NewL(THTTPHdrVal(textHtmlStr));
	CleanupStack::PushL(htmlPt);
	THTTPHdrVal::TQConv q(0.2);

	CHeaderFieldParam* headerParam = CHeaderFieldParam::NewL(qStr, THTTPHdrVal(q));
	CleanupStack::PushL(headerParam);
	htmlPt->AddParamL(headerParam);
	CleanupStack::Pop(headerParam);
	
	headerParam = CHeaderFieldParam::NewL(user1Str, THTTPHdrVal(value1Str));
	CleanupStack::PushL(headerParam);
	htmlPt->AddParamL(headerParam);
	CleanupStack::Pop(headerParam);
	
	headerParam = CHeaderFieldParam::NewL(user2Str, THTTPHdrVal(value2Str));
	CleanupStack::PushL(headerParam);
	htmlPt->AddParamL(headerParam);
	CleanupStack::Pop(headerParam);
	//
	// now lookup the params
	CHeaderFieldParam* qP = htmlPt->Parameter(qStr);
	RStringF qPstr = qP->Name();
	TestL(qPstr.Index(RHTTPSession::GetTable()) == qStr.Index(RHTTPSession::GetTable()));
	//
	qP = htmlPt->Parameter(user1Str);
	qPstr = qP->Name();
	TestL(qPstr.Index(RHTTPSession::GetTable()) == user1Str.Index(RHTTPSession::GetTable()));
	//
	qP = htmlPt->Parameter(user2Str);
	qPstr = qP->Name();

	TestL(qPstr.Index(RHTTPSession::GetTable()) == user2Str.Index(RHTTPSession::GetTable()));

	// Now just destroy that lot
	CleanupStack::PopAndDestroy(5); 
	}
// -----------------------------------------------------------------------------
// CMceSdpCodec::Direction
// -----------------------------------------------------------------------------
//
TInt CMceSdpCodec::Direction( 
    CSdpMediaField& aMedia, 
    RPointerArray<CSdpAttributeField>& aSessionAttributes ) const
    {
    
    TInt direction = KErrNotFound;
    TInt index = 0;
    
    // look for the direction attribute, go through all attribute fields.
    while( direction == KErrNotFound && index < aSessionAttributes.Count() )
        {
        RStringF attribute = aSessionAttributes[index++]->Attribute();
        
        if ( attribute == SDP_STRING( SdpCodecStringConstants::EAttributeSendonly ) ||
             attribute == SDP_STRING( SdpCodecStringConstants::EAttributeRecvonly ) ||
             attribute == SDP_STRING( SdpCodecStringConstants::EAttributeInactive ) ||
             attribute == SDP_STRING( SdpCodecStringConstants::EAttributeSendrecv ) )
            {
            // downlink
            direction = attribute.Index( *iStringTable );
            }
        }
        
    if ( direction == KErrNotFound )
        {
        index = 0;
        
        RPointerArray<CSdpAttributeField>& attrfields = aMedia.AttributeFields();
        // look for the direction attribute, go through all attribute fields. if not
        // found then use the default sendrcv
        while( direction == KErrNotFound && index < attrfields.Count() )
            {
    
            RStringF attribute = attrfields[index++]->Attribute();
            if ( attribute == SDP_STRING( SdpCodecStringConstants::EAttributeSendonly ) ||
                 attribute == SDP_STRING( SdpCodecStringConstants::EAttributeRecvonly ) ||
                 attribute == SDP_STRING( SdpCodecStringConstants::EAttributeInactive ) ||
                 attribute == SDP_STRING( SdpCodecStringConstants::EAttributeSendrecv ) )
                {
                // downlink
                direction = attribute.Index( *iStringTable );
                }
            
            }
        }
         
    return direction;
    
    }
void CHttpClientHeaderReader::DecodeHeaderL(RHeaderField& aHeader)
	{
	RStringF fieldStr = iStrPool.StringF(aHeader.Name()); // this doesn't have to be closed
	switch(fieldStr.Index(iStringTable))
		{
		case HTTP::EWWWAuthenticate:
			{
			DecodeWWWAuthenticateL(aHeader);
			} break;
		case HTTP::ESetCookie:
		case HTTP::ESetCookie2:
			DecodeSetCookieL(aHeader);
			break;
		case HTTP::EAge:
			DecodeGenericNumberL(aHeader);
			break;
		case HTTP::EVary:
		case HTTP::EContentLanguage:
		case HTTP::EUpgrade:
			DecodeGenericL(aHeader, KCommaNewline);
			break;
		case HTTP::ELastModified:
			DecodeDateL(aHeader);
			break;
		default:
			User::Leave(KErrNotSupported);
		}
	}
void CUPnPHeaderReader::DecodeHeaderL(RHeaderField& aHeader)
	{
	RStringF fieldStr = iStringPool.StringF(aHeader.Name());
	switch( fieldStr.Index(TUPnPTable::Table()) )
		{
		case UPnP::ENTS:
		case UPnP::ENT:
		case UPnP::EST:
		case UPnP::EUSN:
		case UPnP::ESoapAction:
		case UPnP::ESID:
			DecodeGenericUpnpHeadersL(aHeader);	
			break;
		case UPnP::ETimeout:
			DecodeTimeoutHeaderL(aHeader);
			break;
		case UPnP::EExt:
			DecodeExtL(aHeader);
			break;
		case UPnP::EMX:
		case UPnP::ESEQ:
			DecodeGenericNumberL(aHeader);
			break;
		case UPnP::EMAN:
			DecodeManL(aHeader);
			break;
		case UPnP::ECallback:
			DecodeCallbackL(aHeader);
			break;
		default:
			User::Leave(KErrNotSupported);
		}	
	}
void CHttpClientFilter::EnsureNoEndToEndHeadersInConnectionHeaderL(RHTTPTransaction aTransaction)
	{
	RHTTPHeaders headers = aTransaction.Request().GetHeaderCollection();
	RStringF connection = iStringPool.StringF(HTTP::EConnection,iStringTable);
	const TInt numConnectionHeaderParts = headers.FieldPartsL(connection);

	for( TInt ii = numConnectionHeaderParts - 1; ii >= 0; --ii ) 
		{
		// Examine connection-tokens from back to front so index is always valid. 
		// Check for an end to end header and remove it as a connection header
		// must not contain end to end headers.
		THTTPHdrVal value;
		TInt ret = headers.GetField(connection, ii, value);

		if( ( ret != KErrNotFound ) && ( value.Type() == THTTPHdrVal::KStrFVal ) )
			{
			RStringF valueStrF = value.StrF();
			if( valueStrF.Index(iStringTable) != HTTP::EClose  && 
				!IsHopByHopHeader(valueStrF) )
				{
				// The connection-token is not 'close' nor is it a end-to-end
				// header field name - remove it.
				User::LeaveIfError(headers.RemoveFieldPart(connection, ii)); 
				}
			}
		else
			{
			// The connection-token is not a hop-by-hop header field name -
			// remove it.
			User::LeaveIfError(headers.RemoveFieldPart(connection, ii));
			}			
		}
	}
void CHttpHdrTest::TestLookupPartL()
	{
	// Open strings needed in this test
	RStringF accStr = iStrP.StringF(HTTP::EAccept,RHTTPSession::GetTable());
	RStringF textHtmlStr = iStrP.StringF(HTTP::ETextHtml,RHTTPSession::GetTable());
	RStringF textPlainStr = iStrP.StringF(HTTP::ETextPlain,RHTTPSession::GetTable());
	RStringF anyAnyStr = iStrP.StringF(HTTP::EAnyAny,RHTTPSession::GetTable());
	RStringF qStr = iStrP.StringF(HTTP::EQ,RHTTPSession::GetTable());

	//
	//	  Accept: text/html; q=0.8, text/plain; q=0.2, */*
	//
	CHeaderField* accept = CHeaderField::NewL(accStr, *iHdrColl);
	CleanupStack::PushL(accept);
	//
	CHeaderFieldPart* htmlPt = CHeaderFieldPart::NewL(THTTPHdrVal(textHtmlStr));
	CleanupStack::PushL(htmlPt);
	THTTPHdrVal::TQConv q(0.8);
	CHeaderFieldParam* headerParam = CHeaderFieldParam::NewL(qStr, THTTPHdrVal(q));
	CleanupStack::PushL(headerParam);
	htmlPt->AddParamL(headerParam);
	CleanupStack::Pop(headerParam);
	accept->AddPartL(htmlPt);
	CleanupStack::Pop(htmlPt); // now owned by the header
	//

	CHeaderFieldPart* plainPt = CHeaderFieldPart::NewL(THTTPHdrVal(textPlainStr));
	CleanupStack::PushL(plainPt);
	THTTPHdrVal::TQConv q2(0.2);
	headerParam = CHeaderFieldParam::NewL(qStr, THTTPHdrVal(q2));
	CleanupStack::PushL(headerParam);
	plainPt->AddParamL(headerParam);
	CleanupStack::Pop(headerParam);
	accept->AddPartL(plainPt);
	CleanupStack::Pop(plainPt); // now owned by the header
	//
	CHeaderFieldPart* headerPart = CHeaderFieldPart::NewL(THTTPHdrVal(anyAnyStr));
	CleanupStack::PushL(headerPart);
	accept->AddPartL(headerPart);
	CleanupStack::Pop(headerPart);

	// now lookup the parts by index and check they are correct
	CHeaderFieldPart* pt = accept->PartL(0);
	TestL(pt == htmlPt);
	pt = accept->PartL(1);
	TestL(pt == plainPt);
	pt = accept->PartL(2);
	THTTPHdrVal val = pt->Value();
	TestL(val.Type() == THTTPHdrVal::KStrFVal);
	TestL(val.StrF().Index(RHTTPSession::GetTable()) == anyAnyStr.Index(RHTTPSession::GetTable()));	

	// Now just destroy that lot
	CleanupStack::PopAndDestroy(accept);
	}
TBool CHttpClientFilter::IsHopByHopHeader(RStringF aHeaderName)
	{
	switch( aHeaderName.Index(iStringTable) )
		{
	case HTTP::EKeepAlive:
	case HTTP::EProxyAuthorization:
	case HTTP::EProxyAuthenticate:
	case HTTP::ETE:
	case HTTP::ETrailer:
	case HTTP::ETransferEncoding:
	case HTTP::EUpgrade:
		return ETrue;
	default:
		// NOT a hop by hop header, at least not as defined in http 1.1
		return EFalse;
		};
	}
void CHttpClientHeaderWriter::EncodeHeaderL(RHeaderField& aHeader)
	{
	RStringF fieldStr = iStringPool.StringF(aHeader.Name());
	switch( fieldStr.Index(iStringTable) )
		{
	case HTTP::EAccept:
		{
		EncodeAcceptL(aHeader);
		} break;
	case HTTP::EAcceptCharset:
		{
		EncodeAcceptCharsetL(aHeader);
		} break;
	case HTTP::EAuthorization:
		{
		EncodeAuthorizationL(aHeader);
		} break;
	case HTTP::EAcceptLanguage:
		{
		EncodeAcceptLanguageL(aHeader);
		} break;
	case HTTP::EAcceptEncoding:
		{
		DoGeneralAcceptHeaderL(KNormalAcceptEncodingHeaderLen, aHeader, iStringPool.StringF(HTTP::EAcceptEncoding,iStringTable), KErrHttpEncodeAcceptEncoding);
		} break;
	case HTTP::EHost:
		{
		EncodeHostL(aHeader);
		} break;
	case HTTP::EUserAgent:
		{
		EncodeUserAgentL(aHeader);
		} break;
	case HTTP::ECookie:
		{
		EncodeCookieL(aHeader);
		} break;
	case HTTP::EIfMatch:
		{
		DoTokenCsvListHeaderL(aHeader, KErrHttpEncodeIfMatch);
		} break;
	case HTTP::EIfNoneMatch:
		{
		DoTokenCsvListHeaderL(aHeader, KErrHttpEncodeIfMatch);
		} break;
	case HTTP::EIfModifiedSince:
		{
		EncodeGenericDateL(aHeader, KErrHttpEncodeIfModifiedSince);
		} break;
	case HTTP::EIfUnmodifiedSince:
		{
		EncodeGenericDateL(aHeader, KErrHttpEncodeIfUnmodifiedSince);
		} break;
	case HTTP::ECookie2:
		{
		EncodeGenericNumberHeaderL(aHeader, KErrHttpEncodeCookie2);
		} break;
	case HTTP::ETE:
		{
		EncodeTEL(aHeader);
		} break;
	default:
		User::Leave(KErrNotSupported);
		break;
		}
	}
void CHttpHdrTest::TestHeaderCollIterL()
	{
	RStringF field1Str = iStrP.OpenFStringL(_L8("hcfield1"));
	CleanupClosePushL(field1Str);
	RStringF value1Str = iStrP.OpenFStringL(_L8("hcvalue1"));
	CleanupClosePushL(value1Str);
	RStringF field2Str = iStrP.OpenFStringL(_L8("hcfield2"));
	CleanupClosePushL(field2Str);
	RStringF value2Str = iStrP.OpenFStringL(_L8("hcvalue2"));
	CleanupClosePushL(value2Str);
	RStringF field3Str = iStrP.OpenFStringL(_L8("hcfield3"));
	CleanupClosePushL(field3Str);
	RStringF value3Str = iStrP.OpenFStringL(_L8("hcvalue3"));
	CleanupClosePushL(value3Str);
	RStringF field4Str = iStrP.OpenFStringL(_L8("hcfield4"));
	CleanupClosePushL(field4Str);
	RStringF value4Str = iStrP.OpenFStringL(_L8("hcvalue4"));
	CleanupClosePushL(value4Str);
	//

	CTextModeHeaderCodec* headerCodec = CTextModeHeaderCodec::NewL(iStrP);
	CleanupStack::PushL(headerCodec);
	CHeaders* headers = CHeaders::NewL(*headerCodec);
	CleanupStack::PushL(headers);
	RHTTPHeaders hdr = headers->Handle();

	THTTPHdrVal str1(value1Str);
	hdr.SetFieldL(field1Str, str1);
	THTTPHdrVal str2(value2Str);
	hdr.SetFieldL(field2Str, str2);
	THTTPHdrVal str3(value3Str);
	hdr.SetFieldL(field3Str, str3);
	THTTPHdrVal str4(value4Str);
	hdr.SetFieldL(field4Str, str4);

	THTTPHdrFieldIter it = hdr.Fields();
	TInt count = 0;
	while (it.AtEnd() == EFalse)
		{
		RStringTokenF nextTk = it();
		RStringF nextStr = iStrP.StringF(nextTk);
		THTTPHdrVal hVal;
		TestL(hdr.GetField(nextStr,0,hVal)==KErrNone);
		switch (count)
			{
			case 0:
				TestL(nextStr.Index(RHTTPSession::GetTable()) == field1Str.Index(RHTTPSession::GetTable()));
				break;
			case 1:
				TestL(nextStr.Index(RHTTPSession::GetTable()) == field2Str.Index(RHTTPSession::GetTable()));
				break;
			case 2:
				TestL(nextStr.Index(RHTTPSession::GetTable()) == field3Str.Index(RHTTPSession::GetTable()));
				break;
			case 3:
					TestL(nextStr.Index(RHTTPSession::GetTable()) == field4Str.Index(RHTTPSession::GetTable()));
				break;
			}
		++it;
		++count;
		}

	// Close strings used in this test
	CleanupStack::PopAndDestroy(10);
	}
void CHttpHdrTest::TestHeaderCollL()
	{
	// Open strings needed in this test

	RStringF userAgentStr = iStrP.StringF(HTTP::EUserAgent,RHTTPSession::GetTable());
	RStringF textPlainStr = iStrP.StringF(HTTP::ETextPlain,RHTTPSession::GetTable());
	RStringF qStr = iStrP.StringF(HTTP::EQ,RHTTPSession::GetTable());
	RStringF accStr = iStrP.StringF(HTTP::EAccept,RHTTPSession::GetTable());
	RStringF textHtmlStr = 	iStrP.StringF(HTTP::ETextHtml,RHTTPSession::GetTable());
	RStringF wmlStr = 	iStrP.StringF(HTTP::ETextVndWapWml,RHTTPSession::GetTable());
	RStringF symbGTWapStr = iStrP.OpenFStringL(_L8("SymbGTWap"));
	CleanupClosePushL(symbGTWapStr);

	//

	CTextModeHeaderCodec* headerCodec = CTextModeHeaderCodec::NewL(iStrP);
	CleanupStack::PushL(headerCodec);
	CHeaders* headers =  CHeaders::NewL(*headerCodec);
	CleanupStack::PushL(headers);
	RHTTPHeaders hdr = headers->Handle();
	
	THTTPHdrVal uaStr(symbGTWapStr);
	hdr.SetFieldL(userAgentStr, uaStr);

	THTTPHdrVal dummy;
	TestL(hdr.GetField(userAgentStr,0,dummy) == KErrNone);
	
	hdr.RemoveField(userAgentStr);

	TestL(hdr.GetField(userAgentStr,0,dummy) == KErrNotFound);

	THTTPHdrVal htmlStr(textHtmlStr);
	THTTPHdrVal q(THTTPHdrVal::TQConv(0.5));
	hdr.SetFieldL(accStr, htmlStr, qStr, q);
	
	THTTPHdrVal wml(wmlStr);
	THTTPHdrVal q2(THTTPHdrVal::TQConv(0.3));
	hdr.SetFieldL(accStr, wml, qStr, q2);

	THTTPHdrVal plainStr(textPlainStr);
	THTTPHdrVal q3(THTTPHdrVal::TQConv(0.1));
	hdr.SetFieldL(accStr, plainStr, qStr, q3);
	TestL(hdr.FieldPartsL(accStr) == 3);

	THTTPHdrVal v1;
	hdr.GetField(accStr,0,v1);
	TestL(v1.Type() == THTTPHdrVal::KStrFVal);
	TestL(v1.StrF().Index(RHTTPSession::GetTable()) == textHtmlStr.Index(RHTTPSession::GetTable()));
	THTTPHdrVal v2;
	TestL(!hdr.GetParam(accStr, qStr, v2));
	hdr.GetField(accStr, 1,v2);
	TestL(v1.Type() == THTTPHdrVal::KStrFVal);

	TestL(v2.StrF().Index(RHTTPSession::GetTable()) == wmlStr.Index(RHTTPSession::GetTable()));
	THTTPHdrVal v3;
	TestL(!hdr.GetParam(accStr, qStr, v3, 1));
	hdr.GetField(accStr, 2,v3);
	TestL(v3.Type() == THTTPHdrVal::KStrFVal);
	TestL(v3.StrF().Index(RHTTPSession::GetTable()) == textPlainStr.Index(RHTTPSession::GetTable()));
	TestL(!hdr.GetParam(accStr, qStr, v3, 2));

	CleanupStack::PopAndDestroy(3); 
	}