github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/cutil/rc.go (about) 1 // Package cutil - Content managed by Project Forge, see [projectforge.md] for details. 2 package cutil 3 4 import ( 5 "net/http" 6 "net/url" 7 "strconv" 8 9 "github.com/google/uuid" 10 "github.com/gorilla/mux" 11 "github.com/pkg/errors" 12 13 "github.com/kyleu/dbaudit/app" 14 "github.com/kyleu/dbaudit/app/util" 15 ) 16 17 func RequestCtxToMap(w http.ResponseWriter, r *http.Request, as *app.State, ps *PageState) util.ValueMap { 18 req := util.ValueMap{ 19 "url": r.URL.String(), "protocol": r.URL.Scheme, 20 "host": r.URL.Host, "path": r.URL.Path, 21 "queryString": r.URL.RawQuery, "headers": r.Header, 22 } 23 action := util.ValueMap{ 24 "action": ps.Action, "admin": ps.Admin, "authed": ps.Authed, 25 "redirect": ps.ForceRedirect, "flashes": ps.Flashes, "breadcrumbs": ps.Breadcrumbs, 26 "browser": ps.Browser, "browserVersion": ps.BrowserVersion, "os": ps.OS, "osVersion": ps.OSVersion, "platform": ps.Platform, 27 "description": ps.Description, "title": ps.Title, "started": ps.Started, 28 } 29 ret := util.ValueMap{"action": action, "data": ps.Data, "request": req} 30 // $PF_SECTION_START(debugstuff)$ 31 // $PF_SECTION_END(debugstuff)$ 32 return ret 33 } 34 35 func RCRequiredString(r *http.Request, key string, allowEmpty bool) (string, error) { 36 v := mux.Vars(r)[key] 37 if (!allowEmpty) && v == "" { 38 return v, errors.Errorf("must provide [%s] in path", key) 39 } 40 v, err := url.QueryUnescape(v) 41 if err != nil { 42 return "", err 43 } 44 return v, nil 45 } 46 47 func RCRequiredBool(r *http.Request, key string) (bool, error) { 48 ret, err := RCRequiredString(r, key, true) 49 if err != nil { 50 return false, err 51 } 52 return ret == util.BoolTrue, nil 53 } 54 55 func RCRequiredInt(r *http.Request, key string) (int, error) { 56 s, err := RCRequiredString(r, key, true) 57 if err != nil { 58 return 0, err 59 } 60 ret, err := strconv.ParseInt(s, 10, 32) 61 return int(ret), err 62 } 63 64 func RCRequiredUUID(r *http.Request, key string) (*uuid.UUID, error) { 65 ret, err := RCRequiredString(r, key, true) 66 if err != nil { 67 return nil, err 68 } 69 return util.UUIDFromString(ret), nil 70 } 71 72 func RCRequiredArray(r *http.Request, key string) ([]string, error) { 73 ret, err := RCRequiredString(r, key, true) 74 if err != nil { 75 return nil, err 76 } 77 return util.StringSplitAndTrim(ret, ","), nil 78 } 79 80 func QueryStringBool(r *http.Request, key string) bool { 81 x := r.URL.Query().Get(key) 82 return x == util.BoolTrue || x == "t" || x == "True" || x == "TRUE" 83 } 84 85 func QueryArgsMap(r *http.Request) util.ValueMap { 86 ret := make(util.ValueMap, len(r.Header)) 87 for k, v := range r.URL.Query() { 88 if len(v) == 1 { 89 ret[k] = v[0] 90 } else { 91 ret[k] = v 92 } 93 } 94 return ret 95 } 96 97 func RequestHeadersMap(r *http.Request) util.ValueMap { 98 ret := make(util.ValueMap, len(r.Header)) 99 for k, v := range r.Header { 100 if len(v) == 1 { 101 ret[k] = v[0] 102 } else { 103 ret[k] = v 104 } 105 } 106 return ret 107 } 108 109 func ResponseHeadersMap(w http.ResponseWriter) util.ValueMap { 110 ret := make(util.ValueMap, len(w.Header())) 111 for k, v := range w.Header() { 112 if len(v) == 1 { 113 ret[k] = v[0] 114 } else { 115 ret[k] = v 116 } 117 } 118 return ret 119 }