Ejemplo n.º 1
0
        /// <summary>
        /// Build up a query string from the initial query string, raw query parameter, and any query params (which need to be combined)
        /// </summary>
        /// <param name="initialQueryString">Initial query string, present from the URI the user specified in the Get/etc parameter</param>
        /// <param name="rawQueryParameter">The raw query parameter, if any</param>
        /// <param name="queryParams">The query parameters which need serializing (or an empty collection)</param>
        /// <param name="queryProperties">The query parameters from properties which need serialializing (or an empty collection)</param>
        /// <param name="requestInfo">RequestInfo representing the request</param>
        /// <returns>Query params combined into a query string</returns>
        protected virtual string BuildQueryParam(
            string initialQueryString,
            string rawQueryParameter,
            IEnumerable <QueryParameterInfo> queryParams,
            IEnumerable <QueryParameterInfo> queryProperties,
            IRequestInfo requestInfo)
        {
            var serializedQueryParams     = queryParams.SelectMany(x => this.SerializeQueryParameter(x, requestInfo));
            var serializedQueryProperties = queryProperties.SelectMany(x => this.SerializeQueryParameter(x, requestInfo));

            if (this.QueryStringBuilder != null)
            {
                var info = new QueryStringBuilderInfo(initialQueryString, rawQueryParameter, serializedQueryParams, serializedQueryProperties, requestInfo, this.FormatProvider);
                return(this.QueryStringBuilder.Build(info));
            }

            // Implementation copied from FormUrlEncodedContent

            var sb = new StringBuilder();

            void AppendQueryString(string query)
            {
                if (sb.Length > 0)
                {
                    sb.Append('&');
                }
                sb.Append(query);
            }

            string Encode(string data)
            {
                if (string.IsNullOrEmpty(data))
                {
                    return(string.Empty);
                }
                return(Uri.EscapeDataString(data).Replace("%20", "+"));
            }

            if (!String.IsNullOrEmpty(initialQueryString))
            {
                AppendQueryString(initialQueryString.Replace("%20", "+"));
            }
            if (!String.IsNullOrEmpty(rawQueryParameter))
            {
                AppendQueryString(rawQueryParameter);
            }

            foreach (var kvp in serializedQueryParams.Concat(serializedQueryProperties))
            {
                if (kvp.Key == null)
                {
                    AppendQueryString(Encode(kvp.Value));
                }
                else
                {
                    AppendQueryString(Encode(this.ToStringHelper(kvp.Key)));
                    sb.Append('=');
                    sb.Append(Encode(kvp.Value));
                }
            }

            return(sb.ToString());
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Override this method to return a suitably escaped query string
 /// </summary>
 /// <param name="info">Information about the request</param>
 /// <returns>The escaped query string</returns>
 public abstract string Build(QueryStringBuilderInfo info);