github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/actions/lua/net/url/url.go (about) 1 package url 2 3 import ( 4 neturl "net/url" 5 6 "github.com/Shopify/go-lua" 7 "github.com/treeverse/lakefs/pkg/actions/lua/util" 8 ) 9 10 func Open(l *lua.State) { 11 open := func(l *lua.State) int { 12 lua.NewLibrary(l, library) 13 return 1 14 } 15 lua.Require(l, "net/url", open, false) 16 l.Pop(1) 17 } 18 19 var library = []lua.RegistryFunction{ 20 {Name: "parse", Function: parse}, 21 {Name: "query_unescape", Function: queryUnescape}, 22 {Name: "path_escape", Function: pathEscape}, 23 {Name: "build_url", Function: build}, 24 } 25 26 func parse(l *lua.State) int { 27 rawURL := lua.CheckString(l, 1) 28 u, err := neturl.Parse(rawURL) 29 if err != nil { 30 lua.Errorf(l, "%s", err.Error()) 31 panic("unreachable") 32 } 33 return util.DeepPush(l, map[string]string{ 34 "host": u.Host, 35 "path": u.Path, 36 "scheme": u.Scheme, 37 "query": u.RawQuery, 38 "fragment": u.Fragment, 39 }) 40 } 41 42 func queryUnescape(l *lua.State) int { 43 escapedQuery := lua.CheckString(l, 1) 44 qu, err := neturl.QueryUnescape(escapedQuery) 45 if err != nil { 46 lua.Errorf(l, "%s", err.Error()) 47 panic("unreachable") 48 } 49 l.PushString(qu) 50 return 1 51 } 52 53 func pathEscape(l *lua.State) int { 54 path := lua.CheckString(l, 1) 55 ep := neturl.PathEscape(path) 56 l.PushString(ep) 57 return 1 58 } 59 60 func build(l *lua.State) int { 61 scheme := lua.CheckString(l, 1) 62 host := lua.CheckString(l, 2) 63 u := neturl.URL{ 64 Scheme: scheme, 65 Host: host, 66 } 67 if !l.IsNone(3) { 68 u.Path = lua.CheckString(l, 3) 69 } 70 if !l.IsNone(4) { 71 u.RawQuery = lua.CheckString(l, 4) 72 } 73 if !l.IsNone(5) { 74 u.Fragment = lua.CheckString(l, 3) 75 } 76 l.PushString(u.String()) 77 return 1 78 }