#pragma once
#include "Workspace.h"

/*!
	class CRequest

	リクエストヘッダーの解析と情報の保持を行うクラス
*/
class CRequest
{
public:
	CRequest(CString &header, CWorkspaceAccess requestInfo);
	virtual ~CRequest(void);

	/////////////////////////////////////////////////////////////////////////////////////
	//	取得
	/////////////////////////////////////////////////////////////////////////////////////
	//!	メソッド
	CString GetMethod()		{ return m_requestInfo.GetKeyStr(_T("Method"), _T("")); };

	//!	URI
	CString GetURI()		{ return m_requestInfo.GetKeyStr(_T("URL"), _T("")); };

	//!	URI Object
	CString GetURIObject()	{ return m_requestInfo.GetKeyStr(_T("Object"), _T("")); };

	//!	Version
	CString GetVersion()	{ return m_requestInfo.GetKeyStr(_T("Version"), _T("")); };

	//!	Query
	CString GetQuery()		{ return m_requestInfo.GetKeyStr(_T("Query"), _T("")); };

	//!	QueryDecoded
	CString GetQueryDecoded()		{ return m_requestInfo.GetKeyStr(_T("QueryDecoded"), _T("")); };

	//!	User
	CString GetUser()		{ return m_requestInfo.GetKeyStr(_T("User"), _T("")); };

	//!	Passwd
	CString GetPasswd()		{ return m_requestInfo.GetKeyStr(_T("Passwd"), _T("")); };

	/////////////////////////////////////////////////////////////////////////////////////
	//	設定
	/////////////////////////////////////////////////////////////////////////////////////
	//!	User
	void SetUser(CString user)		{ return m_requestInfo.SetKeyStr(_T("User"), user); };

	//!	Passwd
	void SetPasswd(CString passwd)		{ return m_requestInfo.SetKeyStr(_T("Passwd"), passwd); };

	/////////////////////////////////////////////////////////////////////////////////////
	//	ワークスペースアクセス
	/////////////////////////////////////////////////////////////////////////////////////
	//!	全て
	CWorkspaceAccess GetRequestInfoAccess()	{ return(m_requestInfo); };

	//!	オプション
	CWorkspaceAccess GetOptionAccess()		{ return(m_requestInfo.GetAccess(_T("Options"))); };

	//!	ダイジェスト認証情報
	CWorkspaceAccess GetAuthDetailAccess()	{ return m_requestInfo.GetAccess(_T("AuthDetail")); };

protected:
	//!	ヘッダー解析
	int ParseHeader(CString &header, CWorkspaceAccess requestInfo);

	//!	トークン取得
	int GetToken(CString &str, CString &token, CString div);

	//!	ライン取得
	int GetLine(CString &str, CString &line);


protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	リクエスト情報
	CWorkspaceAccess	m_requestInfo;
};
