util.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package httpx
  2. import (
  3. "fmt"
  4. "github.com/wuntsong-org/go-zero-plus/rest/internal/header"
  5. "net/http"
  6. "strings"
  7. )
  8. const xForwardedFor = "X-Forwarded-For"
  9. // GetFormValues returns the form values.
  10. func GetFormValues(r *http.Request) (map[string]any, error) {
  11. if strings.Contains(r.Header.Get(header.ContentType), header.FormDataType) {
  12. err := r.ParseMultipartForm(maxMemory)
  13. if err != nil {
  14. return nil, err
  15. }
  16. if r.MultipartForm == nil {
  17. return nil, fmt.Errorf("not form-data")
  18. }
  19. params := make(map[string]any, len(r.MultipartForm.Value))
  20. for name, value := range r.MultipartForm.Value {
  21. if len(value) != 1 {
  22. continue
  23. }
  24. formValue := value[0]
  25. if len(formValue) == 0 {
  26. continue
  27. }
  28. params[name] = formValue
  29. }
  30. return params, nil
  31. } else if strings.Contains(r.Header.Get(header.ContentType), header.FormUrlEncodedType) {
  32. err := r.ParseForm()
  33. if err != nil {
  34. return nil, err
  35. }
  36. params := make(map[string]any, len(r.Form))
  37. for name := range r.Form {
  38. formValue := r.Form.Get(name)
  39. if len(formValue) == 0 {
  40. continue
  41. }
  42. params[name] = formValue
  43. }
  44. return params, nil
  45. } else {
  46. val := r.URL.Query()
  47. params := make(map[string]any, len(val))
  48. for name, values := range val {
  49. if len(values) == 0 {
  50. continue
  51. }
  52. formValue := values[0]
  53. if len(formValue) == 0 {
  54. continue
  55. }
  56. params[name] = formValue
  57. }
  58. return params, nil
  59. }
  60. }
  61. // GetRemoteAddr returns the peer address, supports X-Forward-For.
  62. func GetRemoteAddr(r *http.Request) string {
  63. v := r.Header.Get(xForwardedFor)
  64. if len(v) > 0 {
  65. return v
  66. }
  67. return r.RemoteAddr
  68. }