request.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package rest
  2. import (
  3. "io"
  4. "net/http"
  5. "git.ali33.ru/fcg-xvii/go-tools/json"
  6. )
  7. // Request реализует объект запроса
  8. type Request struct {
  9. *http.Request
  10. auth json.Map
  11. data json.Map
  12. files map[string]io.ReadCloser
  13. tokenGenerator func(json.Map, int64) (string, error)
  14. }
  15. // GenerateToken создает новый токен авторизации. expire - timestamp даты, после которой токен не будет действителен (если указан 0 - токен бессрочный)
  16. func (s *Request) GenerateToken(data json.Map, expire int64) (string, error) {
  17. return s.tokenGenerator(data, expire)
  18. }
  19. // Возвращает путь (краткий url) запроса
  20. func (s *Request) RPath() string {
  21. return s.URL.Path
  22. }
  23. // Data возвращает словерь json запроса
  24. func (s *Request) Data() json.Map {
  25. return s.data
  26. }
  27. // FileKeys возвращает все имена файлы, которые доступны в запросе
  28. func (s *Request) FileKeys() []string {
  29. res := make([]string, 0, len(s.files))
  30. for k := range s.files {
  31. res = append(res, k)
  32. }
  33. return res
  34. }
  35. // File возвращает файл, принятый в запросе multipart/form-data, если он существует
  36. func (s *Request) File(name string) (io.Reader, bool) {
  37. r, check := s.files[name]
  38. return r, check
  39. }
  40. // Auth возвращает словарь с данными об авторизации (при условии, что в заголовке Bearer указан токен и его удалось успешно расшифровать и распарсить)
  41. func (s *Request) Auth() json.Map {
  42. return s.auth
  43. }
  44. // IsAuth указывает, есть ли словарь авторизации или нет
  45. func (s *Request) IsAuth() bool {
  46. return s.auth != nil
  47. }
  48. // IsJSON возарвщвет true, если в заголовке ContentType application/json
  49. func (s *Request) IsJSON() bool {
  50. return s.Header.Get("Content-Type") == "application/json"
  51. }
  52. // // IsForm возарвщвет true, если в заголовке ContentType multipart/form-data
  53. func (s *Request) IsForm() bool {
  54. return s.Header.Get("Content-Type") == "application/x-www-form-urlencoded"
  55. }
  56. // Close закрывает все открытые ресурсы запоса (файлы)
  57. func (s *Request) Close() {
  58. for _, file := range s.files {
  59. file.Close()
  60. }
  61. }