// 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:
//

#ifndef __REDIRECT_H__
#define __REDIRECT_H__

#include <http/mhttpfilter.h>
#include <http/rhttpsession.h>
#include <http/cecomfilter.h>
#include "timerlogger.h"

class CDelimitedPath8;
class CDelimitedQuery8;

//##ModelId=3B1E52A00353
class CRedirectFilter : public CEComFilter, public MHTTPFilter
	{
 public:
	static CEComFilter* InstallFilterL(TAny* aSession);	
 
	//##ModelId=3B1E52A0039D
	~CRedirectFilter();

public:	// Methods from MHTTPFilterBase

	// @see MHTTPFilterBase::MHFRunL
	//##ModelId=3B1E52A0039A
	virtual void MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent);

	// @see MHTTPFilterBase::MHFSessionRunL
	virtual void MHFSessionRunL(const THTTPSessionEvent& aEvent);

	// @see MHTTPFilterBase::MHFRunError
	//##ModelId=3B1E52A00391
	virtual TInt MHFRunError(TInt aError, RHTTPTransaction aTransaction,
							 const THTTPEvent& aEvent);

	// @see MHTTPFilterBase::MHFSessionRunError
	virtual TInt MHFSessionRunError(TInt aError, const THTTPSessionEvent& aEvent);

public:	// Methods from MHTTPFilter

	// @see MHTTPFilter::MHFUnload
	//##ModelId=3B1E52A00389
	virtual void MHFUnload(RHTTPSession aSession, THTTPFilterHandle aHandle);

	// @see MHTTPFilter::MHFLoad
	//##ModelId=3B1E52A00386
	virtual void MHFLoad(RHTTPSession aSession, THTTPFilterHandle aHandle);

 private:
	
	//##ModelId=3B1E52A00385
	CRedirectFilter(RHTTPSession aSession);
	//ContructL also Installs the filter.
	//##ModelId=3B1E52A0037F
	void ConstructL(RHTTPSession aSession);

	// Function to handle the receipt of 301 Moved Permanently, 302 Found, 307 Moved Temporarily or 303 See Other
	//##ModelId=3B1E52A0037D
	void HandleRedirectL(RHTTPTransaction aTransaction,THTTPEvent::TTransactionWarning aWarningEvent);

	// Handle a 305 Use Proxy response
	//##ModelId=3B1E52A0037B
	void HandleUseProxyL(RHTTPTransaction aTransaction);

	// Sets the uri of aRequest to aUri.  If aUri is relative then complete it
	// using the host information from the request uri.
	// Note: according to the http spec a redirect should not use a relative uri 
	// but that does not stop some sites from doing it.
	void SetRedirectUriL(RHTTPRequest aRequest, const TUriC8& aUri) const;
	
    void EscapeEncodeUriL ( CUri8& aUri ) const;	




 private:
	// A count to make sure we delete at the right time.
	//##ModelId=3B1E52A00373
	TInt iLoadCount;
	//##ModelId=3BA6003B0264
	RStringPool iStringPool;

	//##ModelId=3BA6003B0250
	RHTTPSession iSession;
	
	const TStringTable&    iStringTable;
	__DECLARE_PERFORMANCE_LOG
	};

#endif //__REDIRECT_H_
