diff -r 000000000000 -r b16258d2340f applayerpluginsandutils/httpprotocolplugins/httpheadercodec/chttpserverheaderwriter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerpluginsandutils/httpprotocolplugins/httpheadercodec/chttpserverheaderwriter.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,139 @@ +// 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: +// + +#include "chttpserverheaderwriter.h" + +#include +#include +#include +#include + +#include "CHeaderField.h" + +_LIT8(KCommaSpaceSep,", "); + +CHttpServerHeaderWriter* CHttpServerHeaderWriter::NewL(RStringPool aStringPool) + { + return new (ELeave) CHttpServerHeaderWriter(aStringPool); + } + +CHttpServerHeaderWriter::~CHttpServerHeaderWriter() + { + } + +CHttpServerHeaderWriter::CHttpServerHeaderWriter(RStringPool aStringPool) +: CHttpHeaderWriter(aStringPool) + { + } + +// Encode WWWAuth +void CHttpServerHeaderWriter::EncodeWWWAuthenticateL(RHeaderField& aHeader) const + { + // RFC2616, section 14.47 WWW-Authenticate + // RFC2617, 'HTTP Authentication: Basic and Digest Access Authentication' + // + // WWW-Authenticate = "WWW-Authenticate" ":" 1#challenge + // challenge = auth-scheme 1*SP 1#auth-param + // auth-scheme = token + // auth-param = token "=" ( token | quoted-string ) + + aHeader.BeginRawDataL(); + THeaderFieldPartIter iter = aHeader.PartsL(); + for (iter.First(); !iter.AtEnd();) + { + const CHeaderFieldPart* part = iter(); + if (part == NULL) + User::Leave(KErrHttpEncodeDoWWWAuthenticate); + + THTTPHdrVal ptVal = part->Value(); + switch (ptVal.Type()) + { + case THTTPHdrVal::KStrFVal: + aHeader.WriteRawDataL(ptVal.StrF().DesC()); + break; + + case THTTPHdrVal::KStrVal: + aHeader.WriteRawDataL(ptVal.Str().DesC()); + break; + + default: + User::Leave(KErrHttpEncodeAuthorization); + } + + // Now output the params + THeaderFieldParamIter paramIter = part->Parameters(); + for (paramIter.First(); !paramIter.AtEnd();) + { + _LIT8(equalsQuote, "=\""); + aHeader.WriteRawDataL(' '); + aHeader.WriteRawDataL(paramIter()->Name().DesC()); + aHeader.WriteRawDataL(equalsQuote); + THTTPHdrVal paramVal = paramIter()->Value(); + switch (paramVal.Type()) + { + case THTTPHdrVal::KStrFVal: + aHeader.WriteRawDataL(paramVal.StrF().DesC()); + break; + + case THTTPHdrVal::KStrVal: + aHeader.WriteRawDataL(paramVal.Str().DesC()); + break; + + default: + User::Leave(KErrHttpEncodeAuthorization); + } + aHeader.WriteRawDataL('"'); + + // If this isn't the last param, add a comma seperator + ++paramIter; + if (!paramIter.AtEnd()) + aHeader.WriteRawDataL(KCommaSpaceSep); + } + + // If this isn't the last part, add a comma seperator + ++iter; + if (!iter.AtEnd()) + aHeader.WriteRawDataL(KCommaSpaceSep); + } + aHeader.CommitRawData(); + + } + +/* + * Methods from CHeaderWriter + */ + +void CHttpServerHeaderWriter::EncodeHeaderL(RHeaderField& aHeader) + { + + RStringF fieldStr = iStringPool.StringF(aHeader.Name()); + switch( fieldStr.Index(RHTTPSession::GetTable()) ) + { + case HTTP::EWWWAuthenticate: + EncodeWWWAuthenticateL(aHeader); + break; + case HTTP::EAge: + EncodeGenericNumberHeaderL(aHeader, KErrHttpEncodeDoAge); + break; + case HTTP::EVary: + DoTokenCsvListHeaderL(aHeader, KErrHttpEncodeDoVary); + break; + case HTTP::EContentLanguage: + DoTokenCsvListHeaderL(aHeader, KErrHttpEncodeDoContentLanguage); + break; + default: + User::Leave(KErrNotSupported); + } + }