protected void CanonicalizeQuery() { String queryString = Url.Query.TrimStart('?'); if (queryString == "") { //this.CanonicalQuery = ""; return; } List <String> lParams = queryString.Split('&').ToList(); Dictionary <String, String[]> dic = new Dictionary <String, String[]>(lParams.Count); foreach (String sParam in lParams) { String[] paramArr = sParam.Split('='); String paramName = paramArr[0]; String paramValue = paramArr[1]; String[] valArray; if (!dic.Keys.Contains(paramName)) { valArray = new String[1]; valArray[0] = paramValue; dic.Add(paramName, valArray); } else { String[] ExistingValues; dic.TryGetValue(paramName, out ExistingValues); var newValArray = new String[ExistingValues.Length + 1]; ExistingValues.CopyTo(newValArray, 0); newValArray[newValArray.Length - 1] = paramValue; dic[paramName] = newValArray.OrderBy(key => key).ToArray(); } } SortedDictionary <String, String[]> sDic = new SortedDictionary <String, String[]>(dic); //ignore jwt sDic.Remove("jwt"); //urlencode keys //urlencode values //sort keys //group same params by , List <String> lOutQuery = new List <String>(); foreach (KeyValuePair <String, String[]> par in sDic) { String sOutQuery = ""; sOutQuery += HttpUtility.UrlPathEncode(par.Key); sOutQuery += "="; sOutQuery += HttpUtility.UrlPathEncode(String.Join(",", par.Value)); lOutQuery.Add(sOutQuery); } this.CanonicalQuery = String.Join <String>("&", lOutQuery); }
IDictionary <object, object> GuardExistingValueList(string name) { IDictionary <object, object> valueList; if (!ExistingValues.TryGetValue(name, out valueList)) { ExistingValues.Add(name, valueList = new Dictionary <object, object>()); } return(valueList); }