Skip to content

Commit 2a106fa

Browse files
authored
chore: added requestkeys module (#101)
1 parent fbaa8a4 commit 2a106fa

File tree

7 files changed

+109
-44
lines changed

7 files changed

+109
-44
lines changed

internals/proxy/middlewares/mapping.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,11 @@ func mappingHandler(next http.Handler) http.Handler {
3131
settings.MESSAGE.VARIABLES = getSettings("*").MESSAGE.VARIABLES
3232
}
3333

34-
body, err := request.GetReqBody(w, req)
34+
body, err := request.GetReqBody(req)
3535

3636
if err != nil {
3737
log.Error("Could not get Request Body: ", err.Error())
38+
http.Error(w, "Bad Request: invalid body", http.StatusBadRequest)
3839
}
3940

4041
var modifiedBody bool

internals/proxy/middlewares/message.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ func messageHandler(next http.Handler) http.Handler {
3030
messageTemplate = getSettings("*").MESSAGE.TEMPLATE
3131
}
3232

33-
body, err := request.GetReqBody(w, req)
33+
body, err := request.GetReqBody(req)
3434

3535
if err != nil {
3636
log.Error("Could not get Request Body: ", err.Error())
37+
http.Error(w, "Bad Request: invalid body", http.StatusBadRequest)
3738
}
3839

3940
bodyData := map[string]any{}
@@ -83,7 +84,7 @@ func messageHandler(next http.Handler) http.Handler {
8384
})
8485
}
8586

86-
func TemplateMessage(template string, bodyData map[string]any, headerData map[string]any, variables map[string]any) (map[string]any, error) {
87+
func TemplateMessage(template string, bodyData map[string]any, headerData map[string][]string, variables map[string]any) (map[string]any, error) {
8788
bodyData["message_template"] = template
8889

8990
data, _, err := TemplateBody(bodyData, headerData, variables)

internals/proxy/middlewares/policy.go

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package middlewares
33
import (
44
"errors"
55
"net/http"
6-
"strings"
76

87
"github.com/codeshelldev/secured-signal-api/internals/config/structure"
98
log "github.com/codeshelldev/secured-signal-api/utils/logger"
109
request "github.com/codeshelldev/secured-signal-api/utils/request"
10+
"github.com/codeshelldev/secured-signal-api/utils/request/requestkeys"
1111
)
1212

1313
var Policy Middleware = Middleware{
@@ -25,10 +25,11 @@ func policyHandler(next http.Handler) http.Handler {
2525
policies = getSettings("*").ACCESS.FIELD_POLOCIES
2626
}
2727

28-
body, err := request.GetReqBody(w, req)
28+
body, err := request.GetReqBody(req)
2929

3030
if err != nil {
3131
log.Error("Could not get Request Body: ", err.Error())
32+
http.Error(w, "Bad Request: invalid body", http.StatusBadRequest)
3233
}
3334

3435
if body.Empty {
@@ -65,19 +66,10 @@ func getPolicies(policies map[string]structure.FieldPolicy) (map[string]structur
6566
return allowedFields, blockedFields
6667
}
6768

68-
func getField(field string, body map[string]any, headers map[string]any) (any, error) {
69-
isHeader := strings.HasPrefix(field, "#")
70-
isBody := strings.HasPrefix(field, "@")
69+
func getField(key string, body map[string]any, headers map[string][]string) (any, error) {
70+
field := requestkeys.Parse(key)
7171

72-
fieldWithoutPrefix := field[1:]
73-
74-
var value any
75-
76-
if body[fieldWithoutPrefix] != nil && isBody {
77-
value = body[fieldWithoutPrefix]
78-
} else if headers[fieldWithoutPrefix] != nil && isHeader {
79-
value = headers[fieldWithoutPrefix]
80-
}
72+
value := requestkeys.GetFromBodyAndHeaders(field, body, headers)
8173

8274
if value != nil {
8375
return value, nil
@@ -86,7 +78,7 @@ func getField(field string, body map[string]any, headers map[string]any) (any, e
8678
return value, errors.New("field not found")
8779
}
8880

89-
func doBlock(body map[string]any, headers map[string]any, policies map[string]structure.FieldPolicy) (bool, string) {
81+
func doBlock(body map[string]any, headers map[string][]string, policies map[string]structure.FieldPolicy) (bool, string) {
9082
if policies == nil {
9183
return false, ""
9284
} else if len(policies) <= 0 {

internals/proxy/middlewares/template.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
log "github.com/codeshelldev/secured-signal-api/utils/logger"
1515
query "github.com/codeshelldev/secured-signal-api/utils/query"
1616
request "github.com/codeshelldev/secured-signal-api/utils/request"
17+
"github.com/codeshelldev/secured-signal-api/utils/request/requestkeys"
1718
templating "github.com/codeshelldev/secured-signal-api/utils/templating"
1819
)
1920

@@ -30,10 +31,11 @@ func templateHandler(next http.Handler) http.Handler {
3031
variables = getSettings("*").MESSAGE.VARIABLES
3132
}
3233

33-
body, err := request.GetReqBody(w, req)
34+
body, err := request.GetReqBody(req)
3435

3536
if err != nil {
3637
log.Error("Could not get Request Body: ", err.Error())
38+
http.Error(w, "Bad Request: invalid body", http.StatusBadRequest)
3739
}
3840

3941
bodyData := map[string]any{}
@@ -146,39 +148,39 @@ func prefixData(prefix string, data map[string]any) map[string]any {
146148
return res
147149
}
148150

149-
func cleanHeaders(headers map[string]any) map[string]any {
150-
cleanedHeaders := map[string]any{}
151+
func cleanHeaders(headers map[string][]string) map[string][]string {
152+
cleanedHeaders := map[string][]string{}
151153

152154
for key, value := range headers {
153155
cleanedKey := strings.ReplaceAll(key, "-", "_")
154156

155157
cleanedHeaders[cleanedKey] = value
156158
}
157159

158-
authHeader, ok := cleanedHeaders["Authorization"].([]string)
160+
authHeader, ok := cleanedHeaders["Authorization"]
159161

160162
if !ok {
161163
authHeader = []string{"UNKNOWN REDACTED"}
162164
}
163165

164-
cleanedHeaders["Authorization"] = strings.Split(authHeader[0], ` `)[0] + " REDACTED"
166+
cleanedHeaders["Authorization"] = []string{strings.Split(authHeader[0], ` `)[0] + " REDACTED"}
165167

166168
return cleanedHeaders
167169
}
168170

169-
func TemplateBody(body map[string]any, headers map[string]any, VARIABLES map[string]any) (map[string]any, bool, error) {
171+
func TemplateBody(body map[string]any, headers map[string][]string, VARIABLES map[string]any) (map[string]any, bool, error) {
170172
var modified bool
171173

172174
headers = cleanHeaders(headers)
173175

174-
// Normalize #Var and @Var to .header_key_Var and .body_key_Var
175-
normalizedBody, err := normalizeData("@", "body_key_", body)
176+
// Normalize `keys.BodyPrefix` + "Var" and `keys.HeaderPrefix` + "Var" to "".header_key_Var" and ".body_key_Var"
177+
normalizedBody, err := normalizeData(requestkeys.BodyPrefix, "body_key_", body)
176178

177179
if err != nil {
178180
return body, false, err
179181
}
180182

181-
normalizedBody, err = normalizeData("#", "header_key_", normalizedBody)
183+
normalizedBody, err = normalizeData(requestkeys.HeaderPrefix, "header_key_", normalizedBody)
182184

183185
if err != nil {
184186
return body, false, err
@@ -188,7 +190,7 @@ func TemplateBody(body map[string]any, headers map[string]any, VARIABLES map[str
188190
prefixedBody := prefixData("body_key_", normalizedBody)
189191

190192
// Prefix Header Data with header_key_
191-
prefixedHeaders := prefixData("header_key_", headers)
193+
prefixedHeaders := prefixData("header_key_", request.ParseHeaders(headers))
192194

193195
variables := VARIABLES
194196

tests/string_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,25 @@ import (
88
)
99

1010
func TestStringEscaping(t *testing.T) {
11-
str1 := `\#`
11+
str1 := `\-`
1212

13-
res1 := stringutils.IsEscaped(str1, "#")
13+
res1 := stringutils.IsEscaped(str1, "-")
1414

1515
if !res1 {
1616
t.Error("Expected: ", str1, " == true", "; Got: ", str1, " == ", res1)
1717
}
1818

19-
str2 := "#"
19+
str2 := "-"
2020

21-
res2 := stringutils.IsEscaped(str2, "#")
21+
res2 := stringutils.IsEscaped(str2, "-")
2222

2323
if res2 {
2424
t.Error("Expected: ", str2, " == false", "; Got: ", str2, " == ", res2)
2525
}
2626

27-
str3 := `#\#`
27+
str3 := `-\-`
2828

29-
res3 := stringutils.Contains(str3, "#")
29+
res3 := stringutils.Contains(str3, "-")
3030

3131
if !res3 {
3232
t.Error("Expected: ", str3, " == true", "; Got: ", str3, " == ", res3)

utils/request/request.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package req
1+
package request
22

33
import (
44
"bytes"
@@ -97,8 +97,8 @@ func GetBody(req *http.Request) ([]byte, error) {
9797
return bodyBytes, nil
9898
}
9999

100-
func GetReqHeaders(req *http.Request) map[string]any {
101-
data := map[string]any{}
100+
func GetReqHeaders(req *http.Request) map[string][]string {
101+
data := map[string][]string{}
102102

103103
for key, value := range req.Header {
104104
data[key] = value
@@ -107,14 +107,26 @@ func GetReqHeaders(req *http.Request) map[string]any {
107107
return data
108108
}
109109

110-
func GetReqBody(w http.ResponseWriter, req *http.Request) (Body, error) {
110+
func ParseHeaders(headers map[string][]string) map[string]any {
111+
generic := make(map[string]any, len(headers))
112+
113+
for i, header := range headers {
114+
if len(header) == 1 {
115+
generic[i] = header[0]
116+
} else {
117+
generic[i] = header
118+
}
119+
}
120+
121+
return generic
122+
}
123+
124+
func GetReqBody(req *http.Request) (Body, error) {
111125
bytes, err := GetBody(req)
112126

113127
var isEmpty bool
114128

115129
if err != nil {
116-
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
117-
118130
return Body{Empty: true}, err
119131
}
120132

@@ -129,16 +141,12 @@ func GetReqBody(w http.ResponseWriter, req *http.Request) (Body, error) {
129141
data, err = GetJsonData(bytes)
130142

131143
if err != nil {
132-
http.Error(w, "Bad Request: invalid JSON", http.StatusBadRequest)
133-
134144
return Body{Empty: true}, err
135145
}
136146
case Form:
137147
data, err = GetFormData(bytes)
138148

139149
if err != nil {
140-
http.Error(w, "Bad Request: invalid Form", http.StatusBadRequest)
141-
142150
return Body{Empty: true}, err
143151
}
144152
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package requestkeys
2+
3+
import "github.com/codeshelldev/secured-signal-api/utils/request"
4+
5+
type Field struct {
6+
Prefix string
7+
Key string
8+
}
9+
10+
var BodyPrefix = "@"
11+
var HeaderPrefix = "#"
12+
13+
func Parse(str string) Field {
14+
prefix := str[1:]
15+
key := str[:1]
16+
17+
return Field{
18+
Prefix: prefix,
19+
Key: key,
20+
}
21+
}
22+
23+
func GetByField(field Field, data map[string]any) any {
24+
key := field.Prefix + field.Key
25+
26+
return data[key]
27+
}
28+
29+
func PrefixBody(body map[string]any) map[string]any {
30+
res := map[string]any{}
31+
32+
for key, value := range body {
33+
res[BodyPrefix + key] = value
34+
}
35+
36+
return res
37+
}
38+
39+
func PrefixHeaders(headers map[string][]string) map[string][]string {
40+
res := map[string][]string{}
41+
42+
for key, value := range headers {
43+
res[HeaderPrefix + key] = value
44+
}
45+
46+
return res
47+
}
48+
49+
func GetFromBodyAndHeaders(field Field, body map[string]any, headers map[string][]string) any {
50+
body = PrefixBody(body)
51+
headers = PrefixHeaders(headers)
52+
53+
switch(field.Prefix) {
54+
case BodyPrefix:
55+
return GetByField(field, body)
56+
case HeaderPrefix:
57+
return GetByField(field, request.ParseHeaders(headers))
58+
}
59+
60+
return nil
61+
}

0 commit comments

Comments
 (0)