gf/g/net/ghttp/http_server_domain.go

135 lines
3.8 KiB
Go
Raw Normal View History

2017-12-29 16:03:30 +08:00
// Copyright 2017 gf Author(https://gitee.com/johng/gf). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://gitee.com/johng/gf.
//
2017-12-31 18:19:58 +08:00
package ghttp
import (
"strings"
"gitee.com/johng/gf/g/container/gmap"
)
// 域名管理器对象
type Domain struct {
s *Server // 所属Server
m map[string]bool // 多域名
}
// 域名对象表,用以存储和检索域名(支持多域名)与域名对象之间的关联关系
var domains = gmap.NewStringInterfaceMap()
// 生成一个域名对象
func (s *Server) Domain(domain string) *Domain {
if r := domains.Get(domain); r != nil {
return r.(*Domain)
}
2017-12-30 18:35:24 +08:00
d := &Domain{
s : s,
m : make(map[string]bool),
}
result := strings.Split(domain, ",")
for _, v := range result {
d.m[strings.TrimSpace(v)] = true
}
domains.Set(domain, d)
return d
}
2017-12-30 18:35:24 +08:00
// 注意该方法是直接绑定方法的内存地址,执行的时候直接执行该方法,不会存在初始化新的控制器逻辑
func (d *Domain) BindHandler(pattern string, handler HandlerFunc) error {
for domain, _ := range d.m {
2018-04-12 18:06:42 +08:00
if err := d.s.bindHandlerItem(pattern + "@" + domain, &HandlerItem{
ctype : nil,
fname : "",
faddr : handler,
}); err != nil {
2017-12-30 18:35:24 +08:00
return err
}
}
return nil
}
2018-01-08 11:38:31 +08:00
// 执行对象方法
2017-12-30 18:35:24 +08:00
func (d *Domain) BindObject(pattern string, obj interface{}) error {
for domain, _ := range d.m {
if err := d.s.BindObject(pattern + "@" + domain, obj); err != nil {
return err
}
}
return nil
}
// 执行对象方法注册methods参数不区分大小写
2018-01-08 11:38:31 +08:00
func (d *Domain) BindObjectMethod(pattern string, obj interface{}, methods string) error {
for domain, _ := range d.m {
if err := d.s.BindObjectMethod(pattern + "@" + domain, obj, methods); err != nil {
return err
}
}
return nil
}
// RESTful执行对象注册
2017-12-30 18:35:24 +08:00
func (d *Domain) BindObjectRest(pattern string, obj interface{}) error {
for domain, _ := range d.m {
if err := d.s.BindObjectRest(pattern + "@" + domain, obj); err != nil {
return err
}
}
return nil
}
2018-01-08 11:38:31 +08:00
// 控制器注册
2017-12-30 18:35:24 +08:00
func (d *Domain) BindController(pattern string, c Controller) error {
for domain, _ := range d.m {
if err := d.s.BindController(pattern + "@" + domain, c); err != nil {
return err
}
}
return nil
}
2018-01-08 11:38:31 +08:00
// RESTful控制器注册
2017-12-30 18:35:24 +08:00
func (d *Domain) BindControllerRest(pattern string, c Controller) error {
for domain, _ := range d.m {
2017-12-30 18:35:24 +08:00
if err := d.s.BindControllerRest(pattern + "@" + domain, c); err != nil {
return err
}
}
return nil
2017-12-30 18:35:24 +08:00
}
2018-04-10 10:32:37 +08:00
// 控制器方法注册methods参数区分大小写
func (d *Domain) BindControllerMethod(pattern string, c Controller, methods string) error {
2017-12-30 18:35:24 +08:00
for domain, _ := range d.m {
2018-01-08 11:38:31 +08:00
if err := d.s.BindControllerMethod(pattern + "@" + domain, c, methods); err != nil {
return err
2017-12-30 18:35:24 +08:00
}
}
return nil
}
// 绑定指定的hook回调函数, hook参数的值由ghttp server设定参数不区分大小写
// 目前hook支持Init/Shut
func (d *Domain)BindHookHandler(pattern string, hook string, handler HandlerFunc) error {
for domain, _ := range d.m {
if err := d.s.BindHookHandler(pattern + "@" + domain, hook, handler); err != nil {
return err
}
}
return nil
}
// 通过map批量绑定回调函数
func (d *Domain)BindHookHandlerByMap(pattern string, hookmap map[string]HandlerFunc) error {
for domain, _ := range d.m {
if err := d.s.BindHookHandlerByMap(pattern + "@" + domain, hookmap); err != nil {
return err
}
}
return nil
}