request.gno
1.49 Kb ยท 54 lines
1package mux
2
3import (
4 "net/url"
5 "strings"
6)
7
8// Request represents an incoming request.
9type Request struct {
10 // Path is request path name.
11 //
12 // Note: use RawPath to obtain a raw path with query string.
13 Path string
14
15 // RawPath contains a whole request path, including query string.
16 RawPath string
17
18 // HandlerPath is handler rule that matches a request.
19 HandlerPath string
20
21 // Query contains the parsed URL query parameters.
22 Query url.Values
23}
24
25// GetVar retrieves a variable from the path based on routing rules.
26func (r *Request) GetVar(key string) string {
27 handlerParts := strings.Split(r.HandlerPath, "/")
28 reqParts := strings.Split(r.Path, "/")
29 reqIndex := 0
30 for handlerIndex := 0; handlerIndex < len(handlerParts); handlerIndex++ {
31 handlerPart := handlerParts[handlerIndex]
32 switch {
33 case handlerPart == "*":
34 // If a wildcard "*" is found, consume all remaining segments
35 wildcardParts := reqParts[reqIndex:]
36 reqIndex = len(reqParts) // Consume all remaining segments
37 return strings.Join(wildcardParts, "/") // Return all remaining segments as a string
38 case strings.HasPrefix(handlerPart, "{") && strings.HasSuffix(handlerPart, "}"):
39 // If a variable of the form {param} is found we compare it with the key
40 parameter := handlerPart[1 : len(handlerPart)-1]
41 if parameter == key {
42 return reqParts[reqIndex]
43 }
44 reqIndex++
45 default:
46 if reqIndex >= len(reqParts) || handlerPart != reqParts[reqIndex] {
47 return ""
48 }
49 reqIndex++
50 }
51 }
52
53 return ""
54}