Repository navigation
fix: redact sensitive response headers in debug logs - #106
Conversation
There was a problem hiding this comment.
Pull request overview
This PR updates the internal/debugmiddleware request/response debug logger so that response headers are redacted before being dumped to logs, aligning response logging with the existing request redaction policy while preserving the original *http.Response returned to callers.
Changes:
- Apply sensitive-header redaction to a cloned
http.Responsebefore callinghttputil.DumpResponse. - Refactor header redaction into a shared
redactHeadershelper and reuse it for request redaction. - Add unit + integration-style HTTP tests to validate response header redaction and immutability (including repeated headers, redirects, and ensuring bodies are not consumed).
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| internal/debugmiddleware/debug_middleware.go | Redacts sensitive response headers by dumping a redacted response clone; refactors request redaction to reuse shared header redaction logic. |
| internal/debugmiddleware/debug_middleware_test.go | Adds coverage for response-header redaction (including redirects), verifies the original response object/headers are not mutated, and confirms bodies are not consumed. |
Suppressed comments (1)
internal/debugmiddleware/debug_middleware.go:69
- Typo in the redactRequest comment: "original is request" should be "the original request".
// original is request is returned unchanged if no redaction is necessary.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.
Suppressed comments (1)
internal/debugmiddleware/debug_middleware.go:69
- The
redactRequestdoc comment currently reads awkwardly because of a duplicated word across the line wrap ("... As a small optimization, the" / "the original request..."). Since this comment was touched, please fix the grammar for clarity.
// redactRequest redacts sensitive information from the request for logging
// purposes. If redaction is necessary, the request is cloned before mutating
// the original and that clone is returned. As a small optimization, the
// the original request is returned unchanged if no redaction is necessary.
|
Addressed Copilot submitted review 4975555643 in 2f0684d: removed the duplicated |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.
Suppressed comments (1)
internal/debugmiddleware/debug_middleware.go:60
redactResponsedereferencesrespunconditionally; if aMiddlewareNextever returns(nil, nil), this will panic during debug logging. Adding aresp != nilguard keeps the middleware robust (and still preserves current behavior for normalhttp.Client.Dousage).
if respBytes, err := httputil.DumpResponse(m.redactResponse(resp), false); err == nil {
m.logger.Printf("Response Content:\n%s\n", respBytes)
}
|
Addressed Copilot submitted review 4975655882 in da569ef. Added a fail-first regression proving |
HAYDEN-OAI
left a comment
There was a problem hiding this comment.
Two independently reproduced response-logging credential disclosures remain: case-variant sensitive headers and populated chunked-response trailers.
Castiron custom code✅ No new custom-code files detected. 6 mixed files remain; 0 existing customizations changed. Compared 6 existing customizations unchanged
A changed generated baseline means this report cannot reliably identify which handwritten lines changed. Inspect the custom-code diffDownload the exact patch produced by this run (requires repository access): gh run download 32310210044 --repo openai/openai-cli \
--name castiron-custom-code-32310210044-1 --dir /tmp/castiron-custom-code-32310210044-1
git apply --stat /tmp/castiron-custom-code-32310210044-1/custom-code.patch
cat /tmp/castiron-custom-code-32310210044-1/custom-code.patchOr reproduce it from an SDK checkout containing the vendored reporter: git fetch --no-tags origin b3e0946d9ae83ea5e31b24d728e5f7b80dd1b472 6fe9708764efe1e82bd5ddc85ed42b3c1edfabb9
python3 scripts/castiron/custom_code_report.py report \
--base b3e0946d9ae83ea5e31b24d728e5f7b80dd1b472 \
--head 6fe9708764efe1e82bd5ddc85ed42b3c1edfabb9 --fetch --require-head-hash --public \
--out /tmp/castiron-custom-code-6fe9708764ef
cat /tmp/castiron-custom-code-6fe9708764ef/custom-code.patchThis is the current full custom patch for mixed files, not an attribution of only the handwritten lines changed by this PR. |
…e-debug-response-headers
HAYDEN-OAI
left a comment
There was a problem hiding this comment.
Reviewed exact head 6fe9708. Confirmed the prior mixed-case response-header and populated-trailer credential disclosures are fixed: every case-variant authorization, API-key, cookie, and Location entry is independently redacted, while original response headers/trailers and unread streaming bodies remain unchanged. Verified custom transports, redirects, and nil/error paths; no substantive correctness or security findings.
Automated Release PR --- ## [1.9.0](openai/openai-cli@v1.8.0...v1.9.0) (2026-08-26) ### Features * **api:** Add residency flag and deprecate geography ([openai#136](openai#136)) ([e460582](openai@e460582)) ### Bug Fixes * Add provenance-aware untrusted stdin mode ([openai#137](openai#137)) ([a133707](openai@a133707)) * build CLI releases with patched Go toolchains ([openai#93](openai#93)) ([a58f1cc](openai@a58f1cc)) * discard fish completion diagnostics ([openai#109](openai#109)) ([4f35fc0](openai@4f35fc0)) * escape raw output controls on interactive terminals ([openai#112](openai#112)) ([7601afb](openai@7601afb)) * fail closed when bootstrapping Go dependencies ([openai#94](openai#94)) ([4ebe610](openai@4ebe610)) * lock and verify Steady mock tooling ([openai#95](openai#95)) ([681d595](openai@681d595)) * prepare release artifacts before publishing ([openai#111](openai#111)) ([4193619](openai@4193619)) * redact sensitive response headers in debug logs ([openai#106](openai#106)) ([4931572](openai@4931572)) * reject invalid multipart MIME header controls ([openai#105](openai#105)) ([fad98b4](openai@fad98b4)) * restrict downloaded file permissions ([openai#107](openai#107)) ([7a3a7d1](openai@7a3a7d1)) * safely construct bash file completions ([openai#110](openai#110)) ([b3e0946](openai@b3e0946)) * stream binary download responses ([openai#108](openai#108)) ([1f3ba6c](openai@1f3ba6c)) * stream multipart uploads without buffering ([openai#65](openai#65)) ([bcf0ecd](openai@bcf0ecd)) * verify GoReleaser before privileged release execution ([openai#96](openai#96)) ([b3729ea](openai@b3729ea)) ### Chores * **api:** clarify image background and audio delta docs ([openai#124](openai#124)) ([056f306](openai@056f306)) * **api:** No customer-visible SDK or public API changes ([openai#128](openai#128)) ([12e0d28](openai@12e0d28)) * **api:** refresh image model API reference ([openai#115](openai#115)) ([a771913](openai@a771913)) * **api:** Refresh the bundled OpenAPI reference ([openai#66](openai#66)) ([d14387a](openai@d14387a)) * **api:** Report no customer-visible SDK or public API changes ([openai#113](openai#113)) ([8da2d53](openai@8da2d53)) * **api:** update generation metadata only ([openai#138](openai#138)) ([4244a62](openai@4244a62)) * configure Dependabot for Go and GitHub Actions ([openai#69](openai#69)) ([f495366](openai@f495366)) * **deps:** bump actions/attest-build-provenance from 4.1.0 to 4.2.2 ([openai#102](openai#102)) ([6594c73](openai@6594c73)) * **deps:** bump actions/checkout from 6.0.2 to 7.0.1 ([openai#103](openai#103)) ([ce6a6d0](openai@ce6a6d0)) * **deps:** bump actions/checkout from 6.0.2 to 7.0.1 ([openai#134](openai#134)) ([f40d5f2](openai@f40d5f2)) * **deps:** bump actions/download-artifact from 4.3.0 to 8.0.1 ([openai#133](openai#133)) ([98ed029](openai@98ed029)) * **deps:** bump actions/github-script from 7.1.0 to 9.0.0 ([openai#132](openai#132)) ([978ce47](openai@978ce47)) * **deps:** bump actions/setup-go in / ([openai#101](openai#101)) ([5564982](openai@5564982)) * **deps:** bump actions/upload-artifact from 4.6.2 to 7.0.1 ([openai#104](openai#104)) ([b3ac15a](openai@b3ac15a)) * **deps:** bump github.com/charmbracelet/bubbles from 0.21.0 to 1.0.0 ([openai#99](openai#99)) ([7ac7035](openai@7ac7035)) * **deps:** bump github.com/urfave/cli/v3 from 3.4.1 to 3.10.1 in the go-minor-and-patch group across 1 directory ([openai#130](openai#130)) ([ddc612e](openai@ddc612e)) * **deps:** bump the charmbracelet group across 1 directory with 2 updates ([openai#97](openai#97)) ([2137b80](openai@2137b80)) * **deps:** bump the codeql group across 1 directory with 2 updates ([openai#100](openai#100)) ([c95ac0a](openai@c95ac0a)) * **deps:** bump the codeql group across 1 directory with 2 updates ([openai#131](openai#131)) ([58e3bdd](openai@58e3bdd)) * **deps:** bump the go-minor-and-patch group across 1 directory with 5 updates ([openai#98](openai#98)) ([74822be](openai@74822be)) * **deps:** update openai-go to v3.51.0 ([openai#63](openai#63)) ([68e3e70](openai@68e3e70)) * **deps:** update openai-go to v3.52.0 ([openai#67](openai#67)) ([7d87ee2](openai@7d87ee2)) * set a 1,000-line custom-code budget ([openai#126](openai#126)) ([016bfb2](openai@016bfb2)) ### Documentation * add secure CLI agent and contributor guidance ([openai#72](openai#72)) ([09ec087](openai@09ec087)) * standardize CLI vulnerability disclosure policy ([openai#71](openai#71)) ([d082a01](openai@d082a01)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: openai-sdks[bot] <284451331+openai-sdks[bot]@users.noreply.github.com>
Summary
Locationvalues while preserving original response headers, response identity, unread bodies, and existing request logging behavior.Validation
go test ./internal/debugmiddleware -count=1 -cover(95.1% statement coverage)go test -race ./internal/debugmiddleware -count=5go vet ./..../scripts/lintOnly synthetic credentials and sanitized fixtures are used.