Last active
January 7, 2020 08:01
-
-
Save CosminGramada/9d0f1de00b1e6b5216e94ea0576ad139 to your computer and use it in GitHub Desktop.
ProxyConfig
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class ProxyConfig | |
{ | |
private readonly string _secureEndpointHostname = IPAddress.Any.ToString(); | |
private readonly int _secureEndpointPort = 4555; | |
private readonly int _port = 18882; | |
private static readonly ICollection<Session> AllSessions = new List<Session>(); | |
private static Fiddler.Proxy _secureEndpoint; | |
private static readonly LoggerCnx Logger = new LoggerCnx(); | |
private Action<string> onRequest; | |
public ProxyConfig() | |
{ | |
} | |
public ProxyConfig(Action<string> onRequest) | |
{ | |
this.onRequest = onRequest; | |
} | |
public void SetupProxyListener() | |
{ | |
FiddlerApplication.SetAppDisplayName("FiddlerCoreProxyApp"); | |
// This is a workaround for known issue in .NET Core - https://github.com/dotnet/coreclr/issues/12668 | |
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US"); | |
// Simply echo notifications to the console. Because Fiddler.CONFIG.QuietMode=true | |
// by default, we must handle notifying the user ourselves. | |
//Fiddler.FiddlerApplication.OnNotification += delegate (object sender, NotificationEventArgs oNEA) { System.Diagnostics.Debug.WriteLine("** NotifyUser: " + oNEA.NotifyString); }; | |
FiddlerApplication.Log.OnLogString += delegate (object sender, LogEventArgs oLEA) { Logger.Info("** LogString: " + oLEA.LogString); }; | |
FiddlerApplication.BeforeRequest += delegate (Session session) | |
{ | |
if (!CertMaker.rootCertIsTrusted()) | |
{ | |
CertMaker.trustRootCert(); | |
} | |
if (onRequest != null) | |
{ | |
onRequest(session.fullUrl); | |
} | |
// In order to enable response tampering, buffering mode MUST | |
// be enabled; this allows FiddlerCore to permit modification of | |
// the response in the BeforeResponse handler rather than streaming | |
// the response to the client as the response comes in. | |
session.bBufferResponse = false; | |
lock (AllSessions) | |
{ | |
AllSessions.Add(session); | |
Logger.Info("Session: " + session.fullUrl); | |
} | |
session["X-AutoAuth"] = "(default)"; | |
if ((session.oRequest.pipeClient.LocalPort == _secureEndpointPort) && (session.hostname == _secureEndpointHostname)) | |
{ | |
session.utilCreateResponseAndBypassServer(); | |
session.oResponse.headers.SetStatus(200, "OK"); | |
session.oResponse["Content-Type"] = "text/html; charset=UTF-8"; | |
session.oResponse["Cache-Control"] = "private, max-age=0"; | |
session.utilSetResponseBody("<html><body>Request for httpS://" + _secureEndpointHostname + ":" + _secureEndpointPort.ToString() + " received. Your request was:<br /><plaintext>" + session.oRequest.headers.ToString()); | |
} | |
}; | |
Logger.Info($"Starting {FiddlerApplication.GetVersionString()}..."); | |
CONFIG.IgnoreServerCertErrors = true; | |
CONFIG.bCaptureCONNECT = true; | |
FiddlerApplication.Prefs.SetBoolPref("fiddler.network.streaming.abortifclientaborts", true); | |
FiddlerCoreStartupFlags startupFlags = FiddlerCoreStartupFlags.Default; | |
startupFlags = (startupFlags | FiddlerCoreStartupFlags.DecryptSSL); | |
startupFlags = (startupFlags | FiddlerCoreStartupFlags.AllowRemoteClients); | |
startupFlags = (startupFlags & ~FiddlerCoreStartupFlags.MonitorAllConnections); | |
startupFlags = (startupFlags & ~FiddlerCoreStartupFlags.CaptureLocalhostTraffic); | |
FiddlerApplication.Startup(_port, startupFlags); | |
Logger.Info("Created endpoint listening on port {0}", _port); | |
Logger.Info("Starting with settings: [{0}]", startupFlags); | |
Logger.Info("Gateway: {0}", CONFIG.UpstreamGateway.ToString()); | |
// Create a HTTPS listener, useful for when FiddlerCore is masquerading as a HTTPS server | |
// instead of acting as a normal CERN-style proxy server. | |
_secureEndpoint = FiddlerApplication.CreateProxyEndpoint(_secureEndpointPort, true, _secureEndpointHostname); | |
if (null != _secureEndpoint) | |
{ | |
Logger.Info("Created secure endpoint listening on port {0}, using a HTTPS certificate for '{1}'", _secureEndpointPort, _secureEndpointHostname); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment