package network
import (
"net/http"
"strconv"
"time"
"github.com/xssed/owlcache/cache"
"github.com/xssed/owlcache/network/gossip"
"github.com/xssed/owlcache/network/memcacheclient"
"github.com/xssed/owlcache/network/redisclient"
owlconfig "github.com/xssed/owlcache/config"
owllog "github.com/xssed/owlcache/log"
owltools "github.com/xssed/owlcache/tools"
owltoken "github.com/xssed/owlcache/tools/token"
)
func (owlhandler *OwlHandler) baseget() {
if v, found := BaseCacheDB.GetKvStore(owlhandler.owlrequest.Key); found {
owlhandler.Transmit(SUCCESS)
owlhandler.owlresponse.Data = v.(*cache.KvStore).Value
owlhandler.owlresponse.KeyCreateTime = v.(*cache.KvStore).CreateTime
return
} else {
if owlconfig.OwlConfigModel.Get_data_from_memcache == "1" {
temp_mcrts_exptime := owltools.DoubleNumberStringSubToString(owlconfig.OwlConfigModel.MemcacheClient_Request_Timeout_Sleeptime, "1")
mcrts_exptime, _ := time.ParseDuration(owltools.JoinString(temp_mcrts_exptime, "s"))
mrmen_maxnum, _ := strconv.Atoi(owlconfig.OwlConfigModel.MemcacheClient_Request_Max_Error_Number)
k := MemcacheClientRequestErrorCounter.Exe(owlhandler.owlrequest.Key, int64(mrmen_maxnum-1), mcrts_exptime)
if k > 0 {
result, err := memcacheclient.Get(owlhandler.owlrequest.Key)
if err == nil {
MemcacheClientRequestErrorCounter.Dec(owlhandler.owlrequest.Key)
exptime, _ := time.ParseDuration(owlconfig.OwlConfigModel.Get_memcache_data_set_expire_time + "s")
ok := BaseCacheDB.Set(string(result.Key), result.Value, exptime)
if !ok {
owllog.OwlLogRun.Info("Get_data_from_memcache:Store data to owlcache error, " + " key:" + owlhandler.owlrequest.Key)
} else {
owlhandler.Transmit(SUCCESS)
owlhandler.owlresponse.Data = result.Value
owlhandler.owlresponse.KeyCreateTime = time.Now()
return
}
}
}
}
if owlconfig.OwlConfigModel.Get_data_from_redis == "1" {
temp_rcrts_exptime := owltools.DoubleNumberStringSubToString(owlconfig.OwlConfigModel.RedisClient_Request_Timeout_Sleeptime, "1")
rcrts_exptime, _ := time.ParseDuration(owltools.JoinString(temp_rcrts_exptime, "s"))
rcrmen_maxnum, _ := strconv.Atoi(owlconfig.OwlConfigModel.RedisClient_Request_Max_Error_Number)
k := RedisClientRequestErrorCounter.Exe(owlhandler.owlrequest.Key, int64(rcrmen_maxnum-1), rcrts_exptime)
if k > 0 {
rcres, err := redisclient.Get(owlhandler.owlrequest.Key)
if err == nil {
RedisClientRequestErrorCounter.Dec(owlhandler.owlrequest.Key)
rcexptime, _ := time.ParseDuration(owlconfig.OwlConfigModel.Get_redis_data_set_expire_time + "s")
ok := BaseCacheDB.Set(owlhandler.owlrequest.Key, []byte(rcres), rcexptime)
if !ok {
owllog.OwlLogRun.Info("Get_data_from_redis:Store data to owlcache error" + " key:" + owlhandler.owlrequest.Key)
} else {
owlhandler.Transmit(SUCCESS)
owlhandler.owlresponse.Data = []byte(rcres)
owlhandler.owlresponse.KeyCreateTime = time.Now()
return
}
}
}
}
owlhandler.Transmit(NOT_FOUND)
return
}
}
func (owlhandler *OwlHandler) Get() {
owlhandler.baseget()
}
func (owlhandler *OwlHandler) Exists() {
ok := BaseCacheDB.Exists(owlhandler.owlrequest.Key)
if ok {
owlhandler.Transmit(SUCCESS)
} else {
owlhandler.Transmit(NOT_FOUND)
}
}
func (owlhandler *OwlHandler) Set() {
ok := BaseCacheDB.Set(owlhandler.owlrequest.Key, owlhandler.owlrequest.Value, owlhandler.owlrequest.Expires)
if ok {
owlhandler.Transmit(SUCCESS)
owlhandler.owlresponse.Data = []byte("")
owlhandler.owlresponse.KeyCreateTime = time.Now()
} else {
owlhandler.Transmit(ERROR)
}
if owlconfig.OwlConfigModel.GroupDataSync == "1" {
prefix := "http://"
if owlconfig.OwlConfigModel.Open_Https == "1" {
prefix = "https://"
}
key_resource := owltools.JoinString(prefix, owlconfig.OwlConfigModel.ResponseHost, ":", owlconfig.OwlConfigModel.Httpport)
gossip.Set(owlhandler.owlrequest.Key, key_resource, owlhandler.owlrequest.Expires)
}
}
func (owlhandler *OwlHandler) Expire() {
exist := BaseCacheDB.Exists(owlhandler.owlrequest.Key)
if exist {
ok := BaseCacheDB.Expire(owlhandler.owlrequest.Key, owlhandler.owlrequest.Expires)
if ok {
owlhandler.Transmit(SUCCESS)
} else {
owlhandler.Transmit(ERROR)
}
if owlconfig.OwlConfigModel.GroupDataSync == "1" {
gossip.Expire(owlhandler.owlrequest.Key, owlhandler.owlrequest.Expires)
}
} else {
owlhandler.Transmit(NOT_FOUND)
}
}
func (owlhandler *OwlHandler) Delete() {
exist := BaseCacheDB.Exists(owlhandler.owlrequest.Key)
if exist {
ok := BaseCacheDB.Delete(owlhandler.owlrequest.Key)
if !ok {
owlhandler.Transmit(SUCCESS)
} else {
owlhandler.Transmit(ERROR)
}
if owlconfig.OwlConfigModel.GroupDataSync == "1" {
gossip.Delete(owlhandler.owlrequest.Key)
}
} else {
owlhandler.Transmit(NOT_FOUND)
}
}
func (owlhandler *OwlHandler) Pass(r *http.Request) {
if owlconfig.OwlConfigModel.Pass == owlhandler.owlrequest.Pass {
uuid := owltools.GetUUIDString()
ip := owltools.RemoteAddr2IPAddr(r.RemoteAddr)
token_id := owltools.GetMd5String(ip + uuid)
expiration, _ := time.ParseDuration(owlconfig.OwlConfigModel.Tonken_expire_time + "s")
BaseAuth.Set(token_id, []byte(ip), expiration)
token, generate_err := owltoken.GenerateToken(token_id)
if generate_err != nil {
owlhandler.Transmit(ERROR)
return
}
owlhandler.owlresponse.Data = []byte(token)
owlhandler.owlresponse.KeyCreateTime = time.Now()
owlhandler.Transmit(SUCCESS)
} else {
owlhandler.Transmit(ERROR)
}
}
func (owlhandler *OwlHandler) CheckAuth(r *http.Request) bool {
if owltools.IsBase64(owlhandler.owlrequest.Token) {
decode_token := string(owltools.Base64Decode(owlhandler.owlrequest.Token, "url"))
if string(decode_token) == "" {
return false
}
owlhandler.owlrequest.Token = decode_token
}
token, parse_err := owltoken.ParseToken(owlhandler.owlrequest.Token)
if parse_err != nil || token == nil {
return false
}
token_id := token.TokenId
ip := owltools.RemoteAddr2IPAddr(r.RemoteAddr)
v, found := BaseAuth.Get(token_id)
if found == true {
if string(v) == ip {
return true
}
return false
}
return false
}
func (owlhandler *OwlHandler) Ping() {
owlhandler.Transmit(SUCCESS)
if owlhandler.owlrequest.Length > 0 {
owlhandler.owlresponse.Data = []byte(owlhandler.owlrequest.Value)
} else {
owlhandler.owlresponse.Data = []byte("PONG")
}
}