request.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package core
  5. import (
  6. "fmt"
  7. "io"
  8. "log"
  9. "mime/multipart"
  10. "net/http"
  11. "strconv"
  12. "github.com/gorilla/mux"
  13. )
  14. // Request is a thin wrapper around "http.Request".
  15. type Request struct {
  16. writer http.ResponseWriter
  17. request *http.Request
  18. }
  19. // Request returns the raw Request struct.
  20. func (r *Request) Request() *http.Request {
  21. return r.request
  22. }
  23. // Body returns the request body.
  24. func (r *Request) Body() io.ReadCloser {
  25. return r.request.Body
  26. }
  27. // File returns uploaded file properties.
  28. func (r *Request) File(name string) (multipart.File, *multipart.FileHeader, error) {
  29. return r.request.FormFile(name)
  30. }
  31. // IsHTTPS returns if the request is made over HTTPS.
  32. func (r *Request) IsHTTPS() bool {
  33. return r.request.URL.Scheme == "https"
  34. }
  35. // Cookie returns the cookie value.
  36. func (r *Request) Cookie(name string) string {
  37. cookie, err := r.request.Cookie(name)
  38. if err == http.ErrNoCookie {
  39. return ""
  40. }
  41. return cookie.Value
  42. }
  43. // IntegerParam returns an URL parameter as integer.
  44. func (r *Request) IntegerParam(param string) (int64, error) {
  45. vars := mux.Vars(r.request)
  46. value, err := strconv.Atoi(vars[param])
  47. if err != nil {
  48. log.Println(err)
  49. return 0, fmt.Errorf("%s parameter is not an integer", param)
  50. }
  51. if value < 0 {
  52. return 0, nil
  53. }
  54. return int64(value), nil
  55. }
  56. // StringParam returns an URL parameter as string.
  57. func (r *Request) StringParam(param, defaultValue string) string {
  58. vars := mux.Vars(r.request)
  59. value := vars[param]
  60. if value == "" {
  61. value = defaultValue
  62. }
  63. return value
  64. }
  65. // QueryStringParam returns a querystring parameter as string.
  66. func (r *Request) QueryStringParam(param, defaultValue string) string {
  67. value := r.request.URL.Query().Get(param)
  68. if value == "" {
  69. value = defaultValue
  70. }
  71. return value
  72. }
  73. // QueryIntegerParam returns a querystring parameter as string.
  74. func (r *Request) QueryIntegerParam(param string, defaultValue int) int {
  75. value := r.request.URL.Query().Get(param)
  76. if value == "" {
  77. return defaultValue
  78. }
  79. val, err := strconv.Atoi(value)
  80. if err != nil {
  81. return defaultValue
  82. }
  83. if val < 0 {
  84. return defaultValue
  85. }
  86. return val
  87. }
  88. // NewRequest returns a new Request struct.
  89. func NewRequest(w http.ResponseWriter, r *http.Request) *Request {
  90. return &Request{writer: w, request: r}
  91. }