Skip to content

feat: add soaxreport tool for ECH testing via SOAX proxies#5

Open
jyyi1 wants to merge 19 commits intomainfrom
junyi/soax-report
Open

feat: add soaxreport tool for ECH testing via SOAX proxies#5
jyyi1 wants to merge 19 commits intomainfrom
junyi/soax-report

Conversation

@jyyi1
Copy link
Contributor

@jyyi1 jyyi1 commented Jan 20, 2026

Introduces a tool to test ECH GREASE compatibility globally using SOAX proxies. It measures performance and connectivity across different countries and ISPs.

@jyyi1 jyyi1 marked this pull request as ready for review January 29, 2026 05:03
@jyyi1 jyyi1 requested a review from fortuna January 29, 2026 05:06
}

// Args defines the execution parameters for a single curl run.
type Args struct {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like we are adding a translation layer here that is not necessary.
You are writing the params in the Args language to then convert to curl language. One might as well write straight to curl language.

There's also a lot of duplication with

func runTest(curlPath string, domain tranco.Domain, echGrease bool, maxTime time.Duration) TestResult {

I think we can extract runTest instead. Doesn't it work for both reports? That will also make it clearer that we are running the same test!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have removed the translation layer internal/curl and moved the execution logic to internal/echtest.Run. I am not fully deduplicating greasereport in this PR to keep the scope manageable, but I have added a TODO there to migrate it to internal/echtest in the future.

csvWriter := csv.NewWriter(outputFile)
defer csvWriter.Flush()

header := []string{
Copy link
Contributor

@fortuna fortuna Feb 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please fetch and output the exit node AS number and name. They are more universal than the SOAX IDs, so we should have both

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where's it in the output? Is that the isp field? That's just the SOAX id. We need the AS name, and to validate the SOAX output (do our own mapping), because some proxy services lie about their location and people will for sure ask about that. We should flag whenever the SOAX ASN doesn't match our ASN lookup.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not yet. Shall we download the GeoIP DB file to this PR, I feel it's too big, maybe we just guide the users downloading themselves to the workspace folder?

@jyyi1 jyyi1 force-pushed the junyi/soax-report branch from 2c904ca to f0557b7 Compare March 10, 2026 14:38
csvWriter := csv.NewWriter(outputFile)
defer csvWriter.Flush()

header := []string{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where's it in the output? Is that the isp field? That's just the SOAX id. We need the AS name, and to validate the SOAX output (do our own mapping), because some proxy services lie about their location and people will for sure ask about that. We should flag whenever the SOAX ASN doesn't match our ASN lookup.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants