This is a fork of Traefik's plugin-rewritebody
that is aimed at extending support to handle gzip content. This was initially aimed at extending the support for utilizing
theme.park's themes but can likely be used for a range of other uses.
The primary change is to add support for gzip content. This brought another potential issue to mind, what about really large
content? This was handled as well.
Content-Type that includes text. For example:
text/htmltext/jsonContent-Encoding header that is supported by this plugin
Content-Encoding of identity or emptygzip and zlib encodingIf the either of the previous conditions failes the body is passed on as is and no further processing from this plugin occurs.
If the Content-Encoding is empty or identity it is handled in mostly the same manner as the original plugin.
If the Content-Encoding is gzip the following process happens:
regex process created by the original pluginpilot:token: "xxxx"experimental:plugins:rewrite-body:moduleName: "github.com/packruler/rewrite-body"version: "v1.1.0"
To configure the Rewrite Body plugin you should create a middleware in
your dynamic configuration as explained here. The following example creates
and uses the rewritebody middleware plugin to replace all foo occurences by bar in the HTTP response body.
If you want to apply some limits on the response body, you can chain this middleware plugin with the Buffering middleware from Traefik.
http:routers:my-router:rule: "Host(`localhost`)"middlewares:- "rewrite-foo"service: "my-service"middlewares:rewrite-foo:plugin:rewrite-body:# Keep Last-Modified header returned by the HTTP service.# By default, the Last-Modified header is removed.lastModified: true# Rewrites all "foo" occurences by "bar"rewrites:- regex: "foo"replacement: "bar"# logLevel is optional, defaults to Info level.# Available logLevels: (Trace: -2, Debug: -1, Info: 0, Warning: 1, Error: 2)logLevel: 0# monitoring is optional, defaults to below configuration# monitoring configuration limits the HTTP queries that are checked for regex replacement.monitoring:# methods is a string list. Options are standard HTTP Methods. Entries MUST be ALL CAPS# For a list of options: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methodsmethods:- GET# types is a string list. Options are HTTP Content Types. Entries should match standard formatting# For a list of options: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types# Wildcards(*) are not supported!types:- text/htmlservices:my-service:loadBalancer:servers:- url: "http://127.0.0.1"
http:routers:sonarr-router:rule: "Host(`sonarr.example.com`)"middlewares:- sonarr-themeservice: sonarr-servicemiddlewares:sonarr-theme:plugin:rewrite-body:rewrites:- regex: </head>replacement: <link rel="stylesheet" type="text/css" href="https://theme-park.dev/css/base/sonarr/{{ env "THEME" }}.css"></head>services:sonarr-service:servers:- url: http://localhost:8989
You can set an environment variable THEME to the name of a theme for easier consistency across apps.