50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
|
package tunnelhostnamemapper
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
|
||
|
"github.com/cloudflare/cloudflared/h2mux"
|
||
|
"github.com/cloudflare/cloudflared/originservice"
|
||
|
)
|
||
|
|
||
|
// TunnelHostnameMapper maps TunnelHostname to an OriginService
|
||
|
type TunnelHostnameMapper struct {
|
||
|
sync.RWMutex
|
||
|
tunnelHostnameToOrigin map[h2mux.TunnelHostname]originservice.OriginService
|
||
|
}
|
||
|
|
||
|
func NewTunnelHostnameMapper() *TunnelHostnameMapper {
|
||
|
return &TunnelHostnameMapper{
|
||
|
tunnelHostnameToOrigin: make(map[h2mux.TunnelHostname]originservice.OriginService),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Get an OriginService given a TunnelHostname
|
||
|
func (om *TunnelHostnameMapper) Get(key h2mux.TunnelHostname) (originservice.OriginService, bool) {
|
||
|
om.RLock()
|
||
|
defer om.RUnlock()
|
||
|
originService, ok := om.tunnelHostnameToOrigin[key]
|
||
|
return originService, ok
|
||
|
}
|
||
|
|
||
|
// Add a mapping. If there is already an OriginService with this key, shutdown the old origin service and replace it
|
||
|
// with the new one
|
||
|
func (om *TunnelHostnameMapper) Add(key h2mux.TunnelHostname, os originservice.OriginService) {
|
||
|
om.Lock()
|
||
|
defer om.Unlock()
|
||
|
if oldOS, ok := om.tunnelHostnameToOrigin[key]; ok {
|
||
|
oldOS.Shutdown()
|
||
|
}
|
||
|
om.tunnelHostnameToOrigin[key] = os
|
||
|
}
|
||
|
|
||
|
// DeleteAll mappings, and shutdown all OriginService
|
||
|
func (om *TunnelHostnameMapper) DeleteAll() {
|
||
|
om.Lock()
|
||
|
defer om.Unlock()
|
||
|
for key, os := range om.tunnelHostnameToOrigin {
|
||
|
os.Shutdown()
|
||
|
delete(om.tunnelHostnameToOrigin, key)
|
||
|
}
|
||
|
}
|