|
@@ -165,11 +165,13 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque
|
|
destUrl := fmt.Sprintf("http://%s%s/%s%s?recursive=true",
|
|
destUrl := fmt.Sprintf("http://%s%s/%s%s?recursive=true",
|
|
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, bucket, urlPathEscape(object))
|
|
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, bucket, urlPathEscape(object))
|
|
|
|
|
|
- s3a.proxyToFiler(w, r, destUrl, func(proxyResponse *http.Response, w http.ResponseWriter) {
|
|
|
|
|
|
+ s3a.proxyToFiler(w, r, destUrl, func(proxyResponse *http.Response, w http.ResponseWriter) (statusCode int) {
|
|
|
|
+ statusCode = http.StatusNoContent
|
|
for k, v := range proxyResponse.Header {
|
|
for k, v := range proxyResponse.Header {
|
|
w.Header()[k] = v
|
|
w.Header()[k] = v
|
|
}
|
|
}
|
|
- w.WriteHeader(http.StatusNoContent)
|
|
|
|
|
|
+ w.WriteHeader(statusCode)
|
|
|
|
+ return statusCode
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
@@ -224,14 +226,17 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h
|
|
|
|
|
|
var deletedObjects []ObjectIdentifier
|
|
var deletedObjects []ObjectIdentifier
|
|
var deleteErrors []DeleteError
|
|
var deleteErrors []DeleteError
|
|
|
|
+ var auditLog *s3err.AccessLog
|
|
|
|
|
|
directoriesWithDeletion := make(map[string]int)
|
|
directoriesWithDeletion := make(map[string]int)
|
|
|
|
|
|
|
|
+ if s3err.Logger != nil {
|
|
|
|
+ auditLog = s3err.GetAccessLog(r, http.StatusNoContent, s3err.ErrNone)
|
|
|
|
+ }
|
|
s3a.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error {
|
|
s3a.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error {
|
|
|
|
|
|
// delete file entries
|
|
// delete file entries
|
|
for _, object := range deleteObjects.Objects {
|
|
for _, object := range deleteObjects.Objects {
|
|
-
|
|
|
|
lastSeparator := strings.LastIndex(object.ObjectName, "/")
|
|
lastSeparator := strings.LastIndex(object.ObjectName, "/")
|
|
parentDirectoryPath, entryName, isDeleteData, isRecursive := "", object.ObjectName, true, false
|
|
parentDirectoryPath, entryName, isDeleteData, isRecursive := "", object.ObjectName, true, false
|
|
if lastSeparator > 0 && lastSeparator+1 < len(object.ObjectName) {
|
|
if lastSeparator > 0 && lastSeparator+1 < len(object.ObjectName) {
|
|
@@ -254,6 +259,10 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h
|
|
Key: object.ObjectName,
|
|
Key: object.ObjectName,
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
+ if auditLog != nil {
|
|
|
|
+ auditLog.Key = entryName
|
|
|
|
+ s3err.PostAccessLog(auditLog)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// purge empty folders, only checking folders with deletions
|
|
// purge empty folders, only checking folders with deletions
|
|
@@ -306,7 +315,7 @@ var passThroughHeaders = []string{
|
|
"response-expires",
|
|
"response-expires",
|
|
}
|
|
}
|
|
|
|
|
|
-func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, destUrl string, responseFn func(proxyResponse *http.Response, w http.ResponseWriter)) {
|
|
|
|
|
|
+func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, destUrl string, responseFn func(proxyResponse *http.Response, w http.ResponseWriter) (statusCode int)) {
|
|
|
|
|
|
glog.V(3).Infof("s3 proxying %s to %s", r.Method, destUrl)
|
|
glog.V(3).Infof("s3 proxying %s to %s", r.Method, destUrl)
|
|
|
|
|
|
@@ -360,20 +369,23 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- responseFn(resp, w)
|
|
|
|
- s3err.PostLog(r, s3err.ErrNone)
|
|
|
|
|
|
+ responseStatusCode := responseFn(resp, w)
|
|
|
|
+ s3err.PostLog(r, responseStatusCode, s3err.ErrNone)
|
|
}
|
|
}
|
|
|
|
|
|
-func passThroughResponse(proxyResponse *http.Response, w http.ResponseWriter) {
|
|
|
|
|
|
+func passThroughResponse(proxyResponse *http.Response, w http.ResponseWriter) (statusCode int) {
|
|
for k, v := range proxyResponse.Header {
|
|
for k, v := range proxyResponse.Header {
|
|
w.Header()[k] = v
|
|
w.Header()[k] = v
|
|
}
|
|
}
|
|
if proxyResponse.Header.Get("Content-Range") != "" && proxyResponse.StatusCode == 200 {
|
|
if proxyResponse.Header.Get("Content-Range") != "" && proxyResponse.StatusCode == 200 {
|
|
w.WriteHeader(http.StatusPartialContent)
|
|
w.WriteHeader(http.StatusPartialContent)
|
|
|
|
+ statusCode = http.StatusPartialContent
|
|
} else {
|
|
} else {
|
|
- w.WriteHeader(proxyResponse.StatusCode)
|
|
|
|
|
|
+ statusCode = proxyResponse.StatusCode
|
|
}
|
|
}
|
|
|
|
+ w.WriteHeader(statusCode)
|
|
io.Copy(w, proxyResponse.Body)
|
|
io.Copy(w, proxyResponse.Body)
|
|
|
|
+ return statusCode
|
|
}
|
|
}
|
|
|
|
|
|
func (s3a *S3ApiServer) putToFiler(r *http.Request, uploadUrl string, dataReader io.Reader) (etag string, code s3err.ErrorCode) {
|
|
func (s3a *S3ApiServer) putToFiler(r *http.Request, uploadUrl string, dataReader io.Reader) (etag string, code s3err.ErrorCode) {
|