99 lines
2.3 KiB
Go
99 lines
2.3 KiB
Go
package gluahttp
|
|
|
|
import "github.com/yuin/gopher-lua"
|
|
import "net/http"
|
|
|
|
const luaHttpResponseTypeName = "http.response"
|
|
|
|
type luaHttpResponse struct {
|
|
res *http.Response
|
|
body lua.LString
|
|
bodySize int
|
|
}
|
|
|
|
func registerHttpResponseType(module *lua.LTable, L *lua.LState) {
|
|
mt := L.NewTypeMetatable(luaHttpResponseTypeName)
|
|
L.SetField(mt, "__index", L.NewFunction(httpResponseIndex))
|
|
|
|
L.SetField(module, "response", mt)
|
|
}
|
|
|
|
func newHttpResponse(res *http.Response, body *[]byte, bodySize int, L *lua.LState) *lua.LUserData {
|
|
ud := L.NewUserData()
|
|
ud.Value = &luaHttpResponse{
|
|
res: res,
|
|
body: lua.LString(*body),
|
|
bodySize: bodySize,
|
|
}
|
|
L.SetMetatable(ud, L.GetTypeMetatable(luaHttpResponseTypeName))
|
|
return ud
|
|
}
|
|
|
|
func checkHttpResponse(L *lua.LState) *luaHttpResponse {
|
|
ud := L.CheckUserData(1)
|
|
if v, ok := ud.Value.(*luaHttpResponse); ok {
|
|
return v
|
|
}
|
|
L.ArgError(1, "http.response expected")
|
|
return nil
|
|
}
|
|
|
|
func httpResponseIndex(L *lua.LState) int {
|
|
res := checkHttpResponse(L)
|
|
|
|
switch L.CheckString(2) {
|
|
case "headers":
|
|
return httpResponseHeaders(res, L)
|
|
case "cookies":
|
|
return httpResponseCookies(res, L)
|
|
case "status_code":
|
|
return httpResponseStatusCode(res, L)
|
|
case "url":
|
|
return httpResponseUrl(res, L)
|
|
case "body":
|
|
return httpResponseBody(res, L)
|
|
case "body_size":
|
|
return httpResponseBodySize(res, L)
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
func httpResponseHeaders(res *luaHttpResponse, L *lua.LState) int {
|
|
headers := L.NewTable()
|
|
for key, _ := range res.res.Header {
|
|
headers.RawSetString(key, lua.LString(res.res.Header.Get(key)))
|
|
}
|
|
L.Push(headers)
|
|
return 1
|
|
}
|
|
|
|
func httpResponseCookies(res *luaHttpResponse, L *lua.LState) int {
|
|
cookies := L.NewTable()
|
|
for _, cookie := range res.res.Cookies() {
|
|
cookies.RawSetString(cookie.Name, lua.LString(cookie.Value))
|
|
}
|
|
L.Push(cookies)
|
|
return 1
|
|
}
|
|
|
|
func httpResponseStatusCode(res *luaHttpResponse, L *lua.LState) int {
|
|
L.Push(lua.LNumber(res.res.StatusCode))
|
|
return 1
|
|
}
|
|
|
|
func httpResponseUrl(res *luaHttpResponse, L *lua.LState) int {
|
|
L.Push(lua.LString(res.res.Request.URL.String()))
|
|
return 1
|
|
}
|
|
|
|
func httpResponseBody(res *luaHttpResponse, L *lua.LState) int {
|
|
L.Push(&res.body)
|
|
return 1
|
|
}
|
|
|
|
func httpResponseBodySize(res *luaHttpResponse, L *lua.LState) int {
|
|
L.Push(lua.LNumber(res.bodySize))
|
|
return 1
|
|
}
|