Ejemplo n.º 1
0
void RequestError::fallbackErrorPage(Request* request,
                                     const Exception& e,
                                     const String& e2Name)
{
	if (!request->headersSent())
	{
		request->setStatus(500);
		request->sendHeaders();
	}
	request->stream() << "<h1>“" << e.type().htmlEscape() << "” exception</h1>"
	                  << "<p>" << e.htmlMessage() << "</p>"
	                  << "<p><strong>Additionally, a “" << e2Name
	                  << "” exception was encountered while handling the "
	                  << "exception.</strong></p>"
	                  << "<h2>Stack trace</h2><ol start=\"0\">";
	List<StackTrace::Frame> stack = e.stackTrace()->stackFrames();
	for (const StackTrace::Frame& frame : stack)
	{
		request->stream() << "<li><strong><code>" << frame.function.htmlEscape()
		                  << "</code></strong> (<code>0x"
		                  << String::fromNumber(frame.address, 16)
		                  << "</code>)<br />"
		                  << "<small>in <code>" << frame.object.relativePath()
		                  << "</code>, file <code>" << frame.fileName
		                  << "</code>, line " << frame.line << "</small></li>";
	}
	request->stream() << "</ol>";
}
Ejemplo n.º 2
0
void RequestError::exception(Request* request, Exception& e)
{
	int code = 500;
	if (e.type() == "NotFound")
		code = 404;
	else if (e.type() == "Forbidden")
		code = 403;

	if (code == 404)
		System::log("NotFound", e.message(), request->ip());
	else if (code == 403)
		System::log("Forbidden", e.message(), System::Warning, request->ip());
	else
		System::log("Exceptions",
		            String("“%1” exception: %2.").format({e.type(), e.message()}),
		            System::Warning, request->ip());

#ifndef DEBUG
	if (!request->headersSent())
		request->setStatus(code);
	Template* tpl = new Template("Errors/" + String(code) + ".html",
	                             nullptr, request);
	tpl->render();
	delete tpl;
	return;
#endif

	try
	{
		View tpl = new Template("Sys::Exception.html", nullptr, request);

		tpl["exceptionName"] = e.type();
		tpl["exceptionMessage"] = e.htmlMessage();
		tpl["webcppVersion"] = System::get()->version();
		tpl["serverName"] = request->env("SERVER_NAME", "");
		loadStackTrace(e, dynamic_cast<Template*>(*tpl));

		if (!request->headersSent())
			request->setStatus(500);
		tpl->render();
	}
	catch (const Exception& e2)
	{ fallbackErrorPage(request, e, e2.type()); }
	catch (const std::exception& e2)
	{ fallbackErrorPage(request, e, typeid(e2).name()); }
}