public void Apply(
            ApiDescription apiDescription,
            OperationSpec operationSpec,
            ModelSpecRegistrar modelSpecRegistrar,
            ModelSpecGenerator modelSpecGenerator)
        {
            var responseTypeAttr = apiDescription.ActionDescriptor.GetCustomAttributes <ResponseTypeAttribute>().FirstOrDefault();

            if (responseTypeAttr == null)
            {
                return;
            }

            IEnumerable <ModelSpec> complexSpecs;
            var modelSpec = modelSpecGenerator.TypeToModelSpec(responseTypeAttr.Type, out complexSpecs);

            if (modelSpec.Type == "object")
            {
                operationSpec.Type = modelSpec.Id;
            }
            else
            {
                operationSpec.Type   = modelSpec.Type;
                operationSpec.Format = modelSpec.Format;
                operationSpec.Items  = modelSpec.Items;
                operationSpec.Enum   = modelSpec.Enum;
            }
            modelSpecRegistrar.RegisterMany(complexSpecs);
        }
        public T ContentAs <T>(int index)
        {
            EnsureNotDisposed();

            var response = _bytes.Memory.Slice(HeaderOffsets.HeaderLength);

            var operationSpecs = new List <OperationSpec>();

            for (;;)
            {
                var bodyLength = _converter.ToInt32(response.Span.Slice(2));
                var payLoad    = response.Slice(6, bodyLength);

                var command = new OperationSpec
                {
                    Status      = (ResponseStatus)_converter.ToUInt16(response.Span),
                    ValueIsJson = payLoad.Span.IsJson(),
                    Bytes       = payLoad
                };
                operationSpecs.Add(command);

                response = response.Slice(6 + bodyLength);

                if (response.Length <= 0)
                {
                    break;
                }
            }

            var spec = operationSpecs[index];

            return(_serializer.Deserialize <T>(spec.Bytes));
        }
예제 #3
0
        byte[] GetBytes(OperationSpec spec)
        {
            var bytes = Transcoder.Serializer.Serialize(spec.Value);

            if (spec.RemoveBrackets)
            {
                return(bytes.StripBrackets());
            }
            return(bytes);
        }
예제 #4
0
 public void Apply(ApiDescription apiDescription, OperationSpec operationSpec, ModelSpecMap modelSpecMap)
 {
     if (apiDescription.ActionDescriptor.GetFilters().OfType <AuthorizeAttribute>().Any())
     {
         operationSpec.ResponseMessages.Add(new ResponseMessageSpec
         {
             Code    = (int)HttpStatusCode.Unauthorized,
             Message = "Authentication required"
         });
     }
 }
예제 #5
0
        public void Apply(ApiDescription apiDescription, OperationSpec operationSpec, ModelSpecMap modelSpecMap)
        {
            operationSpec.ResponseMessages.Add(new ResponseMessageSpec
            {
                Code    = (int)HttpStatusCode.OK,
                Message = "It's all good!"
            });

            operationSpec.ResponseMessages.Add(new ResponseMessageSpec
            {
                Code    = (int)HttpStatusCode.InternalServerError,
                Message = "Somethings up!"
            });
        }
예제 #6
0
        private void WriteSpecValue(OperationBuilder builder, OperationSpec spec)
        {
            if (!spec.RemoveBrackets)
            {
                // We can serialize directly
                Transcoder.Serializer.Serialize(builder, spec.Value);
            }
            else
            {
                using (var stream = MemoryStreamFactory.GetMemoryStream())
                {
                    Transcoder.Serializer.Serialize(stream, spec.Value);

                    ReadOnlyMemory <byte> bytes = stream.GetBuffer().AsMemory(0, (int)stream.Length);
                    bytes = bytes.StripBrackets();

                    builder.Write(bytes);
                }
            }
        }
예제 #7
0
        public void Apply(ApiDescription apiDescription, OperationSpec operationSpec, ModelSpecMap modelSpecMap)
        {
            var descriptionXml = XElement.Parse(apiDescription.Documentation);

            var summary = descriptionXml.Element("summary");

            operationSpec.Summary = summary != null ? summary.Value : descriptionXml.Value;

            var notes = descriptionXml.Element("remarks");

            if (notes != null)
            {
                operationSpec.Notes = notes.Value;
            }

            foreach (var error in descriptionXml.Elements("response"))
            {
                operationSpec.ResponseMessages.Add(new ResponseMessageSpec()
                {
                    Code = Convert.ToInt32(error.Attribute("code").Value), Message = error.Value
                });
            }
        }
예제 #8
0
        public T ContentAs <T>(int index)
        {
            var response          = _bytes;
            var statusOffset      = 24;//Header.BodyOffset;
            var valueLengthOffset = statusOffset + 2;
            var valueOffset       = statusOffset + 6;

            var operationSpecs = new List <OperationSpec>();

            for (;;)
            {
                var bodyLength = _converter.ToInt32(response, valueLengthOffset);
                var payLoad    = new byte[bodyLength];
                Buffer.BlockCopy(response, valueOffset, payLoad, 0, bodyLength);

                var command = new OperationSpec
                {
                    Status      = (ResponseStatus)_converter.ToUInt16(response, statusOffset),
                    ValueIsJson = payLoad.IsJson(0, bodyLength - 1),
                    Bytes       = payLoad
                };
                operationSpecs.Add(command);

                statusOffset      = valueOffset + bodyLength;
                valueLengthOffset = statusOffset + 2;
                valueOffset       = statusOffset + 6;

                if (valueOffset >= response.Length)
                {
                    break;
                }
            }

            var spec = operationSpecs[index];

            return(_serializer.Deserialize <T>(spec.Bytes, 0, spec.Bytes.Length));
        }
예제 #9
0
        private static void ParameterSpec(OperationSpec operation, string name, Action <ParameterSpec> applyAssertions)
        {
            var parameterSpec = operation.Parameters.Single(param => param.Name == name);

            applyAssertions(parameterSpec);
        }