form.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
  2. // Use of this source code is governed by a MIT style
  3. // license that can be found in the LICENSE file.
  4. package binding
  5. import (
  6. "errors"
  7. "net/http"
  8. )
  9. const defaultMemory = 32 << 20
  10. type formBinding struct{}
  11. type formPostBinding struct{}
  12. type formMultipartBinding struct{}
  13. func (formBinding) Name() string {
  14. return "form"
  15. }
  16. func (formBinding) Bind(req *http.Request, obj any) error {
  17. if err := req.ParseForm(); err != nil {
  18. return err
  19. }
  20. if err := req.ParseMultipartForm(defaultMemory); err != nil && !errors.Is(err, http.ErrNotMultipart) {
  21. return err
  22. }
  23. if err := mapForm(obj, req.Form); err != nil {
  24. return err
  25. }
  26. return validate(obj)
  27. }
  28. func (formPostBinding) Name() string {
  29. return "form-urlencoded"
  30. }
  31. func (formPostBinding) Bind(req *http.Request, obj any) error {
  32. if err := req.ParseForm(); err != nil {
  33. return err
  34. }
  35. if err := mapForm(obj, req.PostForm); err != nil {
  36. return err
  37. }
  38. return validate(obj)
  39. }
  40. func (formMultipartBinding) Name() string {
  41. return "multipart/form-data"
  42. }
  43. func (formMultipartBinding) Bind(req *http.Request, obj any) error {
  44. if err := req.ParseMultipartForm(defaultMemory); err != nil {
  45. return err
  46. }
  47. if err := mappingByPtr(obj, (*multipartRequest)(req), "form"); err != nil {
  48. return err
  49. }
  50. return validate(obj)
  51. }