/// <summary> /// Fiddler からのリクエスト発行時にプロキシを挟む設定を行います。 /// </summary> /// <param name="requestingSession">通信を行おうとしているセッション。</param> private void Fiddler_BeforeRequest(Fiddler.Session requestingSession) { if (requestingSession.hostname == "kancolleviewer.local") { requestingSession.utilCreateResponseAndBypassServer(); var path = requestingSession.PathAndQuery; var queryIndex = path.IndexOf('?'); if (queryIndex >= 0) { path = path.Substring(0, queryIndex); } Action <Fiddler.Session> handler; if (localRequestHandlers.TryGetValue(path, out handler)) { requestingSession.oResponse.headers.HTTPResponseCode = 200; requestingSession.oResponse.headers.HTTPResponseStatus = "200 OK"; handler?.Invoke(requestingSession); } else { requestingSession.oResponse.headers.HTTPResponseCode = 410; requestingSession.oResponse.headers.HTTPResponseStatus = "410 Gone"; } return; } var settings = this.UpstreamProxySettings; if (settings == null) { return; } var compiled = settings.CompiledRules; if (compiled == null) { settings.CompiledRules = compiled = ProxyRule.CompileRule(settings.Rules); } var result = ProxyRule.ExecuteRules(compiled, requestingSession.RequestMethod, new Uri(requestingSession.fullUrl)); if (result.Action == ProxyRule.MatchAction.Block) { requestingSession.utilCreateResponseAndBypassServer(); requestingSession.oResponse.headers.HTTPResponseCode = 450; requestingSession.oResponse.headers.HTTPResponseStatus = "450 Blocked As Requested"; return; } if (KanColleClient.Current.Settings.DisallowSortieWithHeavyDamage) { if (KanColleClient.Current.Homeport.Organization.Fleets.Any(x => x.Value.IsInSortie && x.Value.State.Situation.HasFlag(Models.FleetSituation.HeavilyDamaged))) { if (requestingSession.PathAndQuery.Length > 7 && requestingSession.PathAndQuery.Substring(0, 7) == "/kcsapi" && (requestingSession.PathAndQuery.Contains("battle") || requestingSession.PathAndQuery.Contains("sortie")) && !requestingSession.PathAndQuery.Contains("practice") && !requestingSession.PathAndQuery.Contains("result")) { requestingSession.utilCreateResponseAndBypassServer(); requestingSession.oResponse.headers.HTTPResponseCode = 450; requestingSession.oResponse.headers.HTTPResponseStatus = "450 Blocked As Requested"; return; } } } if (result.Action == ProxyRule.MatchAction.Proxy && result.Proxy != null) { requestingSession["X-OverrideGateway"] = result.Proxy; if (result.ProxyAuth != null && !requestingSession.RequestHeaders.Exists("Proxy-Authorization")) { requestingSession["X-OverrideGateway"] = result.Proxy; requestingSession.RequestHeaders.Add("Proxy-Authorization", result.ProxyAuth); } } requestingSession.bBufferResponse = false; }
/// <summary> /// Fiddler からのリクエスト発行時にプロキシを挟む設定を行います。 /// </summary> /// <param name="requestingSession">通信を行おうとしているセッション。</param> private void Fiddler_BeforeRequest(Session requestingSession) { if (requestingSession.hostname == "kancolleviewer.local") { requestingSession.utilCreateResponseAndBypassServer(); var path = requestingSession.PathAndQuery; var queryIndex = path.IndexOf('?'); if (queryIndex >= 0) { path = path.Substring(0, queryIndex); } Action <Session> handler; if (localRequestHandlers.TryGetValue(path, out handler)) { requestingSession.oResponse.headers.HTTPResponseCode = 200; requestingSession.oResponse.headers.HTTPResponseStatus = "200 OK"; handler?.Invoke(requestingSession); } else { requestingSession.oResponse.headers.HTTPResponseCode = 410; requestingSession.oResponse.headers.HTTPResponseStatus = "410 Gone"; } return; } var settings = this.UpstreamProxySettings; if (settings == null) { return; } var compiled = settings.CompiledRules; if (compiled == null) { settings.CompiledRules = compiled = ProxyRule.CompileRule(settings.Rules); } var result = ProxyRule.ExecuteRules(compiled, requestingSession.RequestMethod, new Uri(requestingSession.fullUrl)); if (result.Action == ProxyRule.MatchAction.Block) { requestingSession.utilCreateResponseAndBypassServer(); requestingSession.oResponse.headers.HTTPResponseCode = 403; requestingSession.oResponse.headers.HTTPResponseStatus = "403 Forbidden"; return; } if (result.Action == ProxyRule.MatchAction.Proxy && result.Proxy != null) { requestingSession["X-OverrideGateway"] = result.Proxy; if (result.ProxyAuth != null && !requestingSession.RequestHeaders.Exists("Proxy-Authorization")) { requestingSession["X-OverrideGateway"] = result.Proxy; requestingSession.RequestHeaders.Add("Proxy-Authorization", result.ProxyAuth); } } requestingSession.bBufferResponse = false; }