s3api_object_handlers_tagging.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package s3api
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
  6. "io"
  7. "net/http"
  8. "github.com/seaweedfs/seaweedfs/weed/glog"
  9. "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
  10. "github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
  11. "github.com/seaweedfs/seaweedfs/weed/util"
  12. )
  13. // GetObjectTaggingHandler - GET object tagging
  14. // API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html
  15. func (s3a *S3ApiServer) GetObjectTaggingHandler(w http.ResponseWriter, r *http.Request) {
  16. bucket, object := s3_constants.GetBucketAndObject(r)
  17. glog.V(3).Infof("GetObjectTaggingHandler %s %s", bucket, object)
  18. target := util.FullPath(fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object))
  19. dir, name := target.DirAndName()
  20. tags, err := s3a.getTags(dir, name)
  21. if err != nil {
  22. if err == filer_pb.ErrNotFound {
  23. glog.Errorf("GetObjectTaggingHandler %s: %v", r.URL, err)
  24. s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey)
  25. } else {
  26. glog.Errorf("GetObjectTaggingHandler %s: %v", r.URL, err)
  27. s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
  28. }
  29. return
  30. }
  31. writeSuccessResponseXML(w, r, FromTags(tags))
  32. }
  33. // PutObjectTaggingHandler Put object tagging
  34. // API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html
  35. func (s3a *S3ApiServer) PutObjectTaggingHandler(w http.ResponseWriter, r *http.Request) {
  36. bucket, object := s3_constants.GetBucketAndObject(r)
  37. glog.V(3).Infof("PutObjectTaggingHandler %s %s", bucket, object)
  38. target := util.FullPath(fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object))
  39. dir, name := target.DirAndName()
  40. tagging := &Tagging{}
  41. input, err := io.ReadAll(io.LimitReader(r.Body, r.ContentLength))
  42. if err != nil {
  43. glog.Errorf("PutObjectTaggingHandler read input %s: %v", r.URL, err)
  44. s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
  45. return
  46. }
  47. if err = xml.Unmarshal(input, tagging); err != nil {
  48. glog.Errorf("PutObjectTaggingHandler Unmarshal %s: %v", r.URL, err)
  49. s3err.WriteErrorResponse(w, r, s3err.ErrMalformedXML)
  50. return
  51. }
  52. tags := tagging.ToTags()
  53. err = ValidateTags(tags)
  54. if err != nil {
  55. glog.Errorf("PutObjectTaggingHandler ValidateTags error %s: %v", r.URL, err)
  56. s3err.WriteErrorResponse(w, r, s3err.ErrInvalidTag)
  57. return
  58. }
  59. if err = s3a.setTags(dir, name, tagging.ToTags()); err != nil {
  60. if err == filer_pb.ErrNotFound {
  61. glog.Errorf("PutObjectTaggingHandler setTags %s: %v", r.URL, err)
  62. s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey)
  63. } else {
  64. glog.Errorf("PutObjectTaggingHandler setTags %s: %v", r.URL, err)
  65. s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
  66. }
  67. return
  68. }
  69. w.WriteHeader(http.StatusOK)
  70. s3err.PostLog(r, http.StatusOK, s3err.ErrNone)
  71. }
  72. // DeleteObjectTaggingHandler Delete object tagging
  73. // API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html
  74. func (s3a *S3ApiServer) DeleteObjectTaggingHandler(w http.ResponseWriter, r *http.Request) {
  75. bucket, object := s3_constants.GetBucketAndObject(r)
  76. glog.V(3).Infof("DeleteObjectTaggingHandler %s %s", bucket, object)
  77. target := util.FullPath(fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object))
  78. dir, name := target.DirAndName()
  79. err := s3a.rmTags(dir, name)
  80. if err != nil {
  81. if err == filer_pb.ErrNotFound {
  82. glog.Errorf("DeleteObjectTaggingHandler %s: %v", r.URL, err)
  83. s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey)
  84. } else {
  85. glog.Errorf("DeleteObjectTaggingHandler %s: %v", r.URL, err)
  86. s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
  87. }
  88. return
  89. }
  90. w.WriteHeader(http.StatusNoContent)
  91. s3err.PostLog(r, http.StatusNoContent, s3err.ErrNone)
  92. }