• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

stacklok / toolhive / 41912518784
73%

Build:
DEFAULT BRANCH: main
Ran 04 Nov 2026 09:14PM UTC
Jobs 1
Files 1002
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

04 Nov 2026 09:03PM UTC coverage: 72.74% (+0.07%) from 72.674%
41912518784

push

github

web-flow
Merge commit from fork

* Fail closed on content-encoded list responses

The transparent proxy forwarded the client's Accept-Encoding to the
backend, which stops Go's transport from decoding the response. A
compressing backend then handed the authz list filter a body it could
not parse, and the filter passed it through unfiltered, disclosing
tools, prompts, resources and skills that policy hides.

Drop Accept-Encoding in the proxy so the transport negotiates gzip
itself and delivers a decoded body. As defense in depth, make the
response filter fail closed when a filtered method's response still
carries a non-identity Content-Encoding.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Harden encoded-response rejection in list filters

The content-encoding fail-closed check missed handlers that call Write without WriteHeader, and a flushed response had already committed its headers before the error replaced the body.

Latch the encoding from every writer entry point, rewrite the response head before Flush commits it, and drop all stale entity headers from the replacement error. Log the encoding and backend status.

Move the Accept-Encoding strip out of the transparent proxy and into the authz and tool-list middleware, so only requests whose responses are filtered lose compression and every chain using the filters is covered.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fail closed on encoded tools/list responses

The tool filter buffers a tools/list body and parses it by Content-Type. A backend that compresses unprompted sends bytes that fail to parse, which the terminal drain writes through unchanged, so the client receives the unfiltered tool list.

Refuse a Content-Encoded tools/list response: fix the head to a 500 JSON error before it commits, drop the body, and write a JSON-RPC internal error that echoes the request id. Share the encoding check and stale entity header removal with the authz filter.

Co-Authored-By: Clau... (continued)

52 of 52 new or added lines in 3 files covered. (100.0%)

20 existing lines in 6 files now uncovered.

93685 of 128794 relevant lines covered (72.74%)

850.4 hits per line

Coverage Regressions

Lines Coverage ∆ File
9
87.1
0.0% pkg/webhook/types.go
4
85.5
0.0% pkg/webhook/mutating/middleware.go
3
64.29
-21.43% pkg/authserver/upstream/tokens.go
2
73.19
-0.27% pkg/transport/proxy/streamable/streamable_proxy.go
1
96.77
-3.23% pkg/foreach/foreach.go
1
90.0
0.0% pkg/webhook/validating/middleware.go
Jobs
ID Job ID Ran Files Coverage
1 41912518784.1 04 Nov 2026 09:14PM UTC 1002
72.74
GitHub Action Run
Source Files on build 41912518784
  • Tree
  • List 1002
  • Changed 15
  • Source Changed 7
  • Coverage Changed 15
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #41912518784
  • a24f0638 on github
  • Prev Build on main (#41910049034)
  • Next Build on main (#42001429620)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc