go type_error ai_generated true

http: ResponseWriter does not implement http.Flusher

ID: go/net-http-flusher-not-available

Also available as: JSON · Markdown · 中文
85%Fix Rate
85%Confidence
1Evidence
2023-09-20First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
Go 1.15 active
Go 1.16 active
Go 1.17 active
Go 1.18 active
Go 1.19 active
Go 1.20 active
Go 1.21 active
Go 1.22 active
Go 1.23 active

Root Cause

Using http.Flusher on a ResponseWriter that wraps or replaces the original object, such as when using a custom middleware that doesn't preserve the Flusher interface.

generic

中文

在包装或替换原始对象的 ResponseWriter 上使用 http.Flusher,例如使用未保留 Flusher 接口的自定义中间件时。

Official Documentation

https://pkg.go.dev/net/http#Flusher

Workarounds

  1. 95% success Implement Flusher interface in your custom ResponseWriter wrapper by embedding the original writer and forwarding Flush()
    Implement Flusher interface in your custom ResponseWriter wrapper by embedding the original writer and forwarding Flush()
  2. 90% success Use http.ResponseController from Go 1.20+ to enable flush without direct Flusher assertion
    Use http.ResponseController from Go 1.20+ to enable flush without direct Flusher assertion
  3. 80% success Avoid wrapping ResponseWriter if possible; modify the handler to flush via the original writer before wrapping
    Avoid wrapping ResponseWriter if possible; modify the handler to flush via the original writer before wrapping

中文步骤

  1. Implement Flusher interface in your custom ResponseWriter wrapper by embedding the original writer and forwarding Flush()
  2. Use http.ResponseController from Go 1.20+ to enable flush without direct Flusher assertion
  3. Avoid wrapping ResponseWriter if possible; modify the handler to flush via the original writer before wrapping

Dead Ends

Common approaches that don't work:

  1. 85% fail

    The assertion fails because the wrapper replaces the original writer; you must assert on the wrapper.

  2. 70% fail

    The original writer supports Flusher, but the wrapper doesn't pass it through; pre-check doesn't help.

  3. 90% fail

    Flushing is critical for streaming responses; ignoring it breaks functionality like SSE or chunked transfer.