internal static ExtendedMediaType GetExtendedMediaType(string mediaType,
                                                               params string[] nonCanonicalMediaTypePatterns)
        {
            Match match   = null;
            var   matched = nonCanonicalMediaTypePatterns.Any(mtp =>
            {
                match = Regex.Match(mediaType, mtp);
                return(match.Success);
            });



            if (matched)
            {
                var extendedMediaType = new ExtendedMediaType();
                extendedMediaType.DomainModel = match.Groups[3].Value;
                extendedMediaType.Version     = match.Groups[5].Value;
                extendedMediaType.Format      = match.Groups[1].Value + "/" + match.Groups[6].Value;
                extendedMediaType.Schema      = string.IsNullOrEmpty(match.Groups[3].Value) ? extendedMediaType.Format :
                                                string.Format("{0}/{1}+{2}",
                                                              match.Groups[1].Value,
                                                              match.Groups[3].Value,
                                                              match.Groups[6].Value);
                extendedMediaType.IsText =
                    match.Groups[1].Value.ToLower().IsIn(new [] { "text" }) ||
                    match.Groups[6].Value.ToLower().IsIn(new[] { "xml", "json", "xml-dtd",
                                                                 "javascript", "http", "rfc822" });

                return(extendedMediaType);
            }
            else
            {
                return(null);
            }
        }
        public static ExtendedMediaType ExtractFiveLevelsOfMediaType(this MediaTypeHeaderValue header,
            params string[] nonCanonicalMediaTypePatterns)
        {
            if (header == null)
                return null;

            if(nonCanonicalMediaTypePatterns.Length==0)
                nonCanonicalMediaTypePatterns = new []{FiveLevelsOfMediaTypeFormatter.DefaultNonCanonicalMediaTypePattern};

            var extendedMediaType = GetExtendedMediaType(header.MediaType, nonCanonicalMediaTypePatterns);

            if (extendedMediaType != null && !string.IsNullOrEmpty(extendedMediaType.DomainModel))
                return extendedMediaType;

            if (header.Parameters.Count == 0)
                return null;

            extendedMediaType = new ExtendedMediaType();
            var domainModel = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.DomainModel));
            var format = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.Format));
            var isText = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.IsText));
            var schema = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.Schema));
            var version = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.Version));
            extendedMediaType.DomainModel = domainModel == null ? string.Empty : HttpUtility.UrlDecode(
                domainModel.Value);
            extendedMediaType.Format = format == null ? string.Empty : HttpUtility.UrlDecode(format.Value);
            extendedMediaType.IsText = isText == null ? null : (bool?) Convert.ToBoolean(isText.Value);
            extendedMediaType.Schema = schema == null ? string.Empty : HttpUtility.UrlDecode(schema.Value);
            extendedMediaType.Version = version == null ? string.Empty : HttpUtility.UrlDecode(version.Value);

            return extendedMediaType;
        }
        public static ExtendedMediaType ExtractFiveLevelsOfMediaType(this MediaTypeHeaderValue header,
                                                                     params string[] nonCanonicalMediaTypePatterns)
        {
            if (header == null)
            {
                return(null);
            }

            if (nonCanonicalMediaTypePatterns.Length == 0)
            {
                nonCanonicalMediaTypePatterns = new [] { FiveLevelsOfMediaTypeFormatter.DefaultNonCanonicalMediaTypePattern }
            }
            ;


            var extendedMediaType = GetExtendedMediaType(header.MediaType, nonCanonicalMediaTypePatterns);

            if (extendedMediaType != null && !string.IsNullOrEmpty(extendedMediaType.DomainModel))
            {
                return(extendedMediaType);
            }


            if (header.Parameters.Count == 0)
            {
                return(null);
            }

            extendedMediaType = new ExtendedMediaType();
            var domainModel = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.DomainModel));
            var format      = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.Format));
            var isText      = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.IsText));
            var schema      = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.Schema));
            var version     = header.Parameters.FirstOrDefault(x => x.Name.Equals(FiveLevelsOfMediaTypeParameters.Version));

            extendedMediaType.DomainModel = domainModel == null ? string.Empty : HttpUtility.UrlDecode(
                domainModel.Value);
            extendedMediaType.Format  = format == null ? string.Empty : HttpUtility.UrlDecode(format.Value);
            extendedMediaType.IsText  = isText == null ? null : (bool?)Convert.ToBoolean(isText.Value);
            extendedMediaType.Schema  = schema == null ? string.Empty : HttpUtility.UrlDecode(schema.Value);
            extendedMediaType.Version = version == null ? string.Empty : HttpUtility.UrlDecode(version.Value);

            return(extendedMediaType);
        }
        internal static ExtendedMediaType GetExtendedMediaType(string mediaType,
            params string[] nonCanonicalMediaTypePatterns)
        {
            Match match = null;
            var matched = nonCanonicalMediaTypePatterns.Any(mtp =>
            {
                match = Regex.Match(mediaType, mtp);
                return match.Success;
            });

            if (matched)
            {
                var extendedMediaType = new ExtendedMediaType();
                extendedMediaType.DomainModel = match.Groups[3].Value;
                extendedMediaType.Version = match.Groups[5].Value;
                extendedMediaType.Format = match.Groups[1].Value + "/" + match.Groups[6].Value;
                extendedMediaType.Schema = string.IsNullOrEmpty(match.Groups[3].Value) ? extendedMediaType.Format :
                    string.Format("{0}/{1}+{2}",
                    match.Groups[1].Value,
                    match.Groups[3].Value,
                    match.Groups[6].Value);
                extendedMediaType.IsText =
                    match.Groups[1].Value.ToLower().IsIn(new []{"text"}) ||
                    match.Groups[6].Value.ToLower().IsIn(new[] { "xml", "json", "xml-dtd",
                        "javascript", "http", "rfc822" });

                return extendedMediaType;
            }
            else
            {
                return null;
            }
        }