mirror of
https://github.com/tobychui/zoraxy.git
synced 2025-06-06 23:57:21 +02:00
87 lines
2.1 KiB
Go
87 lines
2.1 KiB
Go
package dynamicproxy
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
)
|
|
|
|
/*
|
|
Special.go
|
|
|
|
This script handle special routing rules
|
|
by external modules
|
|
*/
|
|
|
|
type RoutingRule struct {
|
|
ID string //ID of the routing rule
|
|
Enabled bool //If the routing rule enabled
|
|
UseSystemAccessControl bool //Pass access control check to system white/black list, set this to false to bypass white/black list
|
|
MatchRule func(r *http.Request) bool
|
|
RoutingHandler func(http.ResponseWriter, *http.Request)
|
|
}
|
|
|
|
// Router functions
|
|
// Check if a routing rule exists given its id
|
|
func (router *Router) GetRoutingRuleById(rrid string) (*RoutingRule, error) {
|
|
for _, rr := range router.routingRules {
|
|
if rr.ID == rrid {
|
|
return rr, nil
|
|
}
|
|
}
|
|
|
|
return nil, errors.New("routing rule with given id not found")
|
|
}
|
|
|
|
// Add a routing rule to the router
|
|
func (router *Router) AddRoutingRules(rr *RoutingRule) error {
|
|
_, err := router.GetRoutingRuleById(rr.ID)
|
|
if err == nil {
|
|
//routing rule with given id already exists
|
|
return errors.New("routing rule with same id already exists")
|
|
}
|
|
|
|
router.routingRules = append(router.routingRules, rr)
|
|
return nil
|
|
}
|
|
|
|
// Remove a routing rule from the router
|
|
func (router *Router) RemoveRoutingRule(rrid string) {
|
|
newRoutingRules := []*RoutingRule{}
|
|
for _, rr := range router.routingRules {
|
|
if rr.ID != rrid {
|
|
newRoutingRules = append(newRoutingRules, rr)
|
|
}
|
|
}
|
|
|
|
router.routingRules = newRoutingRules
|
|
}
|
|
|
|
// Get all routing rules
|
|
func (router *Router) GetAllRoutingRules() []*RoutingRule {
|
|
return router.routingRules
|
|
}
|
|
|
|
// Get the matching routing rule that describe this request.
|
|
// Return nil if no routing rule is match
|
|
func (router *Router) GetMatchingRoutingRule(r *http.Request) *RoutingRule {
|
|
for _, thisRr := range router.routingRules {
|
|
if thisRr.IsMatch(r) {
|
|
return thisRr
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Routing Rule functions
|
|
// Check if a request object match the
|
|
func (e *RoutingRule) IsMatch(r *http.Request) bool {
|
|
if !e.Enabled {
|
|
return false
|
|
}
|
|
return e.MatchRule(r)
|
|
}
|
|
|
|
func (e *RoutingRule) Route(w http.ResponseWriter, r *http.Request) {
|
|
e.RoutingHandler(w, r)
|
|
}
|