You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.2 KiB

2 years ago
package cors
2 years ago
import (
"context"
"git.diulo.com/mogfee/kit/middleware"
"git.diulo.com/mogfee/kit/transport"
)
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)
}
}
}