request.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. "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. 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. // Cookie returns the cookie value.
  32. func (r *Request) Cookie(name string) string {
  33. cookie, err := r.request.Cookie(name)
  34. if err == http.ErrNoCookie {
  35. return ""
  36. }
  37. return cookie.Value
  38. }
  39. // FormValue returns a form value as integer.
  40. func (r *Request) FormValue(param string) string {
  41. return r.request.FormValue(param)
  42. }
  43. // FormIntegerValue returns a form value as integer.
  44. func (r *Request) FormIntegerValue(param string) int64 {
  45. value := r.request.FormValue(param)
  46. integer, _ := strconv.Atoi(value)
  47. return int64(integer)
  48. }
  49. // IntegerParam returns an URL parameter as integer.
  50. func (r *Request) IntegerParam(param string) (int64, error) {
  51. vars := mux.Vars(r.request)
  52. value, err := strconv.Atoi(vars[param])
  53. if err != nil {
  54. logger.Error("[IntegerParam] %v", err)
  55. return 0, fmt.Errorf("%s parameter is not an integer", param)
  56. }
  57. if value < 0 {
  58. return 0, nil
  59. }
  60. return int64(value), nil
  61. }
  62. // StringParam returns an URL parameter as string.
  63. func (r *Request) StringParam(param, defaultValue string) string {
  64. vars := mux.Vars(r.request)
  65. value := vars[param]
  66. if value == "" {
  67. value = defaultValue
  68. }
  69. return value
  70. }
  71. // QueryStringParam returns a querystring parameter as string.
  72. func (r *Request) QueryStringParam(param, defaultValue string) string {
  73. value := r.request.URL.Query().Get(param)
  74. if value == "" {
  75. value = defaultValue
  76. }
  77. return value
  78. }
  79. // QueryIntegerParam returns a querystring parameter as string.
  80. func (r *Request) QueryIntegerParam(param string, defaultValue int) int {
  81. value := r.request.URL.Query().Get(param)
  82. if value == "" {
  83. return defaultValue
  84. }
  85. val, err := strconv.Atoi(value)
  86. if err != nil {
  87. return defaultValue
  88. }
  89. if val < 0 {
  90. return defaultValue
  91. }
  92. return val
  93. }
  94. // HasQueryParam checks if the query string contains the given parameter.
  95. func (r *Request) HasQueryParam(param string) bool {
  96. values := r.request.URL.Query()
  97. _, ok := values[param]
  98. return ok
  99. }
  100. // NewRequest returns a new Request struct.
  101. func NewRequest(w http.ResponseWriter, r *http.Request) *Request {
  102. return &Request{writer: w, request: r}
  103. }