feat(forwarder): support plugin-based rewriter in HTTP body rewrite rules

Each rewriteBody/rewriteResponseBody/rewriteRequestBody rule can now
optionally reference a named rewriter plugin (HTTP/gRPC backend) via
the rewriter field. When set, body rewriting delegates to the plugin
rather than applying pattern/replacement, while content-type filtering
still applies.

Coincident fixes:
- rewriter/plugin/grpc: return nil when conn is nil (avoid nil-ptr panic)
- rewriter/plugin/http: drain response body in defer to prevent leaks
- config/parsing/rewriter: pass TimeoutOption to gRPC plugin
- config/parsing/service: warn when referenced rewriter is not registered
This commit is contained in:
ginuerzh
2026-06-27 22:52:17 +08:00
parent 3b25e0317f
commit 1b07475bf3
11 changed files with 74 additions and 54 deletions
+2
View File
@@ -4,6 +4,7 @@ import (
"bytes"
"context"
"encoding/json"
"io"
"net/http"
"github.com/go-gost/core/logger"
@@ -84,6 +85,7 @@ func (p *httpPlugin) Rewrite(ctx context.Context, b []byte, opts ...rewriter.Rew
return b, err
}
defer resp.Body.Close()
defer io.Copy(io.Discard, resp.Body)
if resp.StatusCode != http.StatusOK {
return b, nil