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.
99 lines
2.1 KiB
99 lines
2.1 KiB
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)), |
|
) |
|
}
|
|
|