request.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 handler
  5. import (
  6. "fmt"
  7. "io"
  8. "mime/multipart"
  9. "net/http"
  10. "strconv"
  11. "github.com/gorilla/mux"
  12. "github.com/miniflux/miniflux/logger"
  13. )
  14. // Request is a thin wrapper around "http.Request".
  15. type Request struct {
  16. request *http.Request
  17. }
  18. // Request returns the raw Request struct.
  19. func (r *Request) Request() *http.Request {
  20. return r.request
  21. }
  22. // Body returns the request body.
  23. func (r *Request) Body() io.ReadCloser {
  24. return r.request.Body
  25. }
  26. // File returns uploaded file properties.
  27. func (r *Request) File(name string) (multipart.File, *multipart.FileHeader, error) {
  28. return r.request.FormFile(name)
  29. }
  30. // Cookie returns the cookie value.
  31. func (r *Request) Cookie(name string) string {
  32. cookie, err := r.request.Cookie(name)
  33. if err == http.ErrNoCookie {
  34. return ""
  35. }
  36. return cookie.Value
  37. }
  38. // FormValue returns a form value as integer.
  39. func (r *Request) FormValue(param string) string {
  40. return r.request.FormValue(param)
  41. }
  42. // FormIntegerValue returns a form value as integer.
  43. func (r *Request) FormIntegerValue(param string) int64 {
  44. value := r.request.FormValue(param)
  45. integer, _ := strconv.Atoi(value)
  46. return int64(integer)
  47. }
  48. // IntegerParam returns an URL parameter as integer.
  49. func (r *Request) IntegerParam(param string) (int64, error) {
  50. vars := mux.Vars(r.request)
  51. value, err := strconv.Atoi(vars[param])
  52. if err != nil {
  53. logger.Error("[IntegerParam] %v", err)
  54. return 0, fmt.Errorf("%s parameter is not an integer", param)
  55. }
  56. if value < 0 {
  57. return 0, nil
  58. }
  59. return int64(value), nil
  60. }
  61. // StringParam returns an URL parameter as string.
  62. func (r *Request) StringParam(param, defaultValue string) string {
  63. vars := mux.Vars(r.request)
  64. value := vars[param]
  65. if value == "" {
  66. value = defaultValue
  67. }
  68. return value
  69. }
  70. // QueryStringParam returns a querystring parameter as string.
  71. func (r *Request) QueryStringParam(param, defaultValue string) string {
  72. value := r.request.URL.Query().Get(param)
  73. if value == "" {
  74. value = defaultValue
  75. }
  76. return value
  77. }
  78. // QueryIntegerParam returns a querystring parameter as string.
  79. func (r *Request) QueryIntegerParam(param string, defaultValue int) int {
  80. value := r.request.URL.Query().Get(param)
  81. if value == "" {
  82. return defaultValue
  83. }
  84. val, err := strconv.Atoi(value)
  85. if err != nil {
  86. return defaultValue
  87. }
  88. if val < 0 {
  89. return defaultValue
  90. }
  91. return val
  92. }
  93. // HasQueryParam checks if the query string contains the given parameter.
  94. func (r *Request) HasQueryParam(param string) bool {
  95. values := r.request.URL.Query()
  96. _, ok := values[param]
  97. return ok
  98. }
  99. // NewRequest returns a new Request.
  100. func NewRequest(r *http.Request) *Request {
  101. return &Request{r}
  102. }