private static async Task MainAsync() { // configure var settings = new TorSharpSettings { ZippedToolsDirectory = Path.Combine(Path.GetTempPath(), "TorZipped"), ExtractedToolsDirectory = Path.Combine(Path.GetTempPath(), "TorExtracted"), PrivoxySettings = { Port = 18118, }, TorSettings = { SocksPort = 19050, ControlPort = 19051, ControlPassword = "******", }, }; // output runtime information var message = new StringBuilder(); message.Append($"Running the sample on {settings.OSPlatform} OS and {settings.Architecture} architecture."); #if NETCOREAPP message.Append($" OS description: {RuntimeInformation.OSDescription}."); #endif Console.WriteLine(message.ToString()); Console.WriteLine(); // download tools using (var httpClient = new HttpClient()) { var fetcher = new TorSharpToolFetcher(settings, httpClient); var updates = await fetcher.CheckForUpdatesAsync(); Console.WriteLine($"Current Privoxy: {updates.Privoxy.LocalVersion?.ToString() ?? "(none)"}"); Console.WriteLine($" Latest Privoxy: {updates.Privoxy.LatestDownload.Version}"); Console.WriteLine(); Console.WriteLine($"Current Tor: {updates.Tor.LocalVersion?.ToString() ?? "(none)"}"); Console.WriteLine($" Latest Tor: {updates.Tor.LatestDownload.Version}"); Console.WriteLine(); if (updates.HasUpdate) { await fetcher.FetchAsync(updates); } } // execute using (var proxy = new TorSharpProxy(settings)) { var handler = new HttpClientHandler { Proxy = new WebProxy(new Uri("http://localhost:" + settings.PrivoxySettings.Port)) }; using (handler) using (var httpClient = new HttpClient(handler)) { await proxy.ConfigureAndStartAsync(); Console.WriteLine(await httpClient.GetStringAsync("http://api.ipify.org")); await proxy.GetNewIdentityAsync(); Console.WriteLine(await httpClient.GetStringAsync("http://api.ipify.org")); using (var controlClient = await proxy.GetControlClientAsync()) { var read = await controlClient.GetTrafficReadAsync(); Console.WriteLine("Bytes read : {0}", read); var written = await controlClient.GetTrafficWrittenAsync(); Console.WriteLine("Bytes written : {0}", written); } } proxy.Stop(); } }
public async Task TrafficReadAndWritten() { using (var te = TestEnvironment.Initialize(_output)) { // Arrange var settings = te.BuildSettings(); settings.ToolRunnerType = ToolRunnerType.Simple; using (var httpClient = new HttpClient()) using (var proxy = new TorSharpProxy(settings)) { _output.WriteLine(settings); var fetcher = _httpFixture.GetTorSharpToolFetcher(settings, httpClient); await fetcher.FetchAsync(); _output.WriteLine("The tools have been fetched"); await proxy.ConfigureAndStartAsync(); _output.WriteLine("The proxy has been started"); await GetCurrentIpAddressAsync(proxy, settings); _output.WriteLine("The first request has succeeded"); // Act using (var controlClient = await proxy.GetControlClientAsync()) { var readBefore = await controlClient.GetTrafficReadAsync(); _output.WriteLine($"Read before: {readBefore}"); var writtenBefore = await controlClient.GetTrafficWrittenAsync(); _output.WriteLine($"Written before: {writtenBefore}"); // Upload and download some bytes var bytes = 10000; await SendProxiedRequestAsync( proxy, settings, $"uploading and downloading {bytes} bytes", async proxiedHttpClient => { using (var content = new ByteArrayContent(new byte[bytes])) using (var response = await proxiedHttpClient.PostAsync("https://httpbin.org/anything", content)) { } return(true); }); var readAfter = await controlClient.GetTrafficReadAsync(); _output.WriteLine($"Read after: {readBefore}"); var writtenAfter = await controlClient.GetTrafficWrittenAsync(); _output.WriteLine($"Written after: {writtenBefore}"); // Assert Assert.True(readBefore + bytes <= readAfter, $"At least {bytes} more bytes should have been read."); Assert.True(writtenBefore + bytes <= writtenAfter, $"At least {bytes} more bytes should have been written."); } } } }