/
cors_handler.go
129 lines (109 loc) · 3.09 KB
/
cors_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package objectnode
// https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/EnableCorsUsingREST.html
import (
"encoding/json"
"encoding/xml"
"io"
"io/ioutil"
"net/http"
"github.com/cubefs/cubefs/util/log"
)
// https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketCors.html
func (o *ObjectNode) getBucketCorsHandler(w http.ResponseWriter, r *http.Request) {
var err error
var param = ParseRequestParam(r)
if param.Bucket() == "" {
_ = NoSuchBucket.ServeResponse(w, r)
return
}
var vol *Volume
if vol, err = o.vm.Volume(param.Bucket()); err != nil {
_ = NoSuchBucket.ServeResponse(w, r)
return
}
var output = CORSConfiguration{}
var cors *CORSConfiguration
if cors, err = vol.metaLoader.loadCors(); err != nil {
_ = InternalErrorCode(err).ServeResponse(w, r)
return
}
if cors != nil {
output.CORSRule = cors.CORSRule
}
var corsData []byte
if corsData, err = xml.Marshal(output); err != nil {
_ = InternalErrorCode(err).ServeResponse(w, r)
return
}
_, _ = w.Write(corsData)
return
}
// https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketCors.html
func (o *ObjectNode) putBucketCorsHandler(w http.ResponseWriter, r *http.Request) {
log.LogInfof("Put bucket cors")
var err error
var param = ParseRequestParam(r)
if param.Bucket() == "" {
_ = NoSuchBucket.ServeResponse(w, r)
return
}
var vol *Volume
if vol, err = o.vm.Volume(param.Bucket()); err != nil {
_ = NoSuchBucket.ServeResponse(w, r)
return
}
var bytes []byte
if bytes, err = ioutil.ReadAll(r.Body); err != nil && err != io.EOF {
_ = InternalErrorCode(err).ServeResponse(w, r)
return
}
var corsConfig *CORSConfiguration
if corsConfig, err = parseCorsConfig(bytes); err != nil {
_ = InvalidArgument.ServeResponse(w, r)
return
}
if corsConfig == nil {
_ = InvalidArgument.ServeResponse(w, r)
return
}
var newBytes []byte
if newBytes, err = json.Marshal(corsConfig); err != nil {
_ = InternalErrorCode(err).ServeResponse(w, r)
return
}
if err = storeBucketCors(newBytes, vol); err != nil {
_ = InternalErrorCode(err).ServeResponse(w, r)
return
}
vol.metaLoader.storeCors(corsConfig)
return
}
// https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketCors.html
func (o *ObjectNode) deleteBucketCorsHandler(w http.ResponseWriter, r *http.Request) {
log.LogInfof("Delete bucket cors")
var err error
var param = ParseRequestParam(r)
if param.Bucket() == "" {
_ = NoSuchBucket.ServeResponse(w, r)
return
}
var vol *Volume
if vol, err = o.vm.Volume(param.Bucket()); err != nil {
_ = NoSuchBucket.ServeResponse(w, r)
return
}
if err = deleteBucketCors(vol); err != nil {
_ = InternalErrorCode(err).ServeResponse(w, r)
return
}
vol.metaLoader.storeCors(nil)
w.WriteHeader(http.StatusNoContent)
return
}
// Option object
// Reference: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTOPTIONSobject.html
func (o *ObjectNode) optionsObjectHandler(w http.ResponseWriter, r *http.Request) {
log.LogInfof("optionsObjectHandler: OPTIONS object, requestID(%v) remote(%v)", GetRequestID(r), r.RemoteAddr)
// Already done in methods 'corsMiddleware'.
return
}