diff --git a/src/aws/s3.coffee b/src/aws/s3.coffee index e4e1443..64a7fad 100644 --- a/src/aws/s3.coffee +++ b/src/aws/s3.coffee @@ -85,4 +85,9 @@ class S3 method: 'GET' headers: @makeHeaders params + headObject: (key, params) -> + @request @baseURL + key, null, + method: 'HEAD' + headers: @makeHeaders params + export default S3 \ No newline at end of file diff --git a/src/index.coffee b/src/index.coffee index 616cf56..40ea93b 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -1,5 +1,8 @@ import config from "../config.json" import * as crypto from "./crypto" +import S3 from "./aws/s3" + +s3 = new S3 config addEventListener 'fetch', (event) => event.respondWith handleRequest event @@ -23,7 +26,22 @@ handlePUT = (request) -> unless valid return verifyFailure() - return new Response "Valid" + # Don't overwrite existing files + resp = await s3.headObject url.pathname[1...], {} + if resp.ok + return new Response "File already exists", + status: 400 + + try + await s3.putObject url.pathname[1...], request.body, + ContentType: request.headers.get "Content-Type" + ContentLength: request.headers.get "Content-Length" + catch err + console.log err + return new Response "Cannot upload", + status: 400 + + return new Response "OK" verifyFailure = -> return new Response "Invalid signature", diff --git a/webpack.config.js b/webpack.config.js index ca0ec03..7ad535b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -9,6 +9,7 @@ module.exports = { mode: 'production', resolve: { extensions: ['.coffee', '.js'], + fallback: { "os": false }, }, module: { rules: [