s3api_object_tagging_handlers.go 3.6 KB

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