mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-09-04 12:14:23 +08:00
108 lines
3.8 KiB
Go
108 lines
3.8 KiB
Go
// Copyright (c) 2018 Kai Schwarz (HEXONET GmbH). All rights reserved.
|
|
//
|
|
// Use of this source code is governed by the MIT
|
|
// license that can be found in the LICENSE.md file.
|
|
|
|
// Package responsetemplatemanager provides basic functionality to handle API response data
|
|
package responsetemplatemanager
|
|
|
|
import (
|
|
"strings"
|
|
"sync"
|
|
|
|
rp "github.com/hexonet/go-sdk/responseparser"
|
|
rt "github.com/hexonet/go-sdk/responsetemplate"
|
|
)
|
|
|
|
// ResponseTemplateManager is a struct used to cover basic functionality to work with
|
|
// API response templates.
|
|
type ResponseTemplateManager struct {
|
|
templates map[string]string
|
|
}
|
|
|
|
var instance *ResponseTemplateManager
|
|
var once sync.Once
|
|
|
|
// GetInstance method to return the responsetemplatemanager singleton instance
|
|
func GetInstance() *ResponseTemplateManager {
|
|
once.Do(func() {
|
|
instance = &ResponseTemplateManager{
|
|
templates: map[string]string{
|
|
"404": generateTemplate("421", "Page not found"),
|
|
"500": generateTemplate("500", "Internal server error"),
|
|
"empty": generateTemplate("423", "Empty API response. Probably unreachable API end point"),
|
|
"error": generateTemplate("421", "Command failed due to server error. Client should try again"),
|
|
"expired": generateTemplate("530", "SESSION NOT FOUND"),
|
|
"httperror": generateTemplate("421", "Command failed due to HTTP communication error"),
|
|
"unauthorized": generateTemplate("530", "Unauthorized"),
|
|
},
|
|
}
|
|
})
|
|
return instance
|
|
}
|
|
|
|
// generateTemplate method to generate API a response template string
|
|
// for given code and description
|
|
func generateTemplate(code string, description string) string {
|
|
var tmp strings.Builder
|
|
tmp.WriteString("[RESPONSE]\r\nCODE=")
|
|
tmp.WriteString(code)
|
|
tmp.WriteString("\r\nDESCRIPTION=")
|
|
tmp.WriteString(description)
|
|
tmp.WriteString("\r\nEOF\r\n")
|
|
return tmp.String()
|
|
}
|
|
|
|
// GenerateTemplate method to generate API a response template string
|
|
// for given code and description
|
|
func (rtm *ResponseTemplateManager) GenerateTemplate(code string, description string) string {
|
|
return generateTemplate(code, description)
|
|
}
|
|
|
|
// AddTemplate method to add a template to the templates container
|
|
func (rtm *ResponseTemplateManager) AddTemplate(id string, plain string) *ResponseTemplateManager {
|
|
rtm.templates[id] = plain
|
|
return rtm
|
|
}
|
|
|
|
// GetTemplate method to get a ResponseTemplate from templates container
|
|
func (rtm *ResponseTemplateManager) GetTemplate(id string) *rt.ResponseTemplate {
|
|
if rtm.HasTemplate(id) {
|
|
return rt.NewResponseTemplate(rtm.templates[id])
|
|
}
|
|
return rt.NewResponseTemplate(generateTemplate("500", "Response Template not found"))
|
|
}
|
|
|
|
// GetTemplates method to return a map covering all available response templates
|
|
func (rtm *ResponseTemplateManager) GetTemplates() map[string]rt.ResponseTemplate {
|
|
tpls := map[string]rt.ResponseTemplate{}
|
|
for key := range rtm.templates {
|
|
tpls[key] = *rt.NewResponseTemplate(rtm.templates[key])
|
|
}
|
|
return tpls
|
|
}
|
|
|
|
// HasTemplate method to check if given template id exists in template container
|
|
func (rtm *ResponseTemplateManager) HasTemplate(id string) bool {
|
|
if _, ok := rtm.templates[id]; ok {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// IsTemplateMatchHash method to check if given API response hash matches a given
|
|
// template by code and description
|
|
func (rtm *ResponseTemplateManager) IsTemplateMatchHash(tpl2 map[string]interface{}, id string) bool {
|
|
h := rtm.GetTemplate(id).GetHash()
|
|
return ((h["CODE"] == tpl2["CODE"].(string)) &&
|
|
(h["DESCRIPTION"] == tpl2["DESCRIPTION"].(string)))
|
|
}
|
|
|
|
// IsTemplateMatchPlain method to check if given API plain response matches a given
|
|
// template by code and description
|
|
func (rtm *ResponseTemplateManager) IsTemplateMatchPlain(plain string, id string) bool {
|
|
h := rtm.GetTemplate(id).GetHash()
|
|
tpl2 := rp.Parse(plain)
|
|
return ((h["CODE"] == tpl2["CODE"].(string)) &&
|
|
(h["DESCRIPTION"] == tpl2["DESCRIPTION"].(string)))
|
|
}
|