url.go raw

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