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)); } } }
// ------------------------------------------------------------------------------------------------ // CHttpFilterConnHandler::MHFRunL // Process a transaction event. // ------------------------------------------------------------------------------------------------ // void CHttpFilterConnHandler::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent) { TInt state = 0; TInt gprsState = 0; TInt wcdmaState = 0; TApBearerType bearerType; if (aEvent.iStatus == THTTPEvent::ESubmit) { THTTPHdrVal isNewConn; RHTTPConnectionInfo connInfo = iSession->ConnectionInfo(); RStringPool strPool = aTransaction.Session().StringPool(); TBool ret = connInfo.Property (strPool.StringF(HttpFilterCommonStringsExt::EHttpNewConnFlag, HttpFilterCommonStringsExt::GetTable()), isNewConn); if ( LocalHostCheckL(aTransaction) && !( ret && isNewConn.Type() == THTTPHdrVal::KTIntVal ) ) { return; } THTTPHdrVal callback; RHTTPTransactionPropertySet propSet = aTransaction.PropertySet(); RStringF callbackStr = strPool.StringF( HttpFilterCommonStringsExt::EConnectionCallback, HttpFilterCommonStringsExt::GetTable() ); MConnectionCallback* callbackPtr = NULL; // this is a transaction, already forwarded to download manager if( propSet.Property( callbackStr, callback ) ) { callbackPtr = REINTERPRET_CAST( MConnectionCallback*, callback.Int() ); }
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 CHttpEventHandler::GetHdrVal( THTTPHdrVal& hdrVal, RStringPool& pool) { TBool retval = ETrue; TPtrC8 auth_token((const TUint8*)"auth_token"); switch (hdrVal.Type()) { case THTTPHdrVal::KStrFVal: { RStringF fieldNameStr = pool.StringF(hdrVal.StrF()); const TDesC8& fieldNameDesC = fieldNameStr.DesC(); if (iVerbose) { TBuf<CHttpConstants::KMaxHeaderValueLen> value; value.Copy(fieldNameDesC.Left(CHttpConstants::KMaxHeaderValueLen)); iTest->Console()->Printf(_L("%S:\n"), &value); } if ( fieldNameDesC.Length() > 0 && fieldNameDesC.Compare(auth_token) ) iCookies.Append(fieldNameDesC); else retval = EFalse; } break; case THTTPHdrVal::KStrVal: { RString fieldNameStr = pool.String(hdrVal.Str()); const TDesC8& fieldNameDesC = fieldNameStr.DesC(); if (iVerbose) { TBuf<CHttpConstants::KMaxHeaderValueLen> value; value.Copy(fieldNameDesC.Left(CHttpConstants::KMaxHeaderValueLen)); iTest->Console()->Printf(_L("%S:\n"), &value); } if ( fieldNameDesC.Length() > 0 && fieldNameDesC.Compare(auth_token) ) iCookies.Append(fieldNameDesC); else retval = EFalse; } break; } return retval; }
// ----------------------------------------------------------------------------- // CHttpFilterProxy::ReadProxyInfoL // Purpose: Reads the Proxy information from the comms database. // Gives the Proxy usage, a proxy address (<proxy name>:<proxy port>), // and proxy exceptions through the output arguments. // ----------------------------------------------------------------------------- // void CHttpFilterProxy::ReadProxyInfoL(const RStringPool aStringPool, TBool& aUsage, RStringF& aProxyAddress, RStringF& aExceptions) { // Let's find Internet Access point ID (ServiceId) in use from the RConnection associated with the HTTP framework THTTPHdrVal connValue; TUint32 serviceId; TUint pushCount = 0; RConnection* connPtr = NULL; THTTPHdrVal iapId; TCommDbConnPref pref; TBool hasValue = iConnInfo.Property (aStringPool.StringF(HTTP::EHttpSocketConnection, RHTTPSession::GetTable()), connValue); if (hasValue && connValue.Type() == THTTPHdrVal::KTIntVal) { connPtr = REINTERPRET_CAST(RConnection*, connValue.Int()); }
void CTestTransaction::DumpRespHeaders(RHTTPTransaction &aTrans) { RHTTPResponse resp = aTrans.Response(); RStringPool strP = aTrans.Session().StringPool(); RHTTPHeaders hdr = resp.GetHeaderCollection(); THTTPHdrFieldIter it = hdr.Fields(); TBuf<32> fieldName16; TBuf<128> fieldVal16; while (it.AtEnd() == EFalse) { RStringTokenF fieldNameTk = it(); RStringF fieldName = strP.StringF(fieldNameTk); THTTPHdrVal hVal; if (hdr.GetField(fieldName, 0, hVal) == KErrNone) { TPtrC8 fieldNameStr(strP.StringF(fieldName).DesC()); if (fieldNameStr.Length() > 32) fieldNameStr.Set(fieldNameStr.Left(32)); fieldName16.Copy(fieldNameStr); THTTPHdrVal fieldVal; hdr.GetField(fieldName, 0, fieldVal); switch (fieldVal.Type()) { case THTTPHdrVal::KTIntVal: Log(_L("%S: %d"), &fieldName16, fieldVal.Int()); break; case THTTPHdrVal::KStrVal: case THTTPHdrVal::KStrFVal: { TPtrC8 fieldValStr(strP.StringF(fieldVal.StrF()).DesC()); if (fieldValStr.Length() > 128) fieldValStr.Set(fieldValStr.Left(128)); fieldVal16.Copy(fieldValStr); Log(_L("%S: %S"), &fieldName16, &fieldVal16); // see if we've got the Content-Type header if (fieldName16.Find(KHTTPContentType) != KErrNotFound) { // check that the contenttype script sets matches (in some way) received header TBuf8<KMaxContentTypeSize> contTypeBuf; contTypeBuf.Copy(Machine()->GetDefine(KITHContentType)); TInt iPos = fieldValStr.Find(contTypeBuf); if (iPos == KErrNotFound) Log(_L(" - Content Type string [%S:%S] is different to ContentType setting"), &fieldName16, &fieldVal16); else Log(_L(" - Content Type [%S:%S] acknowledged"), &fieldName16, &fieldVal16); } } break; case THTTPHdrVal::KDateVal: { TDateTime myDate = fieldVal.DateTime(); WriteDateStamp(myDate); Log(_L(" : %S"), &fieldName16); } break; default: Log(_L("%S: <unrecognised value type>"), &fieldName16); break; } } ++it; } }
void UPPayHttpConnection::ParaseResponseHeaders(RHTTPResponse resp) { RHTTPHeaders headers = resp.GetHeaderCollection(); THTTPHdrVal aHeaderValue; iStatusCode = resp.StatusCode(); if (iStatusCode >= 200 && iStatusCode < 300) { RStringF contLength = stringPool.OpenFStringL(_L8("Content-Length")); headers.GetField(contLength, 0, aHeaderValue); contLength.Close(); if (aHeaderValue.Type() == THTTPHdrVal::KTIntVal) { iContentLength = aHeaderValue.Int(); } else { iContentLength = 200 * 1024; } // if(iContentStartPos != 0) // { // HBufC8* fieldValBuf = HBufC8::NewLC(KMaxHeaderValueLength); // RStringF contentrange= stringPool.OpenFStringL(_L8("Content-Range")); // TPtrC8 rawField(fieldValBuf->Des()); // if(headers.GetRawField(contentrange,rawField)==KErrNone) // { // fieldValBuf->Des().Zero(); // } // contentrange.Close ( ); // CleanupStack::PopAndDestroy(fieldValBuf); // } } // // else // { // Stop(); // iObserver.StateChange(EHttpError); // } if (response_header) { delete response_header; } response_header = HBufC8::NewL(2048); Mem::FillZ((void*) response_header->Ptr(), 2048); TPtr8 headPtr = response_header->Des(); TVersion ver = resp.Version(); headPtr.AppendFormat(_L8("HTTP/%d.%d %d "), ver.iMajor, ver.iMinor, iStatusCode); headPtr.Append(resp.StatusText().DesC()); headPtr.Append(add2); RHTTPHeaders hdr = resp.GetHeaderCollection(); THTTPHdrFieldIter it = hdr.Fields(); THTTPHdrVal fieldVal; HBufC8* fieldValBuf = HBufC8::NewLC(KMaxHeaderValueLength); while (it.AtEnd() == EFalse) { RStringTokenF fieldName = it(); RStringF fieldNameStr = stringPool.StringF(fieldName); TPtrC8 rawField(fieldValBuf->Des()); if (hdr.GetRawField(fieldNameStr, rawField) == KErrNone) { headPtr.Append(fieldNameStr.DesC()); headPtr.Append(add1); headPtr.Append(rawField); headPtr.Append(add2); fieldValBuf->Des().Zero(); } ++it; } CleanupStack::PopAndDestroy(fieldValBuf); if (iStatusCode == 301 || iStatusCode == 302) { if (iObserver) { iObserver->StateChange(ERedirect); } } }
void CHttpController::ParseHeadersL( RHTTPTransaction& aTransaction ) { const TInt KMaxNumericLen = 32; RStringPool stringPool = aTransaction.Session().StringPool(); RHTTPHeaders header = aTransaction.Response().GetHeaderCollection(); THTTPHdrFieldIter iterator = header.Fields(); HBufC8* fieldName8 = NULL; HBufC8* fieldVal8 = NULL; CHttpHeaders* headers = CHttpHeaders::NewLC(); while ( !iterator.AtEnd() ) { RStringTokenF fieldName = iterator(); RStringF fieldNameStr = stringPool.StringF( fieldName ); THTTPHdrVal fieldVal; if ( header.GetField( fieldNameStr, 0, fieldVal ) == KErrNone ) { fieldName8 = fieldNameStr.DesC().AllocLC(); switch ( fieldVal.Type() ) { case THTTPHdrVal::KTIntVal: { fieldVal8 = HBufC8::NewLC( KMaxNumericLen ); TPtr8 ptr( fieldVal8->Des() ); ptr.Num( fieldVal.Int() ); break; } case THTTPHdrVal::KStrFVal: { RStringF fieldValStr = stringPool.StringF( fieldVal.StrF() ); fieldVal8 = fieldValStr.DesC().AllocLC(); break; } case THTTPHdrVal::KStrVal: { RString fieldValStr = stringPool.String( fieldVal.Str() ); fieldVal8 = fieldValStr.DesC().AllocLC(); break; } case THTTPHdrVal::KDateVal: { _LIT(KDateFormat,"%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S.%C%:3"); TDateTime date = fieldVal.DateTime(); const TInt KMaxDateBuferLength = 100; TBuf< KMaxDateBuferLength > dateBuffer; TTime time( date ); time.FormatL( dateBuffer, KDateFormat ); fieldVal8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( dateBuffer ); CleanupDeletePushL( fieldVal8 ); break; } default: User::Leave( KErrNotSupported );//new field types will be added in future break; } if ( !fieldVal8 ) { CleanupStack::PopAndDestroy( fieldName8 ); } else { headers->AddL( *fieldName8, *fieldVal8 ); CleanupStack::PopAndDestroy( 2, fieldName8 ); } fieldVal8 = NULL; fieldName8 = NULL; } ++iterator; } iObserver->HeadersReceivedL( headers ); CleanupStack::Pop( headers ); }
void CHttpClientHeaderWriter::EncodeHostL(RHeaderField& aHeader) const /** Encodes the host header. RFC2616 section 14.23 Host = "Host" ":" host [ ":" port ] The host header value may be empty. @internalComponent @param aHeader The host header field to encode. @leave RHeaderField::BeginRawDataL @leave RHeaderField::PartsL @leave RHeaderField::WriteRawDataL @leave KErrHttpEncodeHost There were no parts, or the part value type or the parameter value type was not a string or a folded string. */ { __START_PERFORMANCE_LOGGER(); // Our convention will be that a string called HTTP::EPort will be used to // set a parameter holding the integer port number // Check part 1 THeaderFieldPartIter iter1 = aHeader.PartsL(); iter1.First(); if( iter1.AtEnd() ) { User::Leave(KErrHttpEncodeHost); } const CHeaderFieldPart* part = iter1(); if( part == NULL) { User::Leave(KErrHttpEncodeHost); } THTTPHdrVal pt1val = part->Value(); if( pt1val.Type() != THTTPHdrVal::KStrFVal ) { User::Leave(KErrHttpEncodeHost); } // Write the host string RStringF hostStr = pt1val.StrF(); aHeader.BeginRawDataL(); aHeader.WriteRawDataL(hostStr.DesC()); // Check for a port number THeaderFieldParamIter iter2 = part->Parameters(); iter2.First(); if( !iter2.AtEnd() ) { // Got a parameter - if its the port, check then write it const CHeaderFieldParam* param = iter2(); if( !param ) { User::Leave(KErrHttpEncodeHostPort); } if( param->Name() == iStringPool.StringF(HTTP::EPort,iStringTable) ) { // Get the port value THTTPHdrVal portVal = param->Value(); if (portVal.Type() != THTTPHdrVal::KTIntVal) { User::Leave(KErrHttpEncodeHostPort); } TBuf8<KMaxNumPortDigits> portDesC; const TInt portValue = portVal.Int(); if(portValue > KMaxNumPortValue) { User::Leave(KErrHttpEncodeHostPort); } portDesC.Num(portValue); aHeader.WriteRawDataL(':'); aHeader.WriteRawDataL(portDesC); } } aHeader.CommitRawData(); __END_PERFORMANCE_LOGGER(_L(",CHttpClientHeaderWriter::EncodeHostL()")); }
void CHttpClientHeaderWriter::EncodeAuthorizationL(RHeaderField& aHeader) const /** Encodes the authorization header. RFC2616 section 14.4 - Authorization = "Authorization" ":" credentials credentials = auth-scheme #auth-param | "Digest" digest-response | "Basic" basic-credentials basic-credentials = base64-user-pass base64-user-pass = <base64 [4] encoding of user-pass, except not limited to 76 char/line> user-pass = userid ":" password userid = *<TEXT excluding ":"> password = *TEXT digest-response = 1#( username | realm | nonce | digest-uri | response | [ algorithm ] | [ cnonce ] | [ opaque ] | [ message-qop ] | [ nonce-count ] | [ auth-param ] ) username = "******" "=" username-value username-value = quoted-string digest-uri = "uri" "=" digest-uri-value digest-uri-value = request-uri ; As specified by HTTP/1.1 message-qop = "qop" "=" qop-value cnonce = "cnonce" "=" cnonce-value cnonce-value = nonce-value nonce-count = "nc" "=" nc-value nc-value = 8LHEX response = "response" "=" request-digest request-digest = <"> 32LHEX <"> LHEX = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "a" | "b" | "c" | "d" | "e" | "f" Encoding here is interpreted very simply. Parts are encoded with no punctuation after them and parameters are comma separated with the value in quotes. This means that for basic authentication, part 1 must be 'Basic' and part 2 is the credentials. For digest, part1 is 'Digest', and the digest-response is stored in parameters. @internalComponent @param aHeader The authorization header field to encode. @leave RHeaderField::BeginRawDataL @leave RHeaderField::PartsL @leave RHeaderField::WriteRawDataL @leave KErrHttpEncodeAuthorization There were no parts, or the part value type or the parameter value type was not a string or a folded string. */ { __START_PERFORMANCE_LOGGER(); // Check part 1 aHeader.BeginRawDataL(); THeaderFieldPartIter iter = aHeader.PartsL(); for( iter.First(); !iter.AtEnd(); ) { const CHeaderFieldPart* part = iter(); if( part == NULL ) { // No parts!! User::Leave(KErrHttpEncodeAuthorization); } 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); break; } // Now output the params THeaderFieldParamIter paramIter = part->Parameters(); for( paramIter.First(); !paramIter.AtEnd(); ) { const TInt param = paramIter()->Name().Index(iStringTable); const TBool quoted = (param != HTTP::ENc && param != HTTP::EAlgorithm && param != HTTP::EUri && param != HTTP::EStale); aHeader.WriteRawDataL(' '); aHeader.WriteRawDataL(paramIter()->Name().DesC()); aHeader.WriteRawDataL('='); if( quoted ) { aHeader.WriteRawDataL('"'); } 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); break; } if( quoted ) { aHeader.WriteRawDataL('"'); } ++paramIter; if (!paramIter.AtEnd()) { // This is not the last param so add a comma aHeader.WriteRawDataL(','); } } ++iter; if( !iter.AtEnd() ) { // This is not the last part so add a space. aHeader.WriteRawDataL(' '); } } aHeader.CommitRawData(); __END_PERFORMANCE_LOGGER(_L(",CHttpClientHeaderWriter::EncodeAuthorizationL()")); }
EXPORT_C void CHttpTestTransBase::DumpRespHeaders(RHTTPTransaction& aTrans) //dump the message's headers { //dump the message's headers RHTTPResponse resp = aTrans.Response(); TInt status = resp.StatusCode(); if (!iEngine->IsSilent()) iEngine->Utils().LogIt(_L("Status code = %d\n"), status); RStringPool strP = aTrans.Session().StringPool(); RHTTPHeaders hdr = resp.GetHeaderCollection(); THTTPHdrFieldIter it = hdr.Fields(); TBuf<32> fieldName16; TBuf<128> fieldVal16; while (it.AtEnd() == EFalse) { RStringTokenF fieldNameTk = it(); RStringF fieldName = strP.StringF(fieldNameTk); THTTPHdrVal hVal; if (hdr.GetField(fieldName,0,hVal) == KErrNone) { TPtrC8 fieldNameStr(strP.StringF(fieldName).DesC()); if (fieldNameStr.Length() > 32) fieldNameStr.Set(fieldNameStr.Left(32)); fieldName16.Copy(fieldNameStr); THTTPHdrVal fieldVal; hdr.GetField(fieldName,0,fieldVal); switch (fieldVal.Type()) { case THTTPHdrVal::KTIntVal: { iEngine->Utils().LogIt(_L("%S: %d\n"), &fieldName16, fieldVal.Int()); } break; case THTTPHdrVal::KStrVal: case THTTPHdrVal::KStrFVal: { TPtrC8 fieldValStr(strP.StringF(fieldVal.StrF()).DesC()); if (fieldValStr.Length() > 128) fieldValStr.Set(fieldValStr.Left(128)); fieldVal16.Copy(fieldValStr); iEngine->Utils().LogIt(_L("%S: %S\n"), &fieldName16, &fieldVal16); } break; case THTTPHdrVal::KDateVal: { TDateTime date = fieldVal.DateTime(); TTime t(date); TBuf<128> dateTimeString; TRAPD(err,t.FormatL(dateTimeString,KDateFormat)); if (err == KErrNone) iEngine->Utils().LogIt(_L("%S: %S\n"), &fieldName16, &dateTimeString); } break; default: { iEngine->Utils().LogIt(_L("%S: <unrecognised value type>\n"), &fieldName16); } } } ++it; } }
void CHttpEventHandler::DumpRespHeadersL(RHTTPTransaction& aTrans) { RHTTPResponse resp = aTrans.Response(); RStringPool strP = aTrans.Session().StringPool(); RHTTPHeaders hdr = resp.GetHeaderCollection(); THTTPHdrFieldIter it = hdr.Fields(); TBuf<CHttpConstants::KMaxHeaderNameLen> fieldName16; TBuf<CHttpConstants::KMaxHeaderValueLen> fieldVal16; while (it.AtEnd() == EFalse) { RStringTokenF fieldName = it(); RStringF fieldNameStr = strP.StringF(fieldName); THTTPHdrVal fieldVal; if (hdr.GetField(fieldNameStr,0,fieldVal) == KErrNone) { const TDesC8& fieldNameDesC = fieldNameStr.DesC(); fieldName16.Copy(fieldNameDesC.Left(CHttpConstants::KMaxHeaderNameLen)); switch (fieldVal.Type()) { case THTTPHdrVal::KTIntVal: iTest->Console()->Printf(_L("%S: %d\n"), &fieldName16, fieldVal.Int()); break; case THTTPHdrVal::KStrFVal: { RStringF fieldValStr = strP.StringF(fieldVal.StrF()); const TDesC8& fieldValDesC = fieldValStr.DesC(); fieldVal16.Copy(fieldValDesC.Left(CHttpConstants::KMaxHeaderValueLen)); iTest->Console()->Printf(_L("%S: %S\n"), &fieldName16, &fieldVal16); } break; case THTTPHdrVal::KStrVal: { RString fieldValStr = strP.String(fieldVal.Str()); const TDesC8& fieldValDesC = fieldValStr.DesC(); fieldVal16.Copy(fieldValDesC.Left(CHttpConstants::KMaxHeaderValueLen)); iTest->Console()->Printf(_L("%S: %S\n"), &fieldName16, &fieldVal16); } break; case THTTPHdrVal::KDateVal: { TDateTime date = fieldVal.DateTime(); TBuf<40> dateTimeString; TTime t(date); t.FormatL(dateTimeString,CHttpConstants::KDateFormat); iTest->Console()->Printf(_L("%S: %S\n"), &fieldName16, &dateTimeString); } break; default: iTest->Console()->Printf(_L("%S: <unrecognised value type>\n"), &fieldName16); break; } // Display realm for WWW-Authenticate header RStringF wwwAuth = strP.StringF(HTTP::EWWWAuthenticate,RHTTPSession::GetTable()); if (fieldNameStr == wwwAuth) { // check the auth scheme is 'basic' RStringF basic = strP.StringF(HTTP::EBasic,RHTTPSession::GetTable()); RStringF realm = strP.StringF(HTTP::ERealm,RHTTPSession::GetTable()); THTTPHdrVal realmVal; if ((fieldVal.StrF() == basic) && (!hdr.GetParam(wwwAuth, realm, realmVal))) { RStringF realmValStr = strP.StringF(realmVal.StrF()); fieldVal16.Copy(realmValStr.DesC()); iTest->Console()->Printf(_L("Realm is: %S\n"), &fieldVal16); } } } ++it; } }