diff options
author | Runxi Yu <me@runxiyu.org> | 2025-02-13 00:31:48 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-02-13 00:32:01 +0800 |
commit | d87f80d3e14990e5d9fc83990ff04e29affa3a94 (patch) | |
tree | 5df543f16b96388c1dc7c6456c24d8b0d66b9d5d /url.go | |
parent | README.md: Add a bit of detail (diff) | |
download | forge-d87f80d3e14990e5d9fc83990ff04e29affa3a94.tar.gz forge-d87f80d3e14990e5d9fc83990ff04e29affa3a94.tar.zst forge-d87f80d3e14990e5d9fc83990ff04e29affa3a94.zip |
*.go: Mass rename files for clarity
Diffstat (limited to 'url.go')
-rw-r--r-- | url.go | 65 |
1 files changed, 65 insertions, 0 deletions
@@ -0,0 +1,65 @@ +package main + +import ( + "errors" + "net/http" + "net/url" + "strings" + + "go.lindenii.runxiyu.org/lindenii-common/misc" +) + +var ( + err_duplicate_ref_spec = errors.New("Duplicate ref spec") + err_no_ref_spec = errors.New("No ref spec") +) + +func get_param_ref_and_type(r *http.Request) (ref_type, ref string, err error) { + qr := r.URL.RawQuery + q, err := url.ParseQuery(qr) + if err != nil { + return + } + done := false + for _, _ref_type := range []string{"commit", "branch", "tag"} { + _ref, ok := q[_ref_type] + if ok { + if done { + err = err_duplicate_ref_spec + return + } else { + done = true + if len(_ref) != 1 { + err = err_duplicate_ref_spec + return + } + ref = _ref[0] + ref_type = _ref_type + } + } + } + if !done { + err = err_no_ref_spec + } + return +} + +func parse_request_uri(request_uri string) (segments []string, params url.Values, err error) { + path, params_string, _ := strings.Cut(request_uri, "?") + + segments = strings.Split(strings.TrimPrefix(path, "/"), "/") + + for i, segment := range segments { + segments[i], err = url.PathUnescape(segment) + if err != nil { + return nil, nil, misc.Wrap_one_error(err_bad_request, err) + } + } + + params, err = url.ParseQuery(params_string) + if err != nil { + return nil, nil, misc.Wrap_one_error(err_bad_request, err) + } + + return +} |