add headers lua runtime support

This commit is contained in:
2025-08-05 23:15:13 +03:00
parent c734779b69
commit 251e580e8a
6 changed files with 115 additions and 34 deletions

View File

@@ -53,7 +53,36 @@ func (h *HandlerV1) handleLUA(sid string, r *http.Request, req *rpc.RPCRequest,
sessionMod := L.NewTable()
inTable := L.NewTable()
paramsTable := L.NewTable()
headersTable := L.NewTable()
fetchedHeadersTable := L.NewTable()
for k, v := range r.Header {
L.SetField(fetchedHeadersTable, k, ConvertGolangTypesToLua(L, v))
}
headersGetter := L.NewFunction(func(L *lua.LState) int {
path := L.OptString(1, "")
def := L.Get(2)
get := func(path string) lua.LValue {
if path == "" {
return fetchedHeadersTable
}
fetched := r.Header.Get(path)
if fetched == "" {
return lua.LNil
}
return lua.LString(fetched)
}
val := get(path)
if val == lua.LNil && def != lua.LNil {
L.Push(def)
} else {
L.Push(val)
}
return 1
})
fetchedParamsTable := L.NewTable()
if fetchedParams, ok := req.Params.(map[string]any); ok {
for k, v := range fetchedParams {
@@ -61,7 +90,7 @@ func (h *HandlerV1) handleLUA(sid string, r *http.Request, req *rpc.RPCRequest,
}
}
getter := L.NewFunction(func(L *lua.LState) int {
paramsGetter := L.NewFunction(func(L *lua.LState) int {
path := L.OptString(1, "")
def := L.Get(2)
@@ -94,8 +123,14 @@ func (h *HandlerV1) handleLUA(sid string, r *http.Request, req *rpc.RPCRequest,
}
return 1
})
L.SetField(headersTable, "__fetched", fetchedHeadersTable)
L.SetField(paramsTable, "get", getter)
L.SetField(headersTable, "get", headersGetter)
L.SetField(inTable, "headers", headersTable)
L.SetField(paramsTable, "__fetched", fetchedParamsTable)
L.SetField(paramsTable, "get", paramsGetter)
L.SetField(inTable, "params", paramsTable)
outTable := L.NewTable()

View File

@@ -45,33 +45,84 @@ func ConvertLuaTypesToGolang(value lua.LValue) any {
func ConvertGolangTypesToLua(L *lua.LState, val any) lua.LValue {
switch v := val.(type) {
case nil:
return lua.LNil
case string:
return lua.LString(v)
case bool:
return lua.LBool(v)
case int:
return lua.LNumber(float64(v))
return lua.LNumber(v)
case int8:
return lua.LNumber(v)
case int16:
return lua.LNumber(v)
case int32:
return lua.LNumber(v)
case int64:
return lua.LNumber(float64(v))
return lua.LNumber(v)
case uint:
return lua.LNumber(v)
case uint8:
return lua.LNumber(v)
case uint16:
return lua.LNumber(v)
case uint32:
return lua.LNumber(v)
case uint64:
return lua.LNumber(v)
case float32:
return lua.LNumber(float64(v))
return lua.LNumber(v)
case float64:
return lua.LNumber(v)
case []string:
tbl := L.NewTable()
for i, s := range v {
tbl.RawSetInt(i+1, lua.LString(s))
}
return tbl
case []int:
tbl := L.NewTable()
for i, n := range v {
tbl.RawSetInt(i+1, lua.LNumber(n))
}
return tbl
case []float64:
tbl := L.NewTable()
for i, f := range v {
tbl.RawSetInt(i+1, lua.LNumber(f))
}
return tbl
case []any:
tbl := L.NewTable()
for i, item := range v {
tbl.RawSetInt(i+1, ConvertGolangTypesToLua(L, item))
}
return tbl
case map[string]any:
case map[string]string:
tbl := L.NewTable()
for key, value := range v {
tbl.RawSetString(key, ConvertGolangTypesToLua(L, value))
for k, s := range v {
tbl.RawSetString(k, lua.LString(s))
}
return tbl
case nil:
return lua.LNil
case map[string]int:
tbl := L.NewTable()
for k, n := range v {
tbl.RawSetString(k, lua.LNumber(n))
}
return tbl
case map[string]any:
tbl := L.NewTable()
for k, val := range v {
tbl.RawSetString(k, ConvertGolangTypesToLua(L, val))
}
return tbl
default:
return lua.LString(fmt.Sprintf("%v", v))
}
}
}