#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(	CIServerToolWrap			serverTool,
											IConnectionThreadStatusPtr	threadStatus,
											IConnectionControlPtr		connectionControl,
											CContext					context,
											CServerResponseException	&serverResponseException)
{
	//	情報の設定
	context.SetStatus(serverResponseException.GetStatus());

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

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

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

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

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


////////////////////////////////////////////////////////////////////////////////////////////
//	ツール
////////////////////////////////////////////////////////////////////////////////////////////
/*!
	html生成
*/
void CServerResponse::CreateResponseBody(CIServerToolWrap serverTool, CServerResponseSetting &setting, CServerResponseException &serverResponseException, CContext &context)
{
	CIServerTextManagerWrap textManager = serverTool.GetIServerTextManager();

	//	コード別のファイルロードを試みる
	CString	html = textManager.LoadServerHtmlFile(CTextTools::GetFormat("Response_%03d.html", serverResponseException.GetResponseCode()));
	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.AddEscape("<", "&lt;");
	formatter.AddEscape(">", "&gt;");

	//	テキスト情報
	formatter.AddKey("Detail", serverResponseException.GetText());

	//	サーバ情報
	formatter.AddKeyFromWorkspace(serverTool.GetIServerInfoManager().GetServerInfo());

	//	コンテキスト基本情報
	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);
}

