1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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)
- }
|