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.
73 lines
1.5 KiB
73 lines
1.5 KiB
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) |
|
}
|
|
|