No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

151 líneas
3.3 KiB

  1. package utils
  2. import (
  3. "bytes"
  4. "encoding/gob"
  5. "fmt"
  6. "io"
  7. "mime/multipart"
  8. "net/http"
  9. "os"
  10. "path/filepath"
  11. "reflect"
  12. "strings"
  13. "time"
  14. )
  15. type cacheControl map[string]string
  16. func parseCacheControl(headers http.Header) cacheControl {
  17. cc := cacheControl{}
  18. ccHeader := headers.Get("Cache-Control")
  19. for _, part := range strings.Split(ccHeader, ",") {
  20. part = strings.Trim(part, " ")
  21. if part == "" {
  22. continue
  23. }
  24. if strings.ContainsRune(part, '=') {
  25. keyval := strings.Split(part, "=")
  26. cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",")
  27. } else {
  28. cc[part] = ""
  29. }
  30. }
  31. return cc
  32. }
  33. // CacheExpires helper function to determine remaining time before repeating a request.
  34. func CacheExpires(r *http.Response) time.Time {
  35. // Figure out when the cache expires.
  36. var expires time.Time
  37. now, err := time.Parse(time.RFC1123, r.Header.Get("date"))
  38. if err != nil {
  39. return time.Now()
  40. }
  41. respCacheControl := parseCacheControl(r.Header)
  42. if maxAge, ok := respCacheControl["max-age"]; ok {
  43. lifetime, err := time.ParseDuration(maxAge + "s")
  44. if err != nil {
  45. expires = now
  46. }
  47. expires = now.Add(lifetime)
  48. } else {
  49. expiresHeader := r.Header.Get("Expires")
  50. if expiresHeader != "" {
  51. expires, err = time.Parse(time.RFC1123, expiresHeader)
  52. if err != nil {
  53. expires = now
  54. }
  55. }
  56. }
  57. return expires
  58. }
  59. // Add a file to the multipart request
  60. func addFile(w *multipart.Writer, fieldName, path string) error {
  61. file, err := os.Open(path)
  62. if err != nil {
  63. return err
  64. }
  65. defer file.Close()
  66. part, err := w.CreateFormFile(fieldName, filepath.Base(path))
  67. if err != nil {
  68. return err
  69. }
  70. _, err = io.Copy(part, file)
  71. return err
  72. }
  73. // selectHeaderContentType select a content type from the available list.
  74. func selectHeaderContentType(contentTypes []string) string {
  75. if len(contentTypes) == 0 {
  76. return ""
  77. }
  78. if contains(contentTypes, "application/json") {
  79. return "application/json"
  80. }
  81. return contentTypes[0]
  82. }
  83. // selectHeaderAccept join all accept types and return
  84. func selectHeaderAccept(accepts []string) string {
  85. if len(accepts) == 0 {
  86. return ""
  87. }
  88. if contains(accepts, "application/json") {
  89. return "application/json"
  90. }
  91. return strings.Join(accepts, ",")
  92. }
  93. // contains is a case insenstive match, finding needle in a haystack
  94. func contains(haystack []string, needle string) bool {
  95. for _, a := range haystack {
  96. if strings.ToLower(a) == strings.ToLower(needle) {
  97. return true
  98. }
  99. }
  100. return false
  101. }
  102. // Verify optional parameters are of the correct type.
  103. func typeCheckParameter(obj interface{}, expected string, name string) error {
  104. if obj == nil {
  105. return nil
  106. }
  107. if reflect.TypeOf(obj).String() != expected {
  108. return fmt.Errorf("expected %s to be of type %s but received %s", name, expected, reflect.TypeOf(obj).String())
  109. }
  110. return nil
  111. }
  112. func IsSet(val interface{}) bool {
  113. if val == nil {
  114. return false
  115. }
  116. v := reflect.ValueOf(val)
  117. if v.Kind() == reflect.Ptr || v.Kind() == reflect.Slice || v.Kind() == reflect.Map {
  118. return !v.IsNil()
  119. }
  120. valType := reflect.TypeOf(val)
  121. valZero := reflect.Zero(valType)
  122. return valZero != v
  123. }
  124. func IsUnSet(val interface{}) bool {
  125. return !IsSet(val)
  126. }
  127. func DeepCopy(dst, src interface{}) error {
  128. var buf bytes.Buffer
  129. if err := gob.NewEncoder(&buf).Encode(src); err != nil {
  130. return err
  131. }
  132. return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
  133. }