Skip to content

Commit

Permalink
Add cross domain plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangxu19830126 committed Jan 22, 2020
1 parent 251b120 commit 16c1cf4
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 1 deletion.
3 changes: 3 additions & 0 deletions cmd/proxy/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ var (

// internal plugin configuration file
jwtCfg = flag.String("jwt", "", "Plugin(JWT): jwt plugin configuration file, json format")
// crossCfg
crossCfg = flag.String("cross", "", "Plugin(CROSS): cross plugin configuration file, json format")

// metric
metricJob = flag.String("metric-job", "", "prometheus job name")
Expand Down Expand Up @@ -170,6 +172,7 @@ func getCfg() *proxy.Cfg {
cfg.Option.LimitTimeoutWrite = time.Second * time.Duration(*limitTimeoutWriteSec)
cfg.Option.LimitIntervalHeathCheck = time.Second * time.Duration(*limitIntervalHeathCheckSec)
cfg.Option.JWTCfgFile = *jwtCfg
cfg.Option.CrossCfgFile = *crossCfg
cfg.Option.EnableWebSocket = *enableWebSocket
cfg.Option.EnableJSPlugin = *enableJSPlugin
cfg.Option.DisableHeaderNameNormalizing = *disableHeaderNameNormalizing
Expand Down
3 changes: 2 additions & 1 deletion pkg/proxy/cfg.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ type Option struct {
LimitBytesBody int
LimitBytesCaching uint64

JWTCfgFile string
JWTCfgFile string
CrossCfgFile string

EnableWebSocket bool
EnableJSPlugin bool
Expand Down
4 changes: 4 additions & 0 deletions pkg/proxy/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ const (
FilterCaching = "CACHING"
// FilterJWT jwt filter
FilterJWT = "JWT"
// FilterCross cross filter
FilterCross = "CROSS"
// FilterJSPlugin js plugin engine
FilterJSPlugin = "JS-ENGINE"
)
Expand Down Expand Up @@ -74,6 +76,8 @@ func (p *Proxy) newFilter(filterSpec *FilterSpec) (filter.Filter, error) {
return newCachingFilter(p.cfg.Option.LimitBytesCaching, p.dispatcher.tw), nil
case FilterJWT:
return newJWTFilter(p.cfg.Option.JWTCfgFile)
case FilterCross:
return newCrossDomainFilter(p.cfg.Option.CrossCfgFile)
case FilterJSPlugin:
return p.jsEngine, nil
default:
Expand Down
76 changes: 76 additions & 0 deletions pkg/proxy/filter_cross_domain.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package proxy

import (
"bytes"
"encoding/json"
"io/ioutil"

"github.com/fagongzi/gateway/pkg/filter"
"github.com/valyala/fasthttp"
)

var (
options = []byte("OPTIONS")
)

// CrossCfg cross cfg
type CrossCfg struct {
Headers []CrossHeader `json:"headers"`
}

// CrossHeader cross header
type CrossHeader struct {
Name string `json:"name"`
Value string `json:"value"`
}

// CrossDomainFilter cross domain
type CrossDomainFilter struct {
filter.BaseFilter
cfg CrossCfg
}

func newCrossDomainFilter(file string) (filter.Filter, error) {
f := &CrossDomainFilter{}

err := f.parseCfg(file)
if err != nil {
return nil, err
}

return f, nil
}

func (f *CrossDomainFilter) parseCfg(file string) error {
data, err := ioutil.ReadFile(file)
if err != nil {
return err
}

err = json.Unmarshal(data, &f.cfg)
if err != nil {
return err
}

return nil
}

// Name return name of this filter
func (f *CrossDomainFilter) Name() string {
return FilterCross
}

// Pre execute before proxy
func (f *CrossDomainFilter) Pre(c filter.Context) (statusCode int, err error) {
if bytes.Compare(c.OriginRequest().Method(), options) != 0 {
return f.BaseFilter.Pre(c)
}

resp := fasthttp.AcquireResponse()
for _, h := range f.cfg.Headers {
resp.Header.Add(h.Name, h.Value)
}

c.SetAttr(filter.AttrUsingResponse, resp)
return filter.BreakFilterChainCode, nil
}

0 comments on commit 16c1cf4

Please sign in to comment.