url.go 1004 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package util
  2. import (
  3. "net/url"
  4. "strings"
  5. )
  6. // UrlQueryReader is a URL query type.
  7. type UrlQueryReader struct {
  8. values url.Values
  9. }
  10. // NewUrlQueryReader parses a raw query and returns it as a UrlQueryReader type.
  11. func NewUrlQueryReader(urlInfo *url.URL) (*UrlQueryReader, error) {
  12. u, err := url.ParseQuery(urlInfo.RawQuery)
  13. if err != nil {
  14. return nil, err
  15. }
  16. return &UrlQueryReader{
  17. values: u,
  18. }, nil
  19. }
  20. // Get parse parameters from an URL. If the parameter does not exist, it returns
  21. // the default value.
  22. func (r *UrlQueryReader) Get(name string, def string) string {
  23. val := r.values[name]
  24. if len(val) == 0 {
  25. return def
  26. }
  27. return val[0]
  28. }
  29. // JoinUrlFragments joins two URL fragments into only one URL string.
  30. func JoinUrlFragments(a, b string) string {
  31. aslash := strings.HasSuffix(a, "/")
  32. bslash := strings.HasPrefix(b, "/")
  33. if len(b) == 0 {
  34. return a
  35. }
  36. switch {
  37. case aslash && bslash:
  38. return a + b[1:]
  39. case !aslash && !bslash:
  40. return a + "/" + b
  41. }
  42. return a + b
  43. }