url.go 1.6 KB

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