mirror of
https://github.com/aykhans/sarin.git
synced 2026-10-17 14:53:52 +00:00
fix(script): convert non-string header, param and cookie values to text
This commit is contained in:
3 files changed
+51
-24
No files matched your search
+25
-11
@@ -2,6 +2,7 @@ package script
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
|
||||
"github.com/dop251/goja"
|
||||
"go.aykhans.me/sarin/internal/types"
|
||||
@@ -195,22 +196,23 @@ func (e *JsEngine) objectToStringSliceMap(obj *goja.Object) map[string][]string
|
||||
result := make(map[string][]string)
|
||||
for _, key := range obj.Keys() {
|
||||
v := obj.Get(key)
|
||||
if v == nil || goja.IsUndefined(v) || goja.IsNull(v) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Check if it's an array
|
||||
if arr, ok := v.Export().([]any); ok {
|
||||
var values []string
|
||||
for _, item := range arr {
|
||||
if s, ok := item.(string); ok {
|
||||
values = append(values, s)
|
||||
if arr, ok := v.(*goja.Object); ok && arr.ClassName() == "Array" {
|
||||
length := int(arr.Get("length").ToInteger())
|
||||
values := make([]string, 0, length)
|
||||
for i := range length {
|
||||
if text, ok := jsStringValue(arr.Get(strconv.Itoa(i))); ok {
|
||||
values = append(values, text)
|
||||
}
|
||||
}
|
||||
result[key] = values
|
||||
} else {
|
||||
// Single value, wrap it in a slice
|
||||
result[key] = []string{v.String()}
|
||||
continue
|
||||
}
|
||||
|
||||
// Single value, wrap it in a slice
|
||||
if text, ok := jsStringValue(v); ok {
|
||||
result[key] = []string{text}
|
||||
}
|
||||
}
|
||||
return result
|
||||
@@ -231,3 +233,15 @@ func (e *JsEngine) exceptionError(err error) error {
|
||||
}
|
||||
return errors.New(message)
|
||||
}
|
||||
|
||||
// jsStringValue renders a JavaScript primitive the way the script would see it.
|
||||
// Objects, arrays and functions have no useful text form, so they are skipped.
|
||||
func jsStringValue(v goja.Value) (string, bool) {
|
||||
if v == nil || goja.IsUndefined(v) || goja.IsNull(v) {
|
||||
return "", false
|
||||
}
|
||||
if _, isObject := v.(*goja.Object); isObject {
|
||||
return "", false
|
||||
}
|
||||
return v.String(), true
|
||||
}
|
||||
+24
-11
@@ -168,20 +168,33 @@ func (e *LuaEngine) tableToStringSliceMap(t *lua.LTable) map[string][]string {
|
||||
}
|
||||
key := string(k.(lua.LString))
|
||||
|
||||
switch v.Type() {
|
||||
case lua.LTString:
|
||||
// Single string value
|
||||
result[key] = []string{string(v.(lua.LString))}
|
||||
case lua.LTTable:
|
||||
// Array of strings
|
||||
var values []string
|
||||
v.(*lua.LTable).ForEach(func(_, item lua.LValue) {
|
||||
if item.Type() == lua.LTString {
|
||||
values = append(values, string(item.(lua.LString)))
|
||||
if v.Type() == lua.LTTable {
|
||||
// Array of values, keys outside 1..n are skipped
|
||||
arr := v.(*lua.LTable)
|
||||
length := arr.Len()
|
||||
values := make([]string, 0, length)
|
||||
for i := 1; i <= length; i++ {
|
||||
if text, ok := luaScalarString(arr.RawGetInt(i)); ok {
|
||||
values = append(values, text)
|
||||
}
|
||||
})
|
||||
}
|
||||
result[key] = values
|
||||
return
|
||||
}
|
||||
|
||||
if text, ok := luaScalarString(v); ok {
|
||||
result[key] = []string{text}
|
||||
}
|
||||
})
|
||||
return result
|
||||
}
|
||||
|
||||
// luaScalarString renders strings, numbers and booleans as text.
|
||||
func luaScalarString(v lua.LValue) (string, bool) {
|
||||
switch v.Type() {
|
||||
case lua.LTString, lua.LTNumber, lua.LTBool:
|
||||
return v.String(), true
|
||||
default:
|
||||
return "", false
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user