예제 #1
0
 public static string GetValue(this StringValues stringValues)
 {
     if (stringValues.Count == 1)
     {
         return(stringValues);
     }
     return(stringValues.ToArray().LastOrDefault());
 }
        public void AddHeader(string key, StringValues values)
        {
            var matching = Headers.Where(h => h.Key == key).SelectMany(h => h.Value);

            if (matching.Count() > 0)
            {
                Headers.Remove(key);
                Headers.Add(key, matching.Union(values));
            }
            else
            {
                Headers.Add(key, values.ToArray());
            }
        }
        private JToken CreateJToken(StringValues values)
        {
            switch (values.Count)
            {
            case 0:
                return(JToken.Parse("''"));

            case 1:
                var value = values.First().Replace("'", @"\'");
                return(JToken.Parse($"'{value}'"));

            default:
                return(JToken.Parse($"['{string.Join("','", values.ToArray())}']"));
            }
        }
예제 #4
0
        public static string SelectAttributes <T>(StringValues fields)
        {
            Type modelType    = typeof(T);
            var  attributeMap = (Dictionary <string, string>)modelType.GetField("Fields")?.GetValue(null);
            var  attributes   = fields.Count > 0 ? fields.ToArray() : attributeMap.Keys.ToArray();

            var fetch = new StringBuilder();

            foreach (var attribute in attributes)
            {
                if (attributeMap.ContainsKey(attribute))
                {
                    fetch.Append($"<attribute name='{attributeMap[attribute]}' />");
                }
            }

            return(fetch.ToString());
        }
예제 #5
0
        private static IEnumerable <UserAgent> GetUserAgents(this HttpRequest request)
        {
            IHeaderDictionary headers       = request.Headers;
            StringValues      userAgents    = headers[HeaderNames.UserAgent];
            string            allUserAgents = String.Join(" ", userAgents.ToArray());

            string[] userAgentParts = allUserAgents.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < userAgentParts.Length; i++)
            {
                string name    = null;
                string version = null;
                string comment = null;

                string userAgent  = userAgentParts[i];
                int    slashIndex = userAgent.IndexOf('/');
                if (slashIndex == -1)
                {
                    name = userAgent;
                }
                else
                {
                    name    = userAgent.Substring(0, slashIndex);
                    version = userAgent.Substring(slashIndex + 1);
                }

                if (i < userAgentParts.Length - 1)
                {
                    string nextPart = userAgentParts[i + 1];
                    if (nextPart.StartsWith("("))
                    {
                        comment = nextPart;

                        // Skip the next part
                        i++;
                    }
                }

                yield return(new UserAgent(name, version, comment));
            }
        }
        // Normalize order and casing
        internal static StringValues GetOrderCasingNormalizedStringValues(StringValues stringValues)
        {
            if (stringValues.Count == 1)
            {
                return(new StringValues(stringValues.ToString().ToUpperInvariant()));
            }
            else
            {
                var originalArray = stringValues.ToArray();
                var newArray      = new string[originalArray.Length];

                for (var i = 0; i < originalArray.Length; i++)
                {
                    newArray[i] = originalArray[i].ToUpperInvariant();
                }

                // Since the casing has already been normalized, use Ordinal comparison
                Array.Sort(newArray, StringComparer.Ordinal);

                return(new StringValues(newArray));
            }
        }
예제 #7
0
 /// <summary>
 /// Adds a header to the http request
 /// </summary>
 /// <param name="request">The SolidHttpRequest</param>
 /// <param name="name">The name of the header</param>
 /// <param name="values">More values for the header</param>
 /// <returns></returns>
 public static SolidHttpRequest WithHeader(this SolidHttpRequest request, string name, StringValues values)
 {
     return(request.WithHeaders(headers => headers.Add(name, values.ToArray())));
 }
예제 #8
0
        private static void SetModelProperty(this IDictionary <string, object> sourceModel,
                                             string paramName, StringValues value)
        {
            /*
             * sample of paramName:
             *      string1
             *      list[]
             *      model2s[0][double2]
             *      model2s[0][model3][string3]
             *      model2s[0][model3s][0][string3]
             */

            var listProperties = paramName.Replace("]", string.Empty).Split("["); // do not remove empty string here

            IDictionary <string, object> currentModel = sourceModel;
            string currentPropertyName = "";
            var    currentIndex        = 0;

            while (currentIndex < listProperties.Length)
            {
                currentPropertyName = listProperties[currentIndex];

                // array of primitive data: list[]
                if (currentIndex < listProperties.Length - 1 && string.IsNullOrEmpty(listProperties[currentIndex + 1]))
                {
                    // create new array
                    if (!currentModel.ContainsKey(currentPropertyName))
                    {
                        currentModel[currentPropertyName] = new List <string>();
                    }

                    var list = (List <string>)currentModel[currentPropertyName];

                    // add new value
                    list.AddRange(value.ToArray());

                    // expect to stop here, there should be no more property
                    if (currentIndex != listProperties.Length - 2)
                    {
                        throw new ArgumentException($"Invalid parameter: name='{paramName}', value='{string.Join(",", value)}'");
                    }

                    return;
                }

                // array of complex data: model2s[0]
                if (currentIndex < listProperties.Length - 1 && int.TryParse(listProperties[currentIndex + 1], out int itemIndex))
                {
                    if (!currentModel.ContainsKey(currentPropertyName))
                    {
                        // create new array
                        currentModel[currentPropertyName] = new List <ExpandoObject>();
                    }

                    var list = (List <ExpandoObject>)currentModel[currentPropertyName];

                    if (list.Count <= itemIndex)
                    {
                        // create new model
                        list.Add(new ExpandoObject());
                    }

                    currentModel = list[itemIndex];

                    currentIndex += 2;
                }
                // normal property
                else
                {
                    // not yet last property => current index is a model
                    if (currentIndex < listProperties.Length - 1)
                    {
                        if (!currentModel.ContainsKey(currentPropertyName))
                        {
                            currentModel[currentPropertyName] = new ExpandoObject();
                        }

                        currentModel = (IDictionary <string, object>)currentModel[currentPropertyName];
                    }

                    currentIndex++;
                }
            }

            ValidateSingleValue(value);

            currentModel[currentPropertyName] = value[0];
        }
예제 #9
0
 public TypeWithStringValues(StringValues values, string other = "abc")
 {
     Other  = other;
     Values = values.ToArray();
 }
예제 #10
0
        public async Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            var _httpClient = new HttpClient(new HttpClientHandler()
            {
                AllowAutoRedirect = false
            });
            string curPort = "";

            if (context.Request.Query.TryGetValue("port", out StringValues forcedPort))
            {
                context.Response.Cookies.Delete("port");
                context.Response.Cookies.Append("port", forcedPort);
                curPort = forcedPort;
            }
            else
            {
                if (context.Request.Cookies.TryGetValue("port", out string cachedPort))
                {
                    curPort = cachedPort;
                }
            }

            if (!_portMappings.Contains(curPort))
            {
                await next.Invoke(context);
            }

            HttpRequestMessage request = new HttpRequestMessage();

            if (!string.Equals(context.Request.Method, "GET", StringComparison.OrdinalIgnoreCase) && !string.Equals(context.Request.Method, "HEAD", StringComparison.OrdinalIgnoreCase) && (!string.Equals(context.Request.Method, "DELETE", StringComparison.OrdinalIgnoreCase) && !string.Equals(context.Request.Method, "TRACE", StringComparison.OrdinalIgnoreCase)))
            {
                StreamContent streamContent = new StreamContent(context.Request.Body);
                request.Content = streamContent;
            }
            foreach (KeyValuePair <string, StringValues> header in context.Request.Headers)
            {
                HttpRequestHeaders headers1     = request.Headers;
                string             key1         = header.Key;
                StringValues       stringValues = header.Value;
                string[]           array1       = stringValues.ToArray();
                if (!headers1.TryAddWithoutValidation(key1, array1) && request.Content != null)
                {
                    HttpContent content = request.Content;
                    if (content != null)
                    {
                        HttpContentHeaders headers2 = content.Headers;
                        string             key2     = header.Key;
                        stringValues = header.Value;
                        string[] array2 = stringValues.ToArray();
                        headers2.TryAddWithoutValidation(key2, array2);
                    }
                }
            }
            request.Headers.Host = $"localhost:{curPort}";
            string uriString =
                $"http://localhost:{ curPort}{ context.Request.PathBase}{ context.Request.Path}{ context.Request.QueryString}";

            request.RequestUri = new Uri(uriString);
            request.Method     = new HttpMethod(context.Request.Method);
            HttpResponseMessage responseMessage = null;

            try
            {
                responseMessage = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted);

                // 处理重定向
                if (responseMessage.StatusCode == HttpStatusCode.MovedPermanently)
                {
                    context.Response.Redirect(responseMessage.Headers.Location.ToString());
                }
                context.Response.StatusCode = (int)responseMessage.StatusCode;
                foreach (KeyValuePair <string, IEnumerable <string> > header in responseMessage.Headers)
                {
                    context.Response.Headers[header.Key] = header.Value.ToArray();
                }
                foreach (KeyValuePair <string, IEnumerable <string> > header in responseMessage.Content.Headers)
                {
                    context.Response.Headers[header.Key] = header.Value.ToArray();
                }
                context.Response.Headers.Remove("transfer-encoding");
                //// 避免重定向引起的页面缓存
                //if (context.Response.Headers.TryGetValue("Cache-Control",out _))
                //{
                //    context.Response.Headers.Remove("Cache-Control");
                //}
                //context.Response.Headers.Add("Cache-Control", "must-revalidate");
                await responseMessage.Content.CopyToAsync(context.Response.Body);
            }
            catch (Exception e)
            {
                _logger.LogWarning(e, "代理访问调用失败,request:{request}", request.ToJson());
                await next.Invoke(context);
            }
            finally
            {
                responseMessage?.Dispose();
            }
        }
예제 #11
0
 private static string[] Convert(StringValues items)
 {
     return(items.ToArray());
 }
 private IEnumerable <FilterRequest> DeserializeFiltersAndCreateFilterRequests(StringValues filterValues)
 {
     return(filterValues.ToArray()
            .SelectMany(this.DeserializeFilter)
            .Select(f => this.InterpretFilterRequest(f.Key, f.Value)));
 }
예제 #13
0
 public StringValuesModel(StringValues value)
 {
     Value  = value.Count == 1 ? value.ToString() : default;
     Values = value.Count != 1 ? value.ToArray() : default;
 }
예제 #14
0
        public void DefaultNullOrEmpty_ExpectedValues(StringValues stringValues)
        {
            Assert.Equal(0, stringValues.Count);
            Assert.Null((string)stringValues);
            Assert.Equal((string)null, stringValues);
            Assert.Equal(string.Empty, stringValues.ToString());
            Assert.Equal(new string[0], stringValues.ToArray());

            Assert.True(StringValues.IsNullOrEmpty(stringValues));
            Assert.Throws<IndexOutOfRangeException>(() => stringValues[0]);
            Assert.Throws<IndexOutOfRangeException>(() => ((IList<string>)stringValues)[0]);
            Assert.Equal(string.Empty, stringValues.ToString());
            Assert.Equal(-1, ((IList<string>)stringValues).IndexOf(null));
            Assert.Equal(-1, ((IList<string>)stringValues).IndexOf(string.Empty));
            Assert.Equal(-1, ((IList<string>)stringValues).IndexOf("not there"));
            Assert.False(((ICollection<string>)stringValues).Contains(null));
            Assert.False(((ICollection<string>)stringValues).Contains(string.Empty));
            Assert.False(((ICollection<string>)stringValues).Contains("not there"));
            Assert.Equal(0, stringValues.Count());
        }
예제 #15
0
 /// <summary>
 /// Sets the forwarded for value to a <see cref="LogEntry"/>.
 /// </summary>
 /// <param name="logEntry">The log entry.</param>
 /// <param name="forwardedFor">The forwarded for value.</param>
 /// <returns>The same log entry.</returns>
 public static LogEntry SetForwardedFor(this LogEntry logEntry, StringValues forwardedFor) =>
 logEntry.SetForwardedFor(forwardedFor.ToArray());
예제 #16
0
        public static string GetBestMatch(List <string> mimeTypes, StringValues stringValues)
        {
            var requestMime = string.Join(", ", stringValues.ToArray() ?? new string[] {}).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(a => a.Trim());

            return(requestMime.FirstOrDefault(a => mimeTypes.Select(Normalize).Any(b => _equal(a, b)))?.ToString());
        }
예제 #17
0
 public static string ContvertToString(this StringValues stringValues)
 {
     return(String.Join("|", stringValues.ToArray()));
 }