diff -r 000000000000 -r b16258d2340f applayerprotocols/httpexamples/request_headers.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httpexamples/request_headers.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,143 @@ +// Copyright (c) 2001-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 + +// eg.s of forming request headers. Each request header handled by HTTP is listed along with RFC refereces to +// show the allowed syntax. +// + +// Throughout: iStrTb is a handle to the HTTP string table; +// i.e. RStringPool iStrTb; +// +// Strings are represented as handles to HTTP strings; +// i.e. RStringF str; +// +// String table lookup (i.e. getting the string handle from some descriptor) is done as so: +// +// RStringF str = iStrTb.OpenFStringL(_L8("my string")); +// +// Strings which are 'very well known' (e.g. those in the HTTP RFC) and therefore certainly expected to be in ROM +// can be converted to HTTP string handles using enumerations: +// +// RStringF str = iStrTb.String(HTTP::EAccept,RHTTPSession::GetTable()); // guaranteed to give the same handle as: +// RHttpString str = iStrTb.OpenFStringL(_L8("KHttpAccept")); + + + +// RFC2616, section 14.1 +// Accept = "Accept" ":" +// #( media-range [ accept-params ] ) +// media-range = ( "*/*" +// | ( type "/" "*" ) +// | ( type "/" subtype ) +// ) *( ";" parameter ) +// accept-params = ";" "q" "=" qvalue *( accept-extension ) +// accept-extension = ";" token [ "=" ( token | quoted-string ) ] +// +void AcceptExample(RHTTPRequest aReq) + { + RHTTPHeaders hdr = aReq.GetHeaderCollection(); + + // Setting a single media range with no parameter, e.g. Accept: text/html + RStringF textHtml = iStrTb.OpenFStringL(_L8("text/html")); + THTTPHdrVal accVal(textHtml); + hdr.SetFieldL(iStrTb.String(HTTP::EAccept,RHTTPSession::GetTable()), accVal); + textHtml.Close(); + + // Setting several media ranges with no parameters, e.g. Accept: text/html; text/vnd.wap.wml + RStringF textHtml = iStrTb.OpenFStringL(_L8("text/html")); + RStringF textWml = iStrTb.OpenFStringL(_L8("text/vnd.wap.wml")); + THTTPHdrVal accVal(textHtml); + hdr.SetFieldL(iStrTb.String(HTTP::EAccept,RHTTPSession::GetTable()), accVal); + accVal.SetStrtextWml); + hdr.SetFieldL(iStrTb.String(HTTP::EAccept,RHTTPSession::GetTable()), accVal); + textHtml.Close(); + + // Setting a media range with a 'q' parameter, Accept: text/html; q=0.8 + RStringF textHtml = iStrTb.OpenFStringL(_L8("text/html")); + THTTPHdrVal accVal(textHtml); + THTTPHdrVal q(THTTPHdrVal::TQConv(0.8)); + hdr.SetFieldL(iStrTb.String(HTTP::EAccept,RHTTPSession::GetTable()), accVal, iStrTb.String(HTTP::EQ,RHTTPSession::GetTable()), q); + textHtml.Close(); + + // Using an accept extension, Accept: text/html; extended=value + RStringF textHtml = iStrTb.OpenFStringL(_L8("text/html")); + RStringF extended = iStrTb.OpenFStringL(_L8("extended")); + RStringF extendVal = iStrTb.OpenFStringL(_L8("value")); + THTTPHdrVal accVal(textHtml); + THTTPHdrVal extVal(extendVal); + hdr.SetFieldL(iStrTb.String(HTTP::EAccept,RHTTPSession::GetTable()), accVal, extended, extVal); + textHtml.Close(); + extended.Close(); + extendVal.Close(); + } + + +// RFC2616, section 14.8; RFC2617 +// Authorization = "Authorization" ":" credentials +// credentials = auth-scheme #auth-param +// credentials = "Basic" basic-credentials +// basic-credentials = base64-user-pass +// base64-user-pass = +// user-pass = userid ":" password +// userid = * +// password = *TEXT +void AuthorizationBasicExample(RHTTPRequest aReq) + { + RHTTPHeaders hdr = aReq.GetHeaderCollection(); + + // Setting an authorization credential, e.g. Authorization: Basic c3ltYmlhbjpmMXN5bmNtbA== + RStringF basicCred = iStrTb.OpenFStringL(_L8("c3ltYmlhbjpmMXN5bmNtbA==")); + THTTPHdrVal authVal(iStrTb.String(HTTP::EBasic,RHTTPSession::GetTable())); + hdr.SetFieldL(iStrTb.String(HTTP::EAuthorization,RHTTPSession::GetTable()), authVal); // sets part 1 'Basic' + authVal.SetStrbasicCred); + hdr.SetFieldL(iStrTb.String(HTTP::EAuthorization,RHTTPSession::GetTable()), authVal); // sets part 2 'c3ltYmlhbjpmMXN5bmNtbA' + basicCred.Close(); + } + + +// RFC2616, section 14.13 +// Content-Length = "Content-Length" ":" 1*DIGIT +void ContentLengthExample(RHTTPRequest aReq) + { + RHTTPHeaders hdr = aReq.GetHeaderCollection(); + + // Setting Content-Length header, e.g. Content-Length: 12345 + THTTPHdrVal lenVal(12345); + hdr.SetFieldL(iStrTb.String(HTTP::EContentLength, lenVal); + } + + +// RFC2616, section 14.23 +// Host = "Host" ":" host [ ":" port ] ; Section 3.2.2 +void HostExample(RHTTPRequest aReq) + { + RHTTPHeaders hdr = aReq.GetHeaderCollection(); + + // Setting host header, e.g. Host: www.symbian.com + RStringF domain = iStrTb.OpenFStringL(_L8("www.symbian.com")); + THTTPHdrVal domVal(domain); + hdr.SetFieldL(iStrTb.String(HTTP::EHost, domVal); + domain.Close(); + + // Setting a host header with a specific port number, e.g. Host: www.symbian.com:80 + RStringF domain = iStrTb.OpenFStringL(_L8("www.symbian.com")); + THTTPHdrVal domVal(domain); + THTTPHdrVal portParam(80); + // A string constant HTTP::EPort will be used to identify the parameter + hdr.SetFieldL(iStrTb.String(HTTP::EHost, domVal, EHTTPPort, portParam); + domain.Close(); + }