/**
 * Allows throwing exceptions with HTTP status codes.
 *
 * License:
 *   This Source Code Form is subject to the terms of
 *   the Mozilla Public License, v. 2.0. If a copy of
 *   the MPL was not distributed with this file, You
 *   can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * Authors:
 *   Vladimir Panteleev <vladimir@thecybershadow.net>
 */

module ae.net.http.exception;

import std.exception;

import ae.net.http.common;

/// Encapsulates an HTTP status as a D exception.
class HttpException : Exception
{
	HttpStatusCode status;

	this(HttpStatusCode status, string msg = null)
	{
		this.status = status;
		super(msg);
	}
}

///
unittest
{
	import ae.net.http.responseex : HttpResponseEx;
	auto response = new HttpResponseEx;
	bool evilDetected = true;
	try
	{
		if (evilDetected)
			throw new HttpException(HttpStatusCode.Forbidden, "Do no evil!");
	}
	catch (HttpException e)
		response.writeError(e.status, e.msg);
	catch (Exception e)
		response.writeError(HttpStatusCode.InternalServerError, e.msg);
}

/// Throws a corresponding `HttpException` if `val` is false-ish.
T httpEnforce(T)(T val, HttpStatusCode status, string msg = null)
{
	return enforce(val, new HttpException(status, msg));
}