Implement abort
parent
74d7be083d
commit
2009799e4e
|
@ -0,0 +1,10 @@
|
|||
|
||||
# upl
|
||||
|
||||
A dropbox backed by any S3 bucket
|
||||
|
||||
## Buckets
|
||||
|
||||
It is recommended to [configure the cleanup of incomplete multipart uploads](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html).
|
||||
|
||||
<!-- vim: set conceallevel=2 et ts=2 sw=2: -->
|
22
handlers.go
22
handlers.go
|
@ -233,4 +233,26 @@ func handleCompleteMultipartUpload(w http.ResponseWriter, req *http.Request) {
|
|||
/* abortMultipartUpload */
|
||||
|
||||
func handleAbortMultipartUpload(w http.ResponseWriter, req *http.Request) {
|
||||
vars := mux.Vars(req)
|
||||
uploadID := vars["id"]
|
||||
key := req.URL.Query().Get("key")
|
||||
|
||||
if uploadID == "" || key == "" {
|
||||
errorResponse(w, req, fmt.Errorf("%w", errBadRequest))
|
||||
return
|
||||
}
|
||||
|
||||
cred := credential{
|
||||
AccessKey: os.Getenv("MINIO_ACCESS_KEY"),
|
||||
SecretKey: os.Getenv("MINIO_SECRET_KEY"),
|
||||
Region: os.Getenv("MINIO_REGION_NAME"),
|
||||
Endpoint: os.Getenv("MINIO_ENDPOINT"),
|
||||
Prefix: os.Getenv("PREFIX"),
|
||||
}
|
||||
|
||||
err := abortMultipartUpload(key, uploadID, cred)
|
||||
if err != nil {
|
||||
errorResponse(w, req, fmt.Errorf("%w: %s", errInternalServerError, err))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
2
main.go
2
main.go
|
@ -31,7 +31,7 @@ func main() {
|
|||
multipartRouter.HandleFunc("/{id}", handleGetUploadedParts).Methods(http.MethodGet)
|
||||
multipartRouter.HandleFunc("/{id}/{part}", handleSignPartUpload).Methods(http.MethodGet)
|
||||
multipartRouter.HandleFunc("/{id}/complete", handleCompleteMultipartUpload).Methods(http.MethodPost)
|
||||
multipartRouter.HandleFunc("", handleAbortMultipartUpload).Methods(http.MethodDelete)
|
||||
multipartRouter.HandleFunc("/{id}", handleAbortMultipartUpload).Methods(http.MethodDelete)
|
||||
|
||||
server := &http.Server{
|
||||
Handler: router,
|
||||
|
|
27
s3.go
27
s3.go
|
@ -253,3 +253,30 @@ func completeMultipartUpload(key, uploadID string, parts []completePart, cred cr
|
|||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
/* abortMultipartUpload */
|
||||
|
||||
func abortMultipartUpload(key, uploadID string, cred credential) error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
|
||||
defer cancel()
|
||||
|
||||
params := make(url.Values)
|
||||
params.Set("uploadId", uploadID)
|
||||
unsignedReq, err := http.NewRequestWithContext(ctx, http.MethodDelete, cred.Endpoint+"/"+key+"?"+params.Encode(), nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
signedReq := sign(unsignedReq, cred)
|
||||
resp, err := httpClientS3.Do(signedReq)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
body, _ := ioutil.ReadAll(resp.Body)
|
||||
return fmt.Errorf("endpoint request failed: %d: %s", resp.StatusCode, body)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
"@uppy/status-bar": "^1.9.3",
|
||||
"filesize": "^6.3.0",
|
||||
"rollup": "^2.48.0",
|
||||
"rollup-plugin-import-css": "^2.0.1",
|
||||
"rollup-plugin-css-only": "^3.1.0",
|
||||
"rollup-plugin-terser": "^7.0.2"
|
||||
}
|
||||
},
|
||||
|
@ -629,15 +629,43 @@
|
|||
"fsevents": "~2.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/rollup-plugin-import-css": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/rollup-plugin-import-css/-/rollup-plugin-import-css-2.0.1.tgz",
|
||||
"integrity": "sha512-aY8VsOVHAB8RVyNmZP6Np4NeZvMeNc0U7nBMl1q5QX2QIAHSn0veQaW2T1JyzqLY+rLjICb3oEhmHWScZmbd2Q==",
|
||||
"node_modules/rollup-plugin-css-only": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/rollup-plugin-css-only/-/rollup-plugin-css-only-3.1.0.tgz",
|
||||
"integrity": "sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@rollup/pluginutils": "^3.1.0"
|
||||
"@rollup/pluginutils": "4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.12.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"rollup": "1 || 2"
|
||||
}
|
||||
},
|
||||
"node_modules/rollup-plugin-css-only/node_modules/@rollup/pluginutils": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz",
|
||||
"integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"estree-walker": "^2.0.1",
|
||||
"picomatch": "^2.2.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"rollup": "^1.20.0||^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/rollup-plugin-css-only/node_modules/estree-walker": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/rollup-plugin-terser": {
|
||||
"version": "7.0.2",
|
||||
"resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
|
||||
|
@ -1316,13 +1344,31 @@
|
|||
"fsevents": "~2.3.1"
|
||||
}
|
||||
},
|
||||
"rollup-plugin-import-css": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/rollup-plugin-import-css/-/rollup-plugin-import-css-2.0.1.tgz",
|
||||
"integrity": "sha512-aY8VsOVHAB8RVyNmZP6Np4NeZvMeNc0U7nBMl1q5QX2QIAHSn0veQaW2T1JyzqLY+rLjICb3oEhmHWScZmbd2Q==",
|
||||
"rollup-plugin-css-only": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/rollup-plugin-css-only/-/rollup-plugin-css-only-3.1.0.tgz",
|
||||
"integrity": "sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@rollup/pluginutils": "^3.1.0"
|
||||
"@rollup/pluginutils": "4"
|
||||
},
|
||||
"dependencies": {
|
||||
"@rollup/pluginutils": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz",
|
||||
"integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"estree-walker": "^2.0.1",
|
||||
"picomatch": "^2.2.2"
|
||||
}
|
||||
},
|
||||
"estree-walker": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"rollup-plugin-terser": {
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
"@uppy/status-bar": "^1.9.3",
|
||||
"filesize": "^6.3.0",
|
||||
"rollup": "^2.48.0",
|
||||
"rollup-plugin-import-css": "^2.0.1",
|
||||
"rollup-plugin-css-only": "^3.1.0",
|
||||
"rollup-plugin-terser": "^7.0.2"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import commonjs from '@rollup/plugin-commonjs';
|
||||
import resolve from '@rollup/plugin-node-resolve';
|
||||
import css from 'rollup-plugin-import-css';
|
||||
import css from 'rollup-plugin-css-only';
|
||||
import { terser } from 'rollup-plugin-terser';
|
||||
|
||||
export default {
|
||||
|
@ -15,6 +15,6 @@ export default {
|
|||
plugins: [
|
||||
commonjs(),
|
||||
resolve({ browser: true }),
|
||||
css({ minify: true }),
|
||||
css({ output: 'bundle.css' }),
|
||||
],
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue