示例#1
0
        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));
        }
示例#2
0
        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));
        }