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  }