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  }