示例#1
0
        /// <summary>
        /// Append default values required by OData to specified HTTP header.
        ///
        /// When header name is ODataConstants.ContentTypeHeader, if header value is application/json
        ///     append the following default values for 4.0:
        ///         odata.metadata=minimal
        ///         odata.streaming=true
        ///         IEEE754Compatible=false
        ///     append the following default values for 4.01:
        ///         metadata=minimal
        ///         streaming=true
        ///         IEEE754Compatible=false
        /// </summary>
        /// <param name="headerName">The name of the header to append default values.</param>
        /// <param name="headerValue">The original header value string.</param>
        /// <param name="version">The ODataVersion for which to create the default header value</param>
        /// <returns>The header value string with appended default values.</returns>
        public static string AppendDefaultHeaderValue(string headerName, string headerValue, ODataVersion version)
        {
            if (string.CompareOrdinal(headerName, ODataConstants.ContentTypeHeader) != 0)
            {
                return(headerValue);
            }

            if (headerValue == null)
            {
                return(null);
            }

            var mediaTypeList = HttpUtils.MediaTypesFromString(headerValue);
            var mediaType     = mediaTypeList.Single().Key;
            var encoding      = HttpUtils.GetEncodingFromCharsetName(mediaTypeList.Single().Value);

            if (string.CompareOrdinal(mediaType.FullTypeName, MimeConstants.MimeApplicationJson) != 0)
            {
                return(headerValue);
            }

            var extendedParameters = new List <KeyValuePair <string, string> >();
            var extendedMediaType  = new ODataMediaType(mediaType.Type, mediaType.SubType, extendedParameters);

            var hasMetadata          = false;
            var hasStreaming         = false;
            var hasIeee754Compatible = false;

            if (mediaType.Parameters != null)
            {
                foreach (var parameter in mediaType.Parameters)
                {
                    extendedParameters.Add(parameter);

                    if (HttpUtils.IsMetadataParameter(parameter.Key))
                    {
                        hasMetadata = true;
                    }

                    if (HttpUtils.IsStreamingParameter(parameter.Key))
                    {
                        hasStreaming = true;
                    }

                    if (string.Compare(parameter.Key, MimeConstants.MimeIeee754CompatibleParameterName, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        hasIeee754Compatible = true;
                    }
                }
            }

            if (!hasMetadata)
            {
                extendedParameters.Add(new KeyValuePair <string, string>(
                                           version < ODataVersion.V401 ? MimeConstants.MimeMetadataParameterName : MimeConstants.MimeShortMetadataParameterName,
                                           MimeConstants.MimeMetadataParameterValueMinimal));
            }

            if (!hasStreaming)
            {
                extendedParameters.Add(new KeyValuePair <string, string>(
                                           version < ODataVersion.V401 ? MimeConstants.MimeStreamingParameterName : MimeConstants.MimeShortStreamingParameterName,
                                           MimeConstants.MimeParameterValueTrue));
            }

            if (!hasIeee754Compatible)
            {
                extendedParameters.Add(new KeyValuePair <string, string>(
                                           MimeConstants.MimeIeee754CompatibleParameterName,
                                           MimeConstants.MimeParameterValueFalse));
            }

            return(extendedMediaType.ToText(encoding));
        }