12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- package dynamicproxy
- import (
- "errors"
- "net/http"
- )
- /*
- Special.go
- This script handle special routing rules
- by external modules
- */
- type RoutingRule struct {
- ID string
- MatchRule func(r *http.Request) bool
- RoutingHandler http.Handler
- Enabled bool
- }
- //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 err
- }
- 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.ServeHTTP(w, r)
- }
|