CORS
araneta opened this issue · comments
araneta commented
How to handler CORS? Thanks
Razon Yang commented
I wrote a simple example, is it what you need?
package main
import (
"path"
"strings"
"github.com/buaazp/fasthttprouter"
"github.com/valyala/fasthttp"
)
type CORS struct {
origins map[string]bool
}
func (c *CORS) handler(h fasthttp.RequestHandler) fasthttp.RequestHandler {
return func(ctx *fasthttp.RequestCtx) {
if host := string(ctx.Host()); c.origins[host] {
ctx.Response.Header.Set("Access-Control-Allow-Origin", host)
}
h(ctx)
}
}
var (
cors = &CORS{
origins: map[string]bool{
"127.0.0.1:8080": true,
},
}
)
func main() {
routerPath := "/js/*filepath" // router's path.
filepath := path.Join("/path/to/js") // file's path
// Create a file handler.
fileHandler := fasthttp.FSHandler(filepath, strings.Count(routerPath[:len(routerPath)-10], "/"))
router := fasthttprouter.New()
// Wrapped by CORS handler.
router.GET(routerPath, cors.handler(fileHandler))
fasthttp.ListenAndServe(":8080", router.Handler)
}
Razon Yang commented
@buaazp 我觉得ServeFiles
有点难扩展,比如CORS之类的中间件,好像用ServeFiles
无法实现。是否有其他方法我没想到的。
araneta commented
Great. Thanks its working.
招牌疯子 commented
@headwindfly 感谢帮忙解答。
ServeFiles
这些接口都是继承自httprouter
,并不是我自己设计的,再加上我自己的线上业务并没有用到这种文件接口,所以也就没关注过,我回头想想怎么把它搞成标准的router用法吧~
Razon Yang commented
@buaazp :) 好的,这个issue应该可以关闭了
Michael Draper commented
This solution doesn't work. The browser sends an Origin header not a Host header.