|
|
@ -0,0 +1,79 @@ |
|
|
|
using Microsoft.AspNetCore.Http; |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Threading.Tasks; |
|
|
|
|
|
|
|
namespace Ordering.API.Infrastructure.Middlewares |
|
|
|
{ |
|
|
|
public class FailingMiddleware |
|
|
|
{ |
|
|
|
private readonly RequestDelegate _next; |
|
|
|
private bool _mustFail; |
|
|
|
private readonly FailingOptions _options; |
|
|
|
public FailingMiddleware(RequestDelegate next, FailingOptions options) |
|
|
|
{ |
|
|
|
_next = next; |
|
|
|
_options = options; |
|
|
|
_mustFail = false; |
|
|
|
} |
|
|
|
public async Task Invoke(HttpContext context) |
|
|
|
{ |
|
|
|
var path = context.Request.Path; |
|
|
|
if (path.Equals(_options.ConfigPath, StringComparison.OrdinalIgnoreCase)) |
|
|
|
{ |
|
|
|
await ProcessConfigRequest(context); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (_mustFail) |
|
|
|
{ |
|
|
|
context.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; |
|
|
|
context.Response.ContentType = "text/plain"; |
|
|
|
await context.Response.WriteAsync("Failed due to FailingMiddleware enabled."); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
await _next.Invoke(context); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private async Task ProcessConfigRequest(HttpContext context) |
|
|
|
{ |
|
|
|
int i = 0; |
|
|
|
var enable = context.Request.Query.Keys.Any(k => k == "enable"); |
|
|
|
var disable = context.Request.Query.Keys.Any(k => k == "disable"); |
|
|
|
|
|
|
|
if (enable && disable) |
|
|
|
{ |
|
|
|
throw new ArgumentException("Must use enable or disable querystring values, but not both"); |
|
|
|
} |
|
|
|
|
|
|
|
if (disable) |
|
|
|
{ |
|
|
|
_mustFail = false; |
|
|
|
await SendOkResponse(context, "FailingMiddleware disabled. Further requests will be processed."); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (enable) |
|
|
|
{ |
|
|
|
_mustFail = true; |
|
|
|
await SendOkResponse(context, "FailingMiddleware enabled. Further requests will return HTTP 500"); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// If reach here, that means that no valid parameter has been passed. Just output status
|
|
|
|
await SendOkResponse(context, string.Format("FailingMiddleware is {0}", _mustFail ? "enabled" : "disabled")); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
private async Task SendOkResponse(HttpContext context, string message) |
|
|
|
{ |
|
|
|
context.Response.StatusCode = (int)System.Net.HttpStatusCode.OK; |
|
|
|
context.Response.ContentType = "text/plain"; |
|
|
|
await context.Response.WriteAsync(message); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |