public static Ret <Entity> Create(HttpStatusCode status, string message, Exception exception) { var causes = EnumerateCauses(message, exception).Distinct(); var description = causes.Any() ? string.Join(Environment.NewLine, causes) : null; var entity = new Entity(); entity.Class = ClassNames.Status; if ((int)status >= 400) { entity.Class.Add(ClassNames.Error); } entity.Properties = new PropertyMap(); entity.Properties.Add("Code", (int)status); entity.Properties.Add("Status", status.ToString()); if (description != null) { entity.Properties.Add("Description", description); } if (exception != null) { entity.Properties.Add("StackTrace", exception.GetStackTrace()); } return(Ret.Create(status, entity)); }
public async Task <Ret <Result> > CallAsync(PaperContext context) { var descriptor = context.Paper; var req = context.Request; var res = context.Response; Entity form = null; if (!req.Method.EqualsAnyIgnoreCase(MethodNames.Get, MethodNames.Delete)) { form = req.ReadEntityAsync().RunSync(); // TODO: Uma entidade diferente de "form" não está sendo suportada, mas poderia, // se houvesse um algoritmo de conversão. var isValid = form.Class.Has(ClassNames.Form); if (!isValid) { return(Ret.Fail(HttpStatusCode.BadRequest, "Formato de dados não suportado. Os dados devem ser enviados em uma entidade do tipo \"form\".")); } } MethodInfo method = descriptor.GetMethod(context.Action); Ret <Result> ret = CallPaperMethod(context, descriptor.Paper, method, context.Args, form); var isFailure = (ret.Status.CodeClass != HttpStatusClass.Success); if (isFailure) { return(await Task.FromResult(ret)); } Result result = ret.Value; var isUri = typeof(string).IsAssignableFrom(result.ValueType) || typeof(Uri).IsAssignableFrom(result.ValueType) || typeof(Href).IsAssignableFrom(result.ValueType) || typeof(UriString).IsAssignableFrom(result.ValueType); if (isUri) { var href = (result.Value as Href)?.ToString() ?? result.Value?.ToString(); ret = Ret.Create(HttpStatusCode.Found); ret.Status.Headers[HeaderNames.Location] = href; return(await Task.FromResult(ret)); } return(await Task.FromResult(ret)); }