|
|
|
package cors
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"git.diulo.com/mogfee/kit/middleware"
|
|
|
|
"git.diulo.com/mogfee/kit/transport"
|
|
|
|
"net/http"
|
|
|
|
)
|
|
|
|
|
|
|
|
type OptionFunc func(o *option)
|
|
|
|
|
|
|
|
func WithDomain(domain string) OptionFunc {
|
|
|
|
return func(o *option) {
|
|
|
|
o.domain = domain
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func WithMethod(method string) OptionFunc {
|
|
|
|
return func(o *option) {
|
|
|
|
o.method = method
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func WithHeader(header string) OptionFunc {
|
|
|
|
return func(o *option) {
|
|
|
|
o.headers = header
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type option struct {
|
|
|
|
domain string
|
|
|
|
method string
|
|
|
|
headers string
|
|
|
|
}
|
|
|
|
|
|
|
|
func Cors(ops ...OptionFunc) middleware.Middleware {
|
|
|
|
cfg := &option{
|
|
|
|
domain: "*",
|
|
|
|
method: "GET,POST,OPTIONS,PUT,PATCH,DELETE",
|
|
|
|
headers: "Content-Type,X-Requested-With,Access-Control-Allow-Credentials,User-Agent,Content-Length,Authorization",
|
|
|
|
}
|
|
|
|
for _, o := range ops {
|
|
|
|
o(cfg)
|
|
|
|
}
|
|
|
|
return func(handler middleware.Handler) middleware.Handler {
|
|
|
|
return func(ctx context.Context, a any) (any, error) {
|
|
|
|
if tr, ok := transport.FromServerContext(ctx); ok {
|
|
|
|
header := tr.ReplyHeader()
|
|
|
|
header.Set("Access-Control-Allow-Origin", cfg.domain)
|
|
|
|
header.Set("Access-Control-Allow-Methods", cfg.method)
|
|
|
|
header.Set("Access-Control-Allow-Credentials", "true")
|
|
|
|
header.Set("Access-Control-Allow-Headers", cfg.headers)
|
|
|
|
}
|
|
|
|
return handler(ctx, a)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func HttpServer() func(http.Handler) http.Handler {
|
|
|
|
return func(h http.Handler) http.Handler {
|
|
|
|
ch := &cors{h: h}
|
|
|
|
ch.h = h
|
|
|
|
return ch
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type cors struct {
|
|
|
|
h http.Handler
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ch *cors) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
|
|
ch.h.ServeHTTP(w, r)
|
|
|
|
}
|