mirror of
https://github.com/akyaiy/GoSally-mvp.git
synced 2026-01-03 15:12:26 +00:00
add headers lua runtime support
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user