@@ -758,6 +758,40 @@ describe("resolve-openclaw-package-candidate", () => {
|
758 | 758 | await expect(missing(`${target}.tmp`)).resolves.toBe(true); |
759 | 759 | }); |
760 | 760 | |
| 761 | +it("streams non-decimal package_url content-length values through the download cap", async () => { |
| 762 | +const dir = await mkdtemp(path.join(tmpdir(), "openclaw-package-download-")); |
| 763 | +tempDirs.push(dir); |
| 764 | +const target = path.join(dir, "openclaw.tgz"); |
| 765 | +let readStarted = false; |
| 766 | +let bodyCancelled = false; |
| 767 | + |
| 768 | +await expect( |
| 769 | +downloadUrl("https://packages.example/openclaw.tgz", target, { |
| 770 | +fetchImpl: async () => { |
| 771 | +const body = new ReadableStream({ |
| 772 | +pull(controller) { |
| 773 | +readStarted = true; |
| 774 | +controller.enqueue(new Uint8Array([1, 2, 3, 4])); |
| 775 | +}, |
| 776 | +cancel() { |
| 777 | +bodyCancelled = true; |
| 778 | +}, |
| 779 | +}); |
| 780 | +return new Response(body, { |
| 781 | +headers: { "content-length": "1e3" }, |
| 782 | +status: 200, |
| 783 | +}); |
| 784 | +}, |
| 785 | +lookupHost: lookupAddresses([{ address: "93.184.216.34", family: 4 }]), |
| 786 | +maxBytes: 3, |
| 787 | +}), |
| 788 | +).rejects.toThrow("package_url exceeds maximum download size"); |
| 789 | +expect(readStarted).toBe(true); |
| 790 | +expect(bodyCancelled).toBe(true); |
| 791 | +await expect(missing(target)).resolves.toBe(true); |
| 792 | +await expect(missing(`${target}.tmp`)).resolves.toBe(true); |
| 793 | +}); |
| 794 | + |
761 | 795 | it("reads package source metadata from package artifacts", async () => { |
762 | 796 | const dir = await mkdtemp(path.join(tmpdir(), "openclaw-package-candidate-")); |
763 | 797 | tempDirs.push(dir); |
|