me-web? 0.5.1: the route from the server back to you arrives
- With the test from outside, the route from the publisher's server back to your address came back empty: the trace program holds its output until it ends, and it was stopped first while waiting on routers that never answer. It now reports each router as soon as it answers and stops after three silent ones, so the routers in front of your provider's exit reach the app. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
This commit is contained in:
1 parent
eb8be87284
commit
bed3af9b2f
2 files changed
+9
-3
No files matched your search
@@ -1,6 +1,6 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>0.5.0</Version>
|
<Version>0.5.1</Version>
|
||||||
<Product>me-web?</Product>
|
<Product>me-web?</Product>
|
||||||
<Company>Arasaka di Hvozdikov Yevheniy</Company>
|
<Company>Arasaka di Hvozdikov Yevheniy</Company>
|
||||||
<Copyright>© 2026 Arasaka di Hvozdikov Yevheniy</Copyright>
|
<Copyright>© 2026 Arasaka di Hvozdikov Yevheniy</Copyright>
|
||||||
|
|||||||
@@ -95,18 +95,21 @@ public partial class ProbeService(IOptionsMonitor<ProbeOptions> options, ILogger
|
|||||||
await tracing.WaitAsync(ct);
|
await tracing.WaitAsync(ct);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var info = new ProcessStartInfo("tracepath") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false };
|
var info = new ProcessStartInfo("stdbuf") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false };
|
||||||
foreach (var argument in new[] { "-n", "-m", "16", target.ToString() }) info.ArgumentList.Add(argument);
|
foreach (var argument in new[] { "-oL", "tracepath", "-n", "-m", "16", target.ToString() }) info.ArgumentList.Add(argument);
|
||||||
using var process = Process.Start(info);
|
using var process = Process.Start(info);
|
||||||
if (process is null) return hops;
|
if (process is null) return hops;
|
||||||
using var timeout = CancellationTokenSource.CreateLinkedTokenSource(ct);
|
using var timeout = CancellationTokenSource.CreateLinkedTokenSource(ct);
|
||||||
timeout.CancelAfter(TimeSpan.FromSeconds(25));
|
timeout.CancelAfter(TimeSpan.FromSeconds(25));
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var silent = 0;
|
||||||
while (await process.StandardOutput.ReadLineAsync(timeout.Token) is { } line)
|
while (await process.StandardOutput.ReadLineAsync(timeout.Token) is { } line)
|
||||||
{
|
{
|
||||||
|
if (SilentLine().IsMatch(line) && ++silent >= 3) break;
|
||||||
var match = HopLine().Match(line);
|
var match = HopLine().Match(line);
|
||||||
if (!match.Success || !IPAddress.TryParse(match.Groups[2].Value, out var address)) continue;
|
if (!match.Success || !IPAddress.TryParse(match.Groups[2].Value, out var address)) continue;
|
||||||
|
silent = 0;
|
||||||
var distance = int.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture);
|
var distance = int.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture);
|
||||||
if (hops.Any(h => h.Distance == distance)) continue;
|
if (hops.Any(h => h.Distance == distance)) continue;
|
||||||
if (!IsPublic(address) || Refuse(address) is not null) continue;
|
if (!IsPublic(address) || Refuse(address) is not null) continue;
|
||||||
@@ -148,6 +151,9 @@ public partial class ProbeService(IOptionsMonitor<ProbeOptions> options, ILogger
|
|||||||
[GeneratedRegex(@"^\s*(\d+):\s+([0-9a-fA-F.:]+)\s+([\d.]+)ms")]
|
[GeneratedRegex(@"^\s*(\d+):\s+([0-9a-fA-F.:]+)\s+([\d.]+)ms")]
|
||||||
internal static partial Regex HopLine();
|
internal static partial Regex HopLine();
|
||||||
|
|
||||||
|
[GeneratedRegex(@"^\s*\d+:\s+no reply")]
|
||||||
|
internal static partial Regex SilentLine();
|
||||||
|
|
||||||
async Task<ProbeOutcome> Knock(Ticket ticket, int port, CancellationToken ct)
|
async Task<ProbeOutcome> Knock(Ticket ticket, int port, CancellationToken ct)
|
||||||
{
|
{
|
||||||
await outbound.WaitAsync(ct);
|
await outbound.WaitAsync(ct);
|
||||||
|
|||||||
Reference in new issue
Block a user