예제 #1
0
        /// <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;
        }
예제 #2
0
        /// <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;
        }