khenaidoo | 59ce9dd | 2019-11-11 13:05:32 -0500 | [diff] [blame] | 1 | // Copyright 2009 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | // Package pathutil implements utility functions for handling slash-separated |
| 6 | // paths. |
| 7 | package pathutil |
| 8 | |
| 9 | import "path" |
| 10 | |
| 11 | // CanonicalURLPath returns the canonical url path for p, which follows the rules: |
| 12 | // 1. the path always starts with "/" |
| 13 | // 2. replace multiple slashes with a single slash |
| 14 | // 3. replace each '.' '..' path name element with equivalent one |
| 15 | // 4. keep the trailing slash |
| 16 | // The function is borrowed from stdlib http.cleanPath in server.go. |
| 17 | func CanonicalURLPath(p string) string { |
| 18 | if p == "" { |
| 19 | return "/" |
| 20 | } |
| 21 | if p[0] != '/' { |
| 22 | p = "/" + p |
| 23 | } |
| 24 | np := path.Clean(p) |
| 25 | // path.Clean removes trailing slash except for root, |
| 26 | // put the trailing slash back if necessary. |
| 27 | if p[len(p)-1] == '/' && np != "/" { |
| 28 | np += "/" |
| 29 | } |
| 30 | return np |
| 31 | } |