//<auto-generated />
using System.Collections.Generic;
using System.Runtime.Serialization;
using Org.Apache.REEF.Utilities.Attributes;

namespace Org.Apache.REEF.Common.Avro
{
    /// <summary>
    /// Used to serialize and deserialize Avro record org.apache.reef.webserver.AvroHttpRequest.
    /// </summary>
    [Private]
    [DataContract(Namespace = "org.apache.reef.webserver")]
    [KnownType(typeof(List<Org.Apache.REEF.Common.Avro.HeaderEntry>))]
    public class AvroHttpRequest
    {
        private const string JsonSchema = @"{""type"":""record"",""name"":""org.apache.reef.webserver.AvroHttpRequest"",""fields"":[{""name"":""header"",""type"":{""type"":""array"",""items"":{""type"":""record"",""name"":""org.apache.reef.webserver.HeaderEntry"",""fields"":[{""name"":""key"",""type"":""string""},{""name"":""value"",""type"":""string""}]}}},{""name"":""requestUrl"",""type"":""string""},{""name"":""pathInfo"",""type"":""string""},{""name"":""queryString"",""type"":""string""},{""name"":""httpMethod"",""type"":""string""},{""name"":""inputStream"",""type"":""bytes""}]}";

        /// <summary>
        /// Gets the schema.
        /// </summary>
        public static string Schema
        {
            get
            {
                return JsonSchema;
            }
        }
      
        /// <summary>
        /// Gets or sets the header field.
        /// </summary>
        [DataMember]
        public List<Org.Apache.REEF.Common.Avro.HeaderEntry> Header { get; set; }
              
        /// <summary>
        /// Gets or sets the requestUrl field.
        /// </summary>
        [DataMember]
        public string RequestUrl { get; set; }
              
        /// <summary>
        /// Gets or sets the pathInfo field.
        /// </summary>
        [DataMember]
        public string PathInfo { get; set; }
              
        /// <summary>
        /// Gets or sets the queryString field.
        /// </summary>
        [DataMember]
        public string QueryString { get; set; }
              
        /// <summary>
        /// Gets or sets the httpMethod field.
        /// </summary>
        [DataMember]
        public string HttpMethod { get; set; }
              
        /// <summary>
        /// Gets or sets the inputStream field.
        /// </summary>
        [DataMember]
        public byte[] InputStream { get; set; }
                
        /// <summary>
        /// Initializes a new instance of the <see cref="AvroHttpRequest"/> class.
        /// </summary>
        public AvroHttpRequest()
        {
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="AvroHttpRequest"/> class.
        /// </summary>
        /// <param name="header">The header.</param>
        /// <param name="requestUrl">The requestUrl.</param>
        /// <param name="pathInfo">The pathInfo.</param>
        /// <param name="queryString">The queryString.</param>
        /// <param name="httpMethod">The httpMethod.</param>
        /// <param name="inputStream">The inputStream.</param>
        public AvroHttpRequest(List<Org.Apache.REEF.Common.Avro.HeaderEntry> header, string requestUrl, string pathInfo, string queryString, string httpMethod, byte[] inputStream)
        {
            this.Header = header;
            this.RequestUrl = requestUrl;
            this.PathInfo = pathInfo;
            this.QueryString = queryString;
            this.HttpMethod = httpMethod;
            this.InputStream = inputStream;
        }
    }
}