mirror of
https://github.com/yusing/godoxy.git
synced 2026-03-23 01:50:29 +01:00
* Add comprehensive post-request rules support for response phase * Enable response body, status, and header manipulation via set commands * Refactor command handlers to support both request and response phases * Implement response modifier system for post-request template execution * Support response-based rule matching with status and header checks * Add comprehensive benchmarks for matcher performance * Refactor authentication and proxying commands for unified error handling * Support negated conditions with ! * Enhance error handling, error formatting and validation * Routes: add `rule_file` field with rule preset support * Environment variable substitution: now supports variables without `GODOXY_` prefix * new conditions: * `on resp_header <key> [<value>]` * `on status <status>` * new commands: * `require_auth` * `set resp_header <key> <template>` * `set resp_body <template>` * `set status <code>` * `log <level> <path> <template>` * `notify <level> <provider> <title_template> <body_template>`
52 lines
1.0 KiB
Go
52 lines
1.0 KiB
Go
package middleware
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/yusing/godoxy/internal/route/rules"
|
|
)
|
|
|
|
type Bypass []rules.RuleOn
|
|
|
|
func (b Bypass) ShouldBypass(w http.ResponseWriter, r *http.Request) bool {
|
|
for _, rule := range b {
|
|
if rule.Check(w, r) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
type checkBypass struct {
|
|
bypass Bypass
|
|
modReq RequestModifier
|
|
modRes ResponseModifier
|
|
}
|
|
|
|
func (c *checkBypass) before(w http.ResponseWriter, r *http.Request) (proceedNext bool) {
|
|
if c.modReq == nil || c.bypass.ShouldBypass(w, r) {
|
|
return true
|
|
}
|
|
return c.modReq.before(w, r)
|
|
}
|
|
|
|
func (c *checkBypass) modifyResponse(w http.ResponseWriter, resp *http.Response) error {
|
|
if c.modRes == nil || c.bypass.ShouldBypass(w, resp.Request) {
|
|
return nil
|
|
}
|
|
return c.modRes.modifyResponse(resp)
|
|
}
|
|
|
|
func (m *Middleware) withCheckBypass() any {
|
|
if len(m.Bypass) > 0 {
|
|
modReq, _ := m.impl.(RequestModifier)
|
|
modRes, _ := m.impl.(ResponseModifier)
|
|
return &checkBypass{
|
|
bypass: m.Bypass,
|
|
modReq: modReq,
|
|
modRes: modRes,
|
|
}
|
|
}
|
|
return m.impl
|
|
}
|