#include "StdAfx.h"
#include "ServerResponse.h"
#include "HTTPHeaderParser.h"
#include "Settings.h"
#include "TextTools.h"
#include "TextFormatter.h"
#include "resource.h"
#include "ServerTextManager.h"

CServerResponse::CServerResponse(void)
{
}

CServerResponse::~CServerResponse(void)
{
}


/*!
	レスポンス生成
*/
void CServerResponse::CreateServerResponse(	IServerToolPtr				serverTool,
											IConnectionThreadStatusPtr	threadStatus,
											IConnectionControlPtr		connectionControl,
											CContext					context,
											CServerResponseException	&serverResponseException)
{
	//	情報の設定
	context.SetStatus(serverResponseException.m_status);

	//	レスポンスの設定
	CContextResponseInfo responseInfo = context.GetResponseInfo();
	responseInfo.Clear();
	responseInfo.SetResponseCode(serverResponseException.m_responseCode);
	responseInfo.SetResponseText(CHTTPHeaderParser::GetResponseText(serverResponseException.m_responseCode));

	//	ヘッダ修正
	CContextResponseOption option = responseInfo.GetResponseOption();
	for(int i=0;i<serverResponseException.m_additionalHeader.GetSize();i++)
		option.SetKeyStr(serverResponseException.m_additionalHeader[i].m_key, serverResponseException.m_additionalHeader[i].m_data);
	option.SetContentType("text/html");

	//	設定取得
	CServerResponseSetting	setting = serverTool->GetResponseSetting(setting.GetSettingName());

	//	BODYを返す？
	switch(serverResponseException.m_responseCode)
	{
	//	Bodyを返さない
	case 304:
		m_responseBody.Empty();
		break;

	//	Html生成
	default:
		CreateResponseBody(serverTool->GetIServerTextManager(), setting, serverResponseException, context);
		break;
	}
}


////////////////////////////////////////////////////////////////////////////////////////////
//	ツール
////////////////////////////////////////////////////////////////////////////////////////////
/*!
	html生成
*/
void CServerResponse::CreateResponseBody(IServerTextManagerPtr textManager, CServerResponseSetting &setting, CServerResponseException &serverResponseException, CContext &context)
{
	//	コード別のファイルロードを試みる
	CString	html = textManager->LoadServerHtmlFile(CTextTools::GetFormat("Response_%03d.html", serverResponseException.m_responseCode));
	if(html.IsEmpty())
	{
		//	デフォルトファイルロードを試みる
		html = textManager->LoadServerHtmlFile("Response_default.html");
		if(html.IsEmpty())
		{
			//	リソースから取得
			html = textManager->LoadServerHtmlResource(HTML_RESOURCE_SERVER_RESPONSE);
		}
	}

	//	書き換え
	CTextFormatter formatter;

	//	禁止文字
	formatter.AddEscape("\r", "_");
	formatter.AddEscape("\n", "_");

	//	コンテキスト基本情報
	formatter.AddKeyFromWorkspace(context);

	//	開始時刻
	formatter.AddKeyFromWorkspace(context.GetStartTime());

	//	クライアント情報
	formatter.AddKeyFromWorkspace(context.GetClientInfo());

	//	リクエスト情報
	formatter.AddKeyFromWorkspace(context.GetRequestInfo());
	formatter.AddKeyFromWorkspace(context.GetRequestInfo().GetRequestOption(), "Req:");

	//	レスポンス情報
	formatter.AddKeyFromWorkspace(context.GetResponseInfo());
	formatter.AddKeyFromWorkspace(context.GetResponseInfo().GetResponseOption(), "Res:");

	//	ターゲット情報
	formatter.AddKeyFromWorkspace(context.GetTargetInfo());

	//	書き換え実行
	m_responseBody = formatter.GetFormattedString(html);
}

