100 lines
2.1 KiB
Go
100 lines
2.1 KiB
Go
package http
|
|
|
|
import (
|
|
"crypto/sha1"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"go-common/app/interface/openplatform/seo/conf"
|
|
"go-common/app/interface/openplatform/seo/service"
|
|
"go-common/library/log"
|
|
bm "go-common/library/net/http/blademaster"
|
|
"go-common/library/net/http/blademaster/middleware/verify"
|
|
)
|
|
|
|
var (
|
|
srv *service.Service
|
|
vfy *verify.Verify
|
|
)
|
|
|
|
// Init init seo service
|
|
func Init(c *conf.Config) {
|
|
srv = service.New(c)
|
|
vfy = verify.New(c.Verify)
|
|
engine := bm.DefaultServer(c.BM)
|
|
router(engine)
|
|
if err := engine.Start(); err != nil {
|
|
log.Error("innerEngine.Start() error(%v)", err)
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func router(e *bm.Engine) {
|
|
e.Ping(ping)
|
|
e.Register(register)
|
|
|
|
g := e.Group("/platform")
|
|
{
|
|
g.GET("/home.html", proList)
|
|
g.GET("/detail.html", proInfo)
|
|
}
|
|
e.GET("/detail.html", itemInfo)
|
|
e.GET("/sitemap.xml", sitemap)
|
|
}
|
|
|
|
func ping(c *bm.Context) {
|
|
if err := srv.Ping(c); err != nil {
|
|
log.Error("ping error(%v)", err)
|
|
c.AbortWithStatus(http.StatusServiceUnavailable)
|
|
}
|
|
}
|
|
|
|
func register(c *bm.Context) {
|
|
c.JSON(map[string]interface{}{}, nil)
|
|
}
|
|
|
|
// isBot check if user-agent is bot
|
|
func isBot(c *bm.Context) bool {
|
|
ua := c.Request.Header.Get("User-Agent")
|
|
ua = strings.ToLower(ua)
|
|
for _, bot := range conf.Conf.Seo.BotList {
|
|
if strings.Contains(ua, strings.ToLower(bot)) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// FullUrl get request full url
|
|
func FullUrl(c *bm.Context) string {
|
|
return c.Request.Host + c.Request.RequestURI
|
|
}
|
|
|
|
func setCache(c *bm.Context, res []byte) bool {
|
|
h := c.Writer.Header()
|
|
h.Set("Content-Type", "text/html; charset=utf8")
|
|
h.Set("Cache-Control", fmt.Sprintf("max-age=%d", conf.Conf.Seo.MaxAge))
|
|
etag := ETag(res)
|
|
h.Set("ETag", etag)
|
|
|
|
if etag == c.Request.Header.Get("If-None-Match") {
|
|
c.Writer.WriteHeader(http.StatusNotModified)
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// ETag get etag for cache
|
|
func ETag(res []byte) string {
|
|
return fmt.Sprintf(`W/"%x-%x"`, len(res), sha1.Sum(res))
|
|
}
|
|
|
|
// logUA log User-Agent and Url
|
|
func logUA(c *bm.Context) {
|
|
log.Infov(c,
|
|
log.KV("ua", c.Request.Header.Get("User-Agent")),
|
|
log.KV("url", fmt.Sprintf("%s%s", c.Request.Host, c.Request.URL)),
|
|
)
|
|
}
|