(rawURL string, urlPath string)
| 847 | } |
| 848 | |
| 849 | func JoinURL(rawURL string, urlPath string) string { |
| 850 | rawURL = strings.TrimSpace(rawURL) |
| 851 | |
| 852 | if strings.HasPrefix(urlPath, "#") { |
| 853 | return urlPath |
| 854 | } |
| 855 | |
| 856 | lowerURLPath := strings.ToLower(urlPath) |
| 857 | if strings.HasPrefix(lowerURLPath, "//") { |
| 858 | return "http:" + urlPath |
| 859 | } |
| 860 | if strings.HasPrefix(lowerURLPath, "http://") || strings.HasPrefix(lowerURLPath, "https://") { |
| 861 | return urlPath |
| 862 | } |
| 863 | |
| 864 | if !strings.HasSuffix(rawURL, "/") { |
| 865 | slice := strings.Split(rawURL, "/") |
| 866 | if l := len(slice); l > 0 { |
| 867 | rawURL = strings.Join(slice[:l-1], "/") |
| 868 | } |
| 869 | } |
| 870 | u, err := url.Parse(rawURL) |
| 871 | |
| 872 | if err != nil { |
| 873 | return rawURL |
| 874 | } |
| 875 | |
| 876 | if strings.HasPrefix(urlPath, "/") { |
| 877 | return u.Scheme + "://" + u.Host + "/" + strings.TrimLeft(urlPath, "/") |
| 878 | } |
| 879 | u.Path = path.Join(strings.TrimRight(u.Path, "/")+"/", urlPath) |
| 880 | // return u.String() // 会对中文进行编码 |
| 881 | return u.Scheme + "://" + u.Host + "/" + strings.Trim(u.Path, "/") |
| 882 | } |
| 883 | |
| 884 | type ReflectVal struct { |
| 885 | T reflect.Type |
no outgoing calls
no test coverage detected