forked from prebid/prebid-server
-
Notifications
You must be signed in to change notification settings - Fork 5
/
util.go
134 lines (115 loc) · 2.72 KB
/
util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package vastbidder
import (
"bytes"
"encoding/json"
"fmt"
"math/rand"
"net/url"
"reflect"
"strconv"
"strings"
"github.com/prebid/prebid-server/v2/adapters"
"github.com/prebid/prebid-server/v2/openrtb_ext"
)
func ObjectArrayToString(len int, separator string, cb func(i int) string) string {
if 0 == len {
return ""
}
var out bytes.Buffer
for i := 0; i < len; i++ {
if out.Len() > 0 {
out.WriteString(separator)
}
out.WriteString(cb(i))
}
return out.String()
}
func readImpExt(impExt json.RawMessage) (*openrtb_ext.ExtImpVASTBidder, error) {
var bidderExt adapters.ExtImpBidder
if err := json.Unmarshal(impExt, &bidderExt); err != nil {
return nil, err
}
vastBidderExt := openrtb_ext.ExtImpVASTBidder{}
if err := json.Unmarshal(bidderExt.Bidder, &vastBidderExt); err != nil {
return nil, err
}
return &vastBidderExt, nil
}
func normalizeObject(prefix string, out map[string]string, obj map[string]interface{}) {
for k, value := range obj {
key := k
if len(prefix) > 0 {
key = prefix + "." + k
}
switch val := value.(type) {
case string:
out[key] = val
case []interface{}: //array
continue
case map[string]interface{}: //object
normalizeObject(key, out, val)
default: //all int, float
out[key] = fmt.Sprint(value)
}
}
}
func NormalizeJSON(obj map[string]interface{}) map[string]string {
out := map[string]string{}
normalizeObject("", out, obj)
return out
}
var GetRandomID = func() string {
return strconv.FormatInt(rand.Int63(), intBase)
}
func getJSONString(kvmap any) string {
var buf bytes.Buffer
encoder := json.NewEncoder(&buf)
// Disable HTML escaping for special characters
encoder.SetEscapeHTML(false)
if err := encoder.Encode(kvmap); err != nil {
return ""
}
return strings.TrimRight(buf.String(), "\n")
}
func isMap(data any) bool {
return reflect.TypeOf(data).Kind() == reflect.Map
}
// extractDataFromMap help to get value from nested map
func getValueFromMap(lookUpOrder []string, m map[string]any) any {
if len(lookUpOrder) == 0 {
return ""
}
for _, key := range lookUpOrder {
value, keyExists := m[key]
if !keyExists {
return ""
}
if nestedMap, isMap := value.(map[string]any); isMap {
m = nestedMap
} else {
return value
}
}
return m
}
// mapToQuery convert the map data into & seperated string
func mapToQuery(m map[string]any) string {
values := url.Values{}
for key, value := range m {
switch reflect.TypeOf(value).Kind() {
case reflect.Map:
mvalue, ok := value.(map[string]any)
if ok {
values.Add(key, mapToQuery(mvalue))
}
default:
v := fmt.Sprintf("%v", value)
decodedString, err := url.QueryUnescape(v)
if err == nil {
v = decodedString
}
values.Add(key, v)
}
}
return values.Encode()
}