url.go 885 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package http
  2. import "strings"
  3. // JoinPath returns an absolute URL path composed of the two paths provided.
  4. // Enforces that the returned path begins with '/'. If added path is empty the
  5. // returned path suffix will match the first parameter suffix.
  6. func JoinPath(a, b string) string {
  7. if len(a) == 0 {
  8. a = "/"
  9. } else if a[0] != '/' {
  10. a = "/" + a
  11. }
  12. if len(b) != 0 && b[0] == '/' {
  13. b = b[1:]
  14. }
  15. if len(b) != 0 && len(a) > 1 && a[len(a)-1] != '/' {
  16. a = a + "/"
  17. }
  18. return a + b
  19. }
  20. // JoinRawQuery returns an absolute raw query expression. Any duplicate '&'
  21. // will be collapsed to single separator between values.
  22. func JoinRawQuery(a, b string) string {
  23. a = strings.TrimFunc(a, isAmpersand)
  24. b = strings.TrimFunc(b, isAmpersand)
  25. if len(a) == 0 {
  26. return b
  27. }
  28. if len(b) == 0 {
  29. return a
  30. }
  31. return a + "&" + b
  32. }
  33. func isAmpersand(v rune) bool {
  34. return v == '&'
  35. }