special.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package dynamicproxy
  2. import (
  3. "errors"
  4. "net/http"
  5. )
  6. /*
  7. Special.go
  8. This script handle special routing rules
  9. by external modules
  10. */
  11. type RoutingRule struct {
  12. ID string
  13. MatchRule func(r *http.Request) bool
  14. RoutingHandler http.Handler
  15. Enabled bool
  16. }
  17. //Router functions
  18. //Check if a routing rule exists given its id
  19. func (router *Router) GetRoutingRuleById(rrid string) (*RoutingRule, error) {
  20. for _, rr := range router.routingRules {
  21. if rr.ID == rrid {
  22. return rr, nil
  23. }
  24. }
  25. return nil, errors.New("routing rule with given id not found")
  26. }
  27. //Add a routing rule to the router
  28. func (router *Router) AddRoutingRules(rr *RoutingRule) error {
  29. _, err := router.GetRoutingRuleById(rr.ID)
  30. if err != nil {
  31. //routing rule with given id already exists
  32. return err
  33. }
  34. router.routingRules = append(router.routingRules, rr)
  35. return nil
  36. }
  37. //Remove a routing rule from the router
  38. func (router *Router) RemoveRoutingRule(rrid string) {
  39. newRoutingRules := []*RoutingRule{}
  40. for _, rr := range router.routingRules {
  41. if rr.ID != rrid {
  42. newRoutingRules = append(newRoutingRules, rr)
  43. }
  44. }
  45. router.routingRules = newRoutingRules
  46. }
  47. //Get all routing rules
  48. func (router *Router) GetAllRoutingRules() []*RoutingRule {
  49. return router.routingRules
  50. }
  51. //Get the matching routing rule that describe this request.
  52. //Return nil if no routing rule is match
  53. func (router *Router) GetMatchingRoutingRule(r *http.Request) *RoutingRule {
  54. for _, thisRr := range router.routingRules {
  55. if thisRr.IsMatch(r) {
  56. return thisRr
  57. }
  58. }
  59. return nil
  60. }
  61. //Routing Rule functions
  62. //Check if a request object match the
  63. func (e *RoutingRule) IsMatch(r *http.Request) bool {
  64. if !e.Enabled {
  65. return false
  66. }
  67. return e.MatchRule(r)
  68. }
  69. func (e *RoutingRule) Route(w http.ResponseWriter, r *http.Request) {
  70. e.RoutingHandler.ServeHTTP(w, r)
  71. }