url.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package sprig
  2. import (
  3. "fmt"
  4. "net/url"
  5. "reflect"
  6. )
  7. func dictGetOrEmpty(dict map[string]any, key string) string {
  8. value, ok := dict[key]
  9. if !ok {
  10. return ""
  11. }
  12. tp := reflect.TypeOf(value).Kind()
  13. if tp != reflect.String {
  14. panic(fmt.Sprintf("unable to parse %s key, must be of type string, but %s found", key, tp.String()))
  15. }
  16. return reflect.ValueOf(value).String()
  17. }
  18. // parses given URL to return dict object
  19. func urlParse(v string) map[string]any {
  20. dict := map[string]any{}
  21. parsedURL, err := url.Parse(v)
  22. if err != nil {
  23. panic(fmt.Sprintf("unable to parse url: %s", err))
  24. }
  25. dict["scheme"] = parsedURL.Scheme
  26. dict["host"] = parsedURL.Host
  27. dict["hostname"] = parsedURL.Hostname()
  28. dict["path"] = parsedURL.Path
  29. dict["query"] = parsedURL.RawQuery
  30. dict["opaque"] = parsedURL.Opaque
  31. dict["fragment"] = parsedURL.Fragment
  32. if parsedURL.User != nil {
  33. dict["userinfo"] = parsedURL.User.String()
  34. } else {
  35. dict["userinfo"] = ""
  36. }
  37. return dict
  38. }
  39. // join given dict to URL string
  40. func urlJoin(d map[string]any) string {
  41. resURL := url.URL{
  42. Scheme: dictGetOrEmpty(d, "scheme"),
  43. Host: dictGetOrEmpty(d, "host"),
  44. Path: dictGetOrEmpty(d, "path"),
  45. RawQuery: dictGetOrEmpty(d, "query"),
  46. Opaque: dictGetOrEmpty(d, "opaque"),
  47. Fragment: dictGetOrEmpty(d, "fragment"),
  48. }
  49. userinfo := dictGetOrEmpty(d, "userinfo")
  50. var user *url.Userinfo
  51. if userinfo != "" {
  52. tempURL, err := url.Parse(fmt.Sprintf("proto://%s@host", userinfo))
  53. if err != nil {
  54. panic(fmt.Sprintf("unable to parse userinfo in dict: %s", err))
  55. }
  56. user = tempURL.User
  57. }
  58. resURL.User = user
  59. return resURL.String()
  60. }