using System; using System.Net; // http://www.fiddler2.com/fiddler/Core/ using Fiddler; public static class MockWebProxyHelper { public enum HttpMethods { GET, POST, PUT, Unknown } public class Response { public Response(string header = "HTTP/1.1 200 OK", string body = "", string contentType = "application/json") { Header = header; Body = body; ContentType = contentType; } public string Header { get; private set; } public string Body { get; private set; } public string ContentType { get; private set; } } public static Func GetMockResponse = delegate { return new Response(); }; public static Func InterceptRequest = delegate { return true; }; public static void SetUp(bool registerAsSystemProxy = false) { const int port = 18833; FiddlerApplication.Startup(port, FiddlerCoreStartupFlags.DecryptSSL | (registerAsSystemProxy ? FiddlerCoreStartupFlags.RegisterAsSystemProxy : FiddlerCoreStartupFlags.None)); WebRequest.DefaultWebProxy = new WebProxy("localhost", port); FiddlerApplication.BeforeRequest += BeforeRequest; } private static void BeforeRequest(Session session) { var httpMethod = GetHttpMethod(session); var url = session.url; if (InterceptRequest(httpMethod, url)) { session.utilCreateResponseAndBypassServer(); var response = GetMockResponse(httpMethod, url); session.oResponse.headers = Parser.ParseResponse(response.Header); session.oResponse.headers.Add("Content-Type", response.ContentType); session.utilSetResponseBody(response.Body); } } private static HttpMethods GetHttpMethod(Session session) { return session.HTTPMethodIs("GET") ? HttpMethods.GET : session.HTTPMethodIs("POST") ? HttpMethods.POST : session.HTTPMethodIs("PUT") ? HttpMethods.PUT : HttpMethods.Unknown; } public static void TearDown() { FiddlerApplication.BeforeRequest -= BeforeRequest; FiddlerApplication.oProxy.Detach(); FiddlerApplication.Shutdown(); } }