Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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.");
                        }
                    }
            }
        }