public void To_UrlEncode() { const string url = "http://www.servicestack.net/a?b=c&d=f"; var urlEncoded = url.UrlEncode(); Assert.That(urlEncoded.ToUpper(), Is.EqualTo(HttpUtility.UrlEncode(url).ToUpper())); }
string GetCleanSummary() { string rawString = Element?.SelectSingleNode("summary")?.InnerXml; if (rawString is null) { return(""); } // Decodes xml entities like '&' rawString = WebUtility.HtmlDecode(rawString); rawString = rawString.Replace("<see cref=", "").Replace("/>", ""); // cleanup tabs and spaces on new line string final = ""; foreach (string lines in rawString.Split(new[] { '\n' }, StringSplitOptions.None)) { string cleanedLine = lines.Trim(); if (final != "") { final += $"\n{cleanedLine}"; } else { final += cleanedLine; } } return(final); }
/// <summary> /// Parse the token request callback Parameter to extract the state and the token ID. Verify that the /// state contains the CSRF token hash and that the signature on the state and CSRF token is /// valid. /// </summary> /// <param name="callbackParams">the token request callback parameters</param> /// <param name="csrfToken">the csrf token</param> /// <returns>an instance of <see cref="TokenRequestCallback"/></returns> public Task <TokenRequestCallback> ParseTokenRequestCallbackParams( IDictionary <string, string> callbackParams, string csrfToken) { var unauthenticated = ClientFactory.Unauthenticated(channel); return(unauthenticated.GetTokenMember() .Map(member => { var parameters = TokenRequestCallbackParameters.Create(callbackParams); var state = TokenRequestState.ParseFrom(parameters.SerializedState); if (!state.CsrfTokenHash.Equals(Util.HashString(csrfToken))) { throw new InvalidStateException(csrfToken); } var payload = new TokenRequestStatePayload { TokenId = parameters.TokenId, //ToDo(RD-2410): Remove WebUtility.UrlEncode call. It's only for backward compatibility with the old Token Request Flow. State = WebUtility.UrlEncode(parameters.SerializedState) }; Util.VerifySignature(member, payload, parameters.Signature); return TokenRequestCallback.Create(parameters.TokenId, state.InnerState); })); }
/// <summary> /// Generates a Token request URL from a request ID, an original state and a CSRF token. /// </summary> /// <param name="requestId">the request id</param> /// <param name="state">the state</param> /// <param name="csrfToken">the csrf token</param> /// <returns>the token request url</returns> public Task <string> GenerateTokenRequestUrl( string requestId, string state = "", string csrfToken = "") { var csrfTokenHash = Util.HashString(csrfToken); var tokenRequestState = TokenRequestState.Create(csrfTokenHash, state); return(Task.FromResult(string.Format( TOKEN_REQUEST_TEMPLATE, tokenCluster.WebAppUrl, requestId, WebUtility.UrlEncode(tokenRequestState.Serialize())))); }
private void reportCheck(System.IO.TextWriter writer, BaseCheck check) { writer.WriteLine("<table>"); writer.WriteLine("<tr><td>name</td><td>{0}</td></tr>", E.HtmlEncode(check.Name)); writer.WriteLine("<tr><td>description</td><td>{0}</td></tr>", E.HtmlEncode(check.Description)); if (check.Result.Skipped) { writer.WriteLine("<tr><td style='background-color: yellow; color: black'>skipped</td><td>was not run (CanRun = false)</td></tr>"); } else { writer.WriteLine("<tr><td {0}>successful</td><td>{1}</td></tr>", check.Result.Successful? "style='background-color: lime; color: black'" : "style='background-color: red; color: white'", check.Result.Successful); writer.WriteLine("<tr><td>error</td><td>{0}</td></tr>", check.Result.Exception != null? E.HtmlEncode(check.Result.Exception.ToString()) : string.Empty); writer.WriteLine("<tr><td>results</td><td>"); writer.WriteLine("<br /> <table>"); foreach (var kv in check.Result) { writer.WriteLine("<tr><td>{0}</td><td>{1}</td></tr>", E.HtmlEncode(kv.Key), E.HtmlEncode(kv.Value.ToString())); } writer.WriteLine(" </table>"); writer.WriteLine(" </td></tr>"); } writer.WriteLine("</table>"); writer.WriteLine("<br />"); }
/// <summary> /// Decomposes the query string. /// </summary> /// <param name="uri">The full uri.</param> /// <returns>The query string values.</returns> public static IDictionary <string, string> GetQueryString(string uri) { var pairs = new Dictionary <string, string>(); var queryString = uri.Split('?'); if (queryString.Length < 2) { return(pairs); } var keyValuePairs = queryString[1].Split('&'); foreach (var keyValuePair in keyValuePairs) { if (keyValuePair.IndexOf('=') > 0) { var pair = keyValuePair.Split('='); pairs.Add(pair[0], Web.UrlDecode(pair[1])); } } return(pairs); }
/// <summary> /// Link to edit a document. /// </summary> /// <param name="uid">The unique identifier.</param> /// <returns>The view link.</returns> public static string EditDocument(string uid) => $"/Edit/{Web.UrlEncode(uid)}";
/// <summary> /// Link to view a document. /// </summary> /// <param name="uid">The unique identifier.</param> /// <param name="auditId">The audit id.</param> /// <returns>The view link.</returns> public static string ViewDocument( string uid, Guid auditId = default) => auditId == default ? $"/View/{Web.UrlEncode(uid)}" : $"/View/{Web.UrlEncode(uid)}?history={Web.UrlEncode(auditId.ToString())}";
public TrackManager(Func <bool> PreprocessCheck, Func <string> KcaQSync_Pass) { this.PreprocessCheck = PreprocessCheck; var homeport = KanColleClient.Current.Homeport; var proxy = KanColleClient.Current.Proxy; var MapInfo = new TrackerMapInfo(); battleCalculator = new BattleCalculator(); slotitemTracker = new SlotItemTracker(homeport, proxy); // 동기화 { var pass = KcaQSync_Pass?.Invoke(); if (!string.IsNullOrEmpty(pass)) { var json = DynamicJson.Serialize(new { userid = KanColleClient.Current.Homeport.Admiral.RawData.api_member_id, pass = pass }); HTTPRequest.PostAsync( "http://kcaqsync.swaytwig.com/api/read", "data=" + WebUtility.UrlEncode(RSA.Encrypt(json)), y => { var result = DynamicJson.Parse(y); if (result.status.ToString() == "error") { return; } ApplySyncData( result.data.ToString() as string, Convert.ToInt64(result.timestamp.ToString() as string) ); } ); } } this.QuestsEventChanged += (s, e) => { var enc36 = new Func <int, string>(input => { var table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ="; var output = ""; do { output = table[input % 36] + output; input /= 36; } while (input > 0); return(output); }); var enc37 = new Func <int, string>(input => { var table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ="; var output = ""; do { var pos = Math.Min(table.Length - 1, input); output += table[pos]; input -= pos; } while (input > 0); return(output); }); var pass = KcaQSync_Pass?.Invoke(); if (string.IsNullOrEmpty(pass)) { return; } var data = ""; foreach (var item in this.trackingAvailable) { if (item.GetType() == typeof(DefaultTracker)) { continue; } if (item.GetRawDatas().All(x => x == 0) && !item.IsTracking) { continue; } var content = (item.IsTracking ? "1" : "0") + enc36(item.Id).PadLeft(2, '0') + string.Join("", item.GetRawDatas().Select(enc37)); data += enc37(content.Length) + content; } var json = DynamicJson.Serialize(new { userid = KanColleClient.Current.Homeport.Admiral.RawData.api_member_id, pass = pass, data = data }); HTTPRequest.PostAsync( "http://kcaqsync.swaytwig.com/api/write", "data=" + WebUtility.UrlEncode(RSA.Encrypt(json)), y => { } ); }; // 편성 변경 homeport.Organization.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(homeport.Organization.Fleets)) { var fleets = homeport.Organization.Fleets.Select(x => x.Value); foreach (var x in fleets) { x.State.Updated += (_, _2) => Preprocess(() => HenseiEvent?.Invoke(this, _EventArgs.Empty)); } } }; // 장비 변경 proxy.api_req_kaisou_slot_exchange_index.TryParse <kcsapi_slot_exchange_index>() .Subscribe(x => Preprocess(() => EquipEvent?.Invoke(this, _EventArgs.Empty))); proxy.api_req_kaisou_slot_deprive.TryParse <kcsapi_slot_deprive>() .Subscribe(x => Preprocess(() => EquipEvent?.Invoke(this, _EventArgs.Empty))); // 근대화 개수 proxy.api_req_kaisou_powerup.TryParse <kcsapi_powerup>() .Subscribe(x => Preprocess(() => PowerUpEvent?.Invoke(this, new BaseEventArgs(x.Data.api_powerup_flag != 0)))); // 개수공창 개수 proxy.api_req_kousyou_remodel_slot.TryParse <kcsapi_remodel_slot>() .Subscribe(x => Preprocess(() => ReModelEvent?.Invoke(this, new BaseEventArgs(x.Data.api_remodel_flag != 0)))); // 폐기 slotitemTracker.DestroyItemEvent += (s, e) => Preprocess(() => DestoryItemEvent?.Invoke(this, e)); // 해체 proxy.api_req_kousyou_destroyship.TryParse <kcsapi_destroyship>() .Subscribe(x => Preprocess(() => DestoryShipEvent?.Invoke(this, new DestroyShipEventArgs(x.Request, x.Data)))); // 건조 proxy.api_req_kousyou_createship.TryParse <kcsapi_createship>() .Subscribe(x => Preprocess(() => CreateShipEvent?.Invoke(this, _EventArgs.Empty))); // 개발 slotitemTracker.CreateItemEvent += (s, e) => Preprocess(() => CreateItemEvent?.Invoke(this, e)); // 보급 proxy.api_req_hokyu_charge.TryParse <kcsapi_charge>() .Subscribe(x => Preprocess(() => ChargeEvent?.Invoke(this, _EventArgs.Empty))); // 입거 proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_nyukyo/start") .Subscribe(x => Preprocess(() => RepairStartEvent?.Invoke(this, _EventArgs.Empty))); // 원정 proxy.api_req_mission_result.TryParse <kcsapi_mission_result>() .Subscribe(x => Preprocess(() => MissionResultEvent?.Invoke(this, new MissionResultEventArgs(x.Data)))); // 출격 (시작, 진격) proxy.api_req_map_start.TryParse <kcsapi_map_start_next>() .Subscribe(x => Preprocess(() => MapInfo.Reset(x.Data.api_maparea_id, x.Data.api_mapinfo_no, x.Data.api_no, x.Data.api_event_id == 5))); proxy.api_req_map_next.TryParse <kcsapi_map_start_next>() .Subscribe(x => Preprocess(() => MapInfo.Next(x.Data.api_maparea_id, x.Data.api_mapinfo_no, x.Data.api_no, x.Data.api_event_id == 5))); #region 전투 #region 통상 - 주간전 / 연습 - 주간전 proxy.api_req_sortie_battle .TryParse <kcsapi_sortie_battle>().Subscribe(x => this.Update(x.Data, ApiTypes.sortie_battle)); proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_practice/battle") .TryParse <practice_battle>().Subscribe(x => this.Update(x.Data, ApiTypes.practice_battle)); #endregion #region 통상 - 야전 / 통상 - 개막야전 / 연습 - 야전 proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_battle_midnight/battle") .TryParse <kcsapi_sortie_battle_midnight>().Subscribe(x => this.Update(x.Data, ApiTypes.sortie_battle_midnight)); proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_battle_midnight/sp_midnight") .TryParse <battle_midnight_sp_midnight>().Subscribe(x => this.Update(x.Data, ApiTypes.sortie_battle_midnight_sp)); proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_practice/midnight_battle") .TryParse <practice_midnight_battle>().Subscribe(x => this.Update(x.Data, ApiTypes.practice_midnight_battle)); #endregion #region 항공전 - 주간전 / 공습전 - 주간전 proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_sortie/airbattle") .TryParse <kcsapi_sortie_airbattle>().Subscribe(x => this.Update(x.Data, ApiTypes.sortie_airbattle)); proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_sortie/ld_airbattle") .TryParse <sortie_ld_airbattle>().Subscribe(x => this.Update(x.Data, ApiTypes.sortie_ld_airbattle)); #endregion #region 연합함대 - 주간전 proxy.api_req_combined_battle_battle .TryParse <kcsapi_combined_battle>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_battle)); proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_combined_battle/battle_water") .TryParse <combined_battle_battle_water>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_battle_water)); #endregion #region 연합vs연합 - 주간전 proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_combined_battle/ec_battle") .TryParse <kcsapi_combined_battle_each>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_battle_ec)); proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_combined_battle/each_battle") .TryParse <kcsapi_combined_battle_each>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_battle_each)); proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_combined_battle/each_battle_water") .TryParse <kcsapi_combined_battle_each>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_battle_each_water)); #endregion #region 연합함대 - 항공전 / 공습전 proxy.api_req_combined_battle_airbattle .TryParse <kcsapi_combined_airbattle>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_airbattle)); proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_combined_battle/ld_airbattle") .TryParse <combined_battle_ld_airbattle>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_ld_airbattle)); #endregion #region 연합함대 - 야전 proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_combined_battle/midnight_battle") .TryParse <kcsapi_combined_battle_midnight>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_battle_midnight)); proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_combined_battle/sp_midnight") .TryParse <combined_battle_sp_midnight>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_battle_midnight_sp)); #endregion #region vs 연합 - 야전 proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_combined_battle/ec_midnight_battle") .TryParse <kcsapi_combined_battle_midnight_ec>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_battle_midnight_ec)); #endregion #region vs 연합 - 야전>주간전 proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_combined_battle/ec_night_to_day") .TryParse <kcsapi_combined_battle_ec_nighttoday>().Subscribe(x => this.Update(x.Data, ApiTypes.combined_battle_ec_nighttoday)); #endregion #endregion // 전투 종료 (연합함대 포함) proxy.api_req_sortie_battleresult.TryParse <kcsapi_battle_result>() .Subscribe(x => Preprocess(() => BattleResultEvent?.Invoke(this, new BattleResultEventArgs( MapInfo.AfterCombat(), battleCalculator.EnemyFirstShips, battleCalculator.EnemySecondShips, x.Data ) ))); proxy.api_req_combined_battle_battleresult.TryParse <kcsapi_battle_result>() .Subscribe(x => Preprocess(() => BattleResultEvent?.Invoke(this, new BattleResultEventArgs( MapInfo.AfterCombat(), battleCalculator.EnemyFirstShips, battleCalculator.EnemySecondShips, x.Data ) ))); // 연습전 종료 proxy.ApiSessionSource.Where(x => x.Request.PathAndQuery == "/kcsapi/api_req_practice/battle_result") .TryParse <kcsapi_battle_result>().Subscribe(x => Preprocess(() => PracticeResultEvent?.Invoke(this, new PracticeResultEventArgs(x.Data))) ); // Register all trackers trackingAvailable = new ObservableCollection <TrackerBase>(trackingAvailable.OrderBy(x => x.Id)); trackingAvailable.CollectionChanged += (sender, e) => { if (e.Action != NotifyCollectionChangedAction.Add) { return; } foreach (TrackerBase tracker in e.NewItems) { tracker.RegisterEvent(this); tracker.ResetQuest(); tracker.ProgressChanged += () => { try { QuestsEventChanged?.Invoke(this, _EventArgs.Empty); } catch { } }; } }; }
public void HtmlEncode_1() { Console.WriteLine(SymbolChars); Console.WriteLine(NetWebUtility.HtmlEncode(SymbolChars)); Console.WriteLine(WebHttpUtility.HtmlEncode(SymbolChars)); }