Skip to content

Commit ca328cf

Browse files
committed
fix[worker]: contentLength and etag handling
1 parent 76ddf61 commit ca328cf

File tree

5 files changed

+20
-11
lines changed

5 files changed

+20
-11
lines changed

worker/handlers/handleMPU.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export async function handleMPUResume(request: Request, env: Env): Promise<Respo
8585
// formdata same as POST/PUT a normal paste, but
8686
// - field `c` is interpreted as JSON { partNumber: number, etag: string }[]
8787
// - field `n` is ignored
88-
export async function handleMPUComplete(request: Request, env: Env, completeBody: R2UploadedPart[]): Promise<string> {
88+
export async function handleMPUComplete(request: Request, env: Env, completeBody: R2UploadedPart[]): Promise<R2Object> {
8989
const url = new URL(request.url)
9090
const uploadId = url.searchParams.get("uploadId")
9191
const key = url.searchParams.get("key")
@@ -104,5 +104,5 @@ export async function handleMPUComplete(request: Request, env: Env, completeBody
104104
await env.R2.delete(object.key)
105105
throw new WorkerError(413, `payload too large (max ${parseSize(env.R2_MAX_ALLOWED)!} bytes allowed)`)
106106
}
107-
return object.httpEtag
107+
return object
108108
}

worker/handlers/handleRead.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,10 @@ export async function handleGet(request: Request, env: Env, ctx: ExecutionContex
236236
exposeHeaders.push("X-PB-Highlight-Language")
237237
}
238238

239+
if (item.httpEtag) {
240+
headers["etag"] = item.httpEtag
241+
}
242+
239243
if (returnFilename) {
240244
const encodedFilename = encodeURIComponent(returnFilename)
241245
headers["Content-Disposition"] = `${disp}; filename*=UTF-8''${encodedFilename}`

worker/handlers/handleWrite.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ export async function handlePostOrPut(
176176
}
177177
}
178178

179-
const etag = isMPUComplete ? await handleMPUComplete(request, env, uploadedParts!) : undefined
179+
const r2Object = isMPUComplete ? await handleMPUComplete(request, env, uploadedParts!) : undefined
180180

181181
const originalMetadata = await getPasteMetadata(env, pasteName)
182182
if (originalMetadata === null) {
@@ -193,7 +193,7 @@ export async function handlePostOrPut(
193193
expirationSeconds,
194194
now,
195195
passwd: newPasswd,
196-
contentLength,
196+
contentLength: r2Object?.size || contentLength,
197197
filename,
198198
highlightLanguage,
199199
encryptionScheme,
@@ -206,7 +206,7 @@ export async function handlePostOrPut(
206206
expirationSeconds,
207207
expireAt: new Date(now.getTime() + 1000 * expirationSeconds).toISOString(),
208208
},
209-
{ etag },
209+
{ etag: r2Object?.httpEtag },
210210
)
211211
} else {
212212
let pasteName: string | undefined
@@ -225,7 +225,7 @@ export async function handlePostOrPut(
225225
pasteName = genRandStr(isPrivate ? PRIVATE_PASTE_NAME_LEN : PASTE_NAME_LEN)
226226
}
227227

228-
const etag = isMPUComplete ? await handleMPUComplete(request, env, uploadedParts!) : undefined
228+
const r2Object = isMPUComplete ? await handleMPUComplete(request, env, uploadedParts!) : undefined
229229

230230
const password = passwdFromForm || genRandStr(DEFAULT_PASSWD_LEN)
231231
await createPaste(env, pasteName, content, {
@@ -234,7 +234,7 @@ export async function handlePostOrPut(
234234
passwd: password,
235235
filename,
236236
highlightLanguage,
237-
contentLength,
237+
contentLength: r2Object?.size || contentLength,
238238
encryptionScheme,
239239
isMPUComplete,
240240
})
@@ -246,7 +246,7 @@ export async function handlePostOrPut(
246246
expirationSeconds,
247247
expireAt: new Date(now.getTime() + 1000 * expirationSeconds).toISOString(),
248248
},
249-
{ etag },
249+
{ etag: r2Object?.httpEtag },
250250
)
251251
}
252252
}

worker/storage/storage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ function migratePasteMetadata(original: PasteMetadataInStorage): PasteMetadata {
6666
export type PasteWithMetadata = {
6767
paste: ArrayBuffer | ReadableStream
6868
metadata: PasteMetadata
69+
httpEtag?: string
6970
}
7071

7172
async function updateAccessCounter(env: Env, short: string, value: ArrayBuffer, metadata: PasteMetadata) {
@@ -117,8 +118,7 @@ export async function getPaste(env: Env, short: string, ctx: ExecutionContext):
117118
if (object === null) {
118119
return null
119120
}
120-
// TODO: how Content-Length handled?
121-
return { paste: object.body, metadata }
121+
return { paste: object.body, metadata, httpEtag: object.httpEtag }
122122
} else {
123123
return { paste: item.value, metadata }
124124
}

worker/test/mpu.spec.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { uploadMPU } from "../../shared/uploadPaste"
22
import { vi, test, describe, it, expect, afterAll, beforeEach } from "vitest"
33
import { createExecutionContext } from "cloudflare:test"
4-
import { areBlobsEqual, BASE_URL, genRandomBlob, workerFetch } from "./testUtils"
4+
import { addRole, areBlobsEqual, BASE_URL, genRandomBlob, workerFetch } from "./testUtils"
55
import { PRIVATE_PASTE_NAME_LEN } from "../../shared/constants"
66
import { parsePath } from "../../shared/parsers"
7+
import { MetaResponse } from "../../shared/interfaces"
78

89
const ctx = createExecutionContext()
910
beforeEach(() => {
@@ -45,8 +46,12 @@ test("uploadMPU", async () => {
4546
callBack,
4647
)
4748

49+
const reGetMetaResp: MetaResponse = await (await workerFetch(ctx, addRole(uploadResp.url, "m"))).json()
50+
expect(reGetMetaResp.sizeBytes).toStrictEqual(content.size)
51+
4852
const reGetResp = await workerFetch(ctx, uploadResp.url)
4953
expect(await areBlobsEqual(await reGetResp.blob(), newContent)).toStrictEqual(true)
54+
expect(reGetResp.headers.has("etag")).toStrictEqual(true)
5055
})
5156

5257
describe("uploadMPU with variant parameters", () => {

0 commit comments

Comments
 (0)