diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2020-02-12 16:44:17 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2020-02-12 16:44:17 +0200 |
| commit | 18477c8dc7e7971f2cfb08d0e11ca483944f79f2 (patch) | |
| tree | 22a7c735184c5df6a84d2182d3ff9b2222cc53b5 /Software/Visual_Studio/Web/Tango.MachineService.Gateway/TangoController.cs | |
| parent | 48ceaabee98371376e606361f396a61c479ce031 (diff) | |
| download | Tango-18477c8dc7e7971f2cfb08d0e11ca483944f79f2.tar.gz Tango-18477c8dc7e7971f2cfb08d0e11ca483944f79f2.zip | |
Added project Tango.MachineService.Gateway
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService.Gateway/TangoController.cs')
| -rw-r--r-- | Software/Visual_Studio/Web/Tango.MachineService.Gateway/TangoController.cs | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService.Gateway/TangoController.cs b/Software/Visual_Studio/Web/Tango.MachineService.Gateway/TangoController.cs new file mode 100644 index 000000000..3fd3d469e --- /dev/null +++ b/Software/Visual_Studio/Web/Tango.MachineService.Gateway/TangoController.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Security.Authentication; +using System.Threading; +using System.Threading.Tasks; +using System.Web; +using System.Web.Http; +using System.Web.Http.Controllers; +using Tango.Logging; +using Tango.Transport.Web; +using Tango.Web.Security; + +namespace Tango.Web.Controllers +{ + public class TangoController : ApiController + { + protected LogManager LogManager { get; private set; } + + public TangoController() + { + LogManager = LogManager.Default; + } + + public override async Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext context, CancellationToken cancellationToken) + { + string controllerName = String.Empty; + string actionName = String.Empty; + + try + { + var routeData = HttpContext.Current.Request.RequestContext.RouteData; + actionName = routeData.Values["action"].ToString(); + controllerName = routeData.Values["controller"].ToString(); + } + catch { } + + try + { + String request = String.Empty; + + try + { + request = context.Request.Content.ReadAsStringAsync().Result; + } + catch { } + + LogManager.Log($"Request Received on {controllerName + "/" + actionName}: \n{request}"); + + OnRequestArrived(context.Request); + + var result = await base.ExecuteAsync(context, cancellationToken); + return result; + } + catch (Exception ex) + { + LogManager.Log(ex, $"An error occurred while processing the request message on {controllerName + "/" + actionName}."); + + HttpStatusCode code = HttpStatusCode.InternalServerError; + + if (ex is ArgumentException || ex is InvalidDataException) + { + code = HttpStatusCode.BadRequest; + } + else if (ex is AuthenticationException || ex is TokenExpiredException) + { + code = HttpStatusCode.Unauthorized; + } + + var httpException = new HttpResponseException(Request.CreateErrorResponse(code, ex.FlattenMessage(), ex)); + +#if DEBUG + throw httpException; +#else + //Remove Stack trace + var expandedException = httpException.Response.Content as System.Net.Http.ObjectContent<System.Web.Http.HttpError>; + + if (expandedException != null) + { + var expandedExceptionValues = expandedException.Value as HttpError; + + if (expandedExceptionValues != null) + { + expandedExceptionValues["StackTrace"] = "StackTrace not provided."; + } + } +#endif + + + throw httpException; + } + } + + protected virtual void OnRequestArrived(HttpRequestMessage request) + { + //Do nothing. + } + } + + public class TangoController<T> : TangoController where T : class + { + public WebToken<T> RequestToken { get; set; } + + protected override void OnRequestArrived(HttpRequestMessage request) + { + base.OnRequestArrived(request); + + var authorizationHeader = request.Headers.Authorization; + + if (authorizationHeader != null) + { + try + { + RequestToken = WebToken<T>.FromToken(authorizationHeader.Parameter != null ? authorizationHeader.Parameter : authorizationHeader.ToString()); + } + catch (Exception ex) + { + throw new HttpParseException("Could not parse the provided token embedded object.", ex); + } + } + } + } +}
\ No newline at end of file |
