aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/bun-error/package-lock.json666
-rw-r--r--packages/bun-types/globals.d.ts42
-rw-r--r--src/bun.js/webcore/request.zig60
-rw-r--r--src/bun.js/webcore/response.zig315
-rw-r--r--test/bun.js/fetch-gzip.test.ts3
-rw-r--r--test/bun.js/fetch.test.js2
-rw-r--r--test/bun.js/proxy.test.js60
-rw-r--r--test/bun.js/serve.test.ts1
8 files changed, 356 insertions, 793 deletions
diff --git a/packages/bun-error/package-lock.json b/packages/bun-error/package-lock.json
deleted file mode 100644
index 308205754..000000000
--- a/packages/bun-error/package-lock.json
+++ /dev/null
@@ -1,666 +0,0 @@
-{
- "name": "bun-error",
- "version": "1.0.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "bun-error",
- "version": "1.0.0",
- "license": "MIT",
- "dependencies": {
- "esbuild": "latest",
- "react": "^17.0.2",
- "react-dom": "^17.0.2"
- },
- "devDependencies": {
- "@types/react": "^17.0.39"
- }
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.5",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
- "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
- "dev": true
- },
- "node_modules/@types/react": {
- "version": "17.0.47",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.47.tgz",
- "integrity": "sha512-mk0BL8zBinf2ozNr3qPnlu1oyVTYq+4V7WA76RgxUAtf0Em/Wbid38KN6n4abEkvO4xMTBWmnP1FtQzgkEiJoA==",
- "dev": true,
- "dependencies": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/scheduler": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
- "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
- "dev": true
- },
- "node_modules/csstype": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
- "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==",
- "dev": true
- },
- "node_modules/esbuild": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz",
- "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==",
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "esbuild-android-64": "0.14.48",
- "esbuild-android-arm64": "0.14.48",
- "esbuild-darwin-64": "0.14.48",
- "esbuild-darwin-arm64": "0.14.48",
- "esbuild-freebsd-64": "0.14.48",
- "esbuild-freebsd-arm64": "0.14.48",
- "esbuild-linux-32": "0.14.48",
- "esbuild-linux-64": "0.14.48",
- "esbuild-linux-arm": "0.14.48",
- "esbuild-linux-arm64": "0.14.48",
- "esbuild-linux-mips64le": "0.14.48",
- "esbuild-linux-ppc64le": "0.14.48",
- "esbuild-linux-riscv64": "0.14.48",
- "esbuild-linux-s390x": "0.14.48",
- "esbuild-netbsd-64": "0.14.48",
- "esbuild-openbsd-64": "0.14.48",
- "esbuild-sunos-64": "0.14.48",
- "esbuild-windows-32": "0.14.48",
- "esbuild-windows-64": "0.14.48",
- "esbuild-windows-arm64": "0.14.48"
- }
- },
- "node_modules/esbuild-android-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz",
- "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-android-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz",
- "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-darwin-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz",
- "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-darwin-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz",
- "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-freebsd-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz",
- "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-freebsd-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz",
- "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-32": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz",
- "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz",
- "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-arm": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz",
- "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz",
- "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-mips64le": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz",
- "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==",
- "cpu": [
- "mips64el"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-ppc64le": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz",
- "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-riscv64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz",
- "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==",
- "cpu": [
- "riscv64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-linux-s390x": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz",
- "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==",
- "cpu": [
- "s390x"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-netbsd-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz",
- "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-openbsd-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz",
- "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-sunos-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz",
- "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-32": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz",
- "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz",
- "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/esbuild-windows-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz",
- "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
- "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dom": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
- "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "scheduler": "^0.20.2"
- },
- "peerDependencies": {
- "react": "17.0.2"
- }
- },
- "node_modules/scheduler": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
- "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- }
- },
- "dependencies": {
- "@types/prop-types": {
- "version": "15.7.5",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
- "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
- "dev": true
- },
- "@types/react": {
- "version": "17.0.47",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.47.tgz",
- "integrity": "sha512-mk0BL8zBinf2ozNr3qPnlu1oyVTYq+4V7WA76RgxUAtf0Em/Wbid38KN6n4abEkvO4xMTBWmnP1FtQzgkEiJoA==",
- "dev": true,
- "requires": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "@types/scheduler": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
- "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
- "dev": true
- },
- "csstype": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
- "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==",
- "dev": true
- },
- "esbuild": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz",
- "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==",
- "requires": {
- "esbuild-android-64": "0.14.48",
- "esbuild-android-arm64": "0.14.48",
- "esbuild-darwin-64": "0.14.48",
- "esbuild-darwin-arm64": "0.14.48",
- "esbuild-freebsd-64": "0.14.48",
- "esbuild-freebsd-arm64": "0.14.48",
- "esbuild-linux-32": "0.14.48",
- "esbuild-linux-64": "0.14.48",
- "esbuild-linux-arm": "0.14.48",
- "esbuild-linux-arm64": "0.14.48",
- "esbuild-linux-mips64le": "0.14.48",
- "esbuild-linux-ppc64le": "0.14.48",
- "esbuild-linux-riscv64": "0.14.48",
- "esbuild-linux-s390x": "0.14.48",
- "esbuild-netbsd-64": "0.14.48",
- "esbuild-openbsd-64": "0.14.48",
- "esbuild-sunos-64": "0.14.48",
- "esbuild-windows-32": "0.14.48",
- "esbuild-windows-64": "0.14.48",
- "esbuild-windows-arm64": "0.14.48"
- }
- },
- "esbuild-android-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz",
- "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==",
- "optional": true
- },
- "esbuild-android-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz",
- "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==",
- "optional": true
- },
- "esbuild-darwin-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz",
- "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==",
- "optional": true
- },
- "esbuild-darwin-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz",
- "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==",
- "optional": true
- },
- "esbuild-freebsd-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz",
- "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==",
- "optional": true
- },
- "esbuild-freebsd-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz",
- "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==",
- "optional": true
- },
- "esbuild-linux-32": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz",
- "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==",
- "optional": true
- },
- "esbuild-linux-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz",
- "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==",
- "optional": true
- },
- "esbuild-linux-arm": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz",
- "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==",
- "optional": true
- },
- "esbuild-linux-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz",
- "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==",
- "optional": true
- },
- "esbuild-linux-mips64le": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz",
- "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==",
- "optional": true
- },
- "esbuild-linux-ppc64le": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz",
- "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==",
- "optional": true
- },
- "esbuild-linux-riscv64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz",
- "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==",
- "optional": true
- },
- "esbuild-linux-s390x": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz",
- "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==",
- "optional": true
- },
- "esbuild-netbsd-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz",
- "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==",
- "optional": true
- },
- "esbuild-openbsd-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz",
- "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==",
- "optional": true
- },
- "esbuild-sunos-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz",
- "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==",
- "optional": true
- },
- "esbuild-windows-32": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz",
- "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==",
- "optional": true
- },
- "esbuild-windows-64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz",
- "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==",
- "optional": true
- },
- "esbuild-windows-arm64": {
- "version": "0.14.48",
- "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz",
- "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==",
- "optional": true
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "react": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
- "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- },
- "react-dom": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
- "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "scheduler": "^0.20.2"
- }
- },
- "scheduler": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
- "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- }
- }
-}
diff --git a/packages/bun-types/globals.d.ts b/packages/bun-types/globals.d.ts
index 8113c554e..c83d29f5c 100644
--- a/packages/bun-types/globals.d.ts
+++ b/packages/bun-types/globals.d.ts
@@ -832,6 +832,22 @@ interface RequestInit {
* Enable or disable HTTP request timeout
*/
timeout?: boolean;
+
+}
+
+interface FetchRequestInit extends RequestInit {
+ /**
+ * Log the raw HTTP request & response to stdout. This API may be
+ * removed in a future version of Bun without notice.
+ * This is a custom property that is not part of the Fetch API specification.
+ * It exists mostly as a debugging tool
+ */
+ verbose?: boolean,
+ /**
+ * Override http_proxy or HTTPS_PROXY
+ * This is a custom property that is not part of the Fetch API specification.
+ */
+ proxy?: string
}
/**
@@ -1239,18 +1255,7 @@ declare function clearTimeout(id?: number): void;
*/
declare function fetch(
url: string,
- init?: RequestInit,
- /**
- * This is a custom property that is not part of the Fetch API specification.
- * It exists mostly as a debugging tool
- */
- bunOnlyOptions?: {
- /**
- * Log the raw HTTP request & response to stdout. This API may be
- * removed in a future version of Bun without notice.
- */
- verbose: boolean;
- },
+ init?: FetchRequestInit
): Promise<Response>;
/**
@@ -1266,18 +1271,7 @@ declare function fetch(
// tslint:disable-next-line:unified-signatures
declare function fetch(
request: Request,
- init?: RequestInit,
- /**
- * This is a custom property that is not part of the Fetch API specification.
- * It exists mostly as a debugging tool
- */
- bunOnlyOptions?: {
- /**
- * Log the raw HTTP request & response to stdout. This API may be
- * removed in a future version of Bun without notice.
- */
- verbose: boolean;
- },
+ init?: RequestInit
): Promise<Response>;
declare function queueMicrotask(callback: (...args: any[]) => void): void;
diff --git a/src/bun.js/webcore/request.zig b/src/bun.js/webcore/request.zig
index 7457b941f..ff6816351 100644
--- a/src/bun.js/webcore/request.zig
+++ b/src/bun.js/webcore/request.zig
@@ -268,12 +268,17 @@ pub const Request = struct {
return this.url.len;
if (this.uws_request) |req| {
- const fmt = ZigURL.HostFormatter{
- .is_https = this.https,
- .host = req.header("host") orelse "",
- };
-
- return this.getProtocol().len + req.url().len + std.fmt.count("{any}", .{fmt});
+ const req_url = req.url();
+ if (req_url.len > 0 and req_url[0] == '/') {
+ if (req.header("host")) |host| {
+ const fmt = ZigURL.HostFormatter{
+ .is_https = this.https,
+ .host = host,
+ };
+ return this.getProtocol().len + req_url.len + std.fmt.count("{any}", .{fmt});
+ }
+ }
+ return req_url.len;
}
return 0;
@@ -291,28 +296,31 @@ pub const Request = struct {
if (this.uws_request) |req| {
const req_url = req.url();
- if (req.header("host")) |host| {
- const fmt = ZigURL.HostFormatter{
- .is_https = this.https,
- .host = host,
- };
- const url = try std.fmt.allocPrint(bun.default_allocator, "{s}{any}{s}", .{
- this.getProtocol(),
- fmt,
- req_url,
- });
- if (comptime Environment.allow_assert) {
- std.debug.assert(this.sizeOfURL() == url.len);
- }
- this.url = url;
- this.url_was_allocated = true;
- } else {
- if (comptime Environment.allow_assert) {
- std.debug.assert(this.sizeOfURL() == req_url.len);
+ if (req_url.len > 0 and req_url[0] == '/') {
+ if (req.header("host")) |host| {
+ const fmt = ZigURL.HostFormatter{
+ .is_https = this.https,
+ .host = host,
+ };
+ const url = try std.fmt.allocPrint(bun.default_allocator, "{s}{any}{s}", .{
+ this.getProtocol(),
+ fmt,
+ req_url,
+ });
+ if (comptime Environment.allow_assert) {
+ std.debug.assert(this.sizeOfURL() == url.len);
+ }
+ this.url = url;
+ this.url_was_allocated = true;
+ return;
}
- this.url = try bun.default_allocator.dupe(u8, req_url);
- this.url_was_allocated = true;
}
+
+ if (comptime Environment.allow_assert) {
+ std.debug.assert(this.sizeOfURL() == req_url.len);
+ }
+ this.url = try bun.default_allocator.dupe(u8, req_url);
+ this.url_was_allocated = true;
}
}
diff --git a/src/bun.js/webcore/response.zig b/src/bun.js/webcore/response.zig
index 7005888bc..22f9a4d15 100644
--- a/src/bun.js/webcore/response.zig
+++ b/src/bun.js/webcore/response.zig
@@ -575,18 +575,18 @@ pub const Fetch = struct {
concurrent_task: JSC.ConcurrentTask = .{},
poll_ref: JSC.PollRef = .{},
- /// Memory is owned by FetchTasklet
- /// We always clone this one
- url_str: []const u8 = "",
+ /// This is url + proxy memory buffer and is owned by FetchTasklet
+ /// We always clone url and proxy (if informed)
+ url_proxy_buffer: []const u8 = "",
pub fn init(_: std.mem.Allocator) anyerror!FetchTasklet {
return FetchTasklet{};
}
fn clearData(this: *FetchTasklet) void {
- if (this.url_str.len > 0) {
- bun.default_allocator.free(bun.constStrToU8(this.url_str));
- this.url_str.len = 0;
+ if (this.url_proxy_buffer.len > 0) {
+ bun.default_allocator.free(this.url_proxy_buffer);
+ this.url_proxy_buffer.len = 0;
}
this.request_headers.entries.deinit(bun.default_allocator);
@@ -723,30 +723,28 @@ pub const Fetch = struct {
.global_this = globalThis,
.request_headers = fetch_options.headers,
.ref = JSC.napi.Ref.create(globalThis, promise),
- .url_str = fetch_options.url.href,
+ .url_proxy_buffer = fetch_options.url_proxy_buffer,
};
if (fetch_tasklet.request_body.store()) |store| {
store.ref();
}
-
- fetch_tasklet.http.?.* = HTTPClient.AsyncHTTP.init(
- allocator,
- fetch_options.method,
- fetch_options.url,
- fetch_options.headers.entries,
- fetch_options.headers.buf.items,
- &fetch_tasklet.response_buffer,
- fetch_tasklet.request_body.slice(),
- fetch_options.timeout,
- HTTPClient.HTTPClientResult.Callback.New(
- *FetchTasklet,
- FetchTasklet.callback,
- ).init(
- fetch_tasklet,
- ),
- jsc_vm.bundler.env.getHttpProxy(fetch_options.url)
- );
+
+ var proxy: ?ZigURL = null;
+ if (fetch_options.proxy) |proxy_opt| {
+ if (!proxy_opt.isEmpty()) { //if is empty just ignore proxy
+ proxy = fetch_options.proxy orelse jsc_vm.bundler.env.getHttpProxy(fetch_options.url);
+ }
+ } else {
+ proxy = jsc_vm.bundler.env.getHttpProxy(fetch_options.url);
+ }
+
+ fetch_tasklet.http.?.* = HTTPClient.AsyncHTTP.init(allocator, fetch_options.method, fetch_options.url, fetch_options.headers.entries, fetch_options.headers.buf.items, &fetch_tasklet.response_buffer, fetch_tasklet.request_body.slice(), fetch_options.timeout, HTTPClient.HTTPClientResult.Callback.New(
+ *FetchTasklet,
+ FetchTasklet.callback,
+ ).init(
+ fetch_tasklet,
+ ), proxy);
if (!fetch_options.follow_redirects) {
fetch_tasklet.http.?.client.remaining_redirect_count = 0;
@@ -758,17 +756,7 @@ pub const Fetch = struct {
return fetch_tasklet;
}
- const FetchOptions = struct {
- method: Method,
- headers: Headers,
- body: AnyBlob,
- timeout: usize,
- disable_timeout: bool,
- disable_keepalive: bool,
- url: ZigURL,
- verbose: bool = false,
- follow_redirects: bool = true,
- };
+ const FetchOptions = struct { method: Method, headers: Headers, body: AnyBlob, timeout: usize, disable_timeout: bool, disable_keepalive: bool, url: ZigURL, verbose: bool = false, follow_redirects: bool = true, proxy: ?ZigURL = null, url_proxy_buffer: []const u8 = "" };
pub fn queue(
allocator: std.mem.Allocator,
@@ -828,27 +816,129 @@ pub const Fetch = struct {
var disable_timeout = false;
var disable_keepalive = false;
var verbose = false;
+ var proxy: ?ZigURL = null;
var follow_redirects = true;
+ var url_proxy_buffer: []const u8 = undefined;
+
if (first_arg.as(Request)) |request| {
- url = ZigURL.parse(getAllocator(ctx).dupe(u8, request.url) catch unreachable);
- method = request.method;
- if (request.headers) |head| {
- headers = Headers.from(head, bun.default_allocator) catch unreachable;
- }
- body = request.body.useAsAnyBlob();
- } else if (first_arg.toStringOrNull(globalThis)) |jsstring| {
- var url_slice = jsstring.toSlice(globalThis, bun.default_allocator).cloneIfNeeded(bun.default_allocator) catch {
- JSC.JSError(bun.default_allocator, "Out of memory", .{}, ctx, exception);
- return null;
- };
+ if (arguments.len >= 2) {
+ const options = arguments[1].?.value();
+ if (options.isObject() or options.jsType() == .DOMWrapper) {
+ if (options.fastGet(ctx.ptr(), .method)) |method_| {
+ var slice_ = method_.toSlice(ctx.ptr(), getAllocator(ctx));
+ defer slice_.deinit();
+ method = Method.which(slice_.slice()) orelse .GET;
+ } else {
+ method = request.method;
+ }
- if (url_slice.len == 0) {
- const fetch_error = fetch_error_blank_url;
- return JSPromise.rejectedPromiseValue(globalThis, ZigString.init(fetch_error).toErrorInstance(globalThis)).asRef();
- }
+ if (options.fastGet(ctx.ptr(), .headers)) |headers_| {
+ if (headers_.as(FetchHeaders)) |headers__| {
+ headers = Headers.from(headers__, bun.default_allocator) catch unreachable;
+ // TODO: make this one pass
+ } else if (FetchHeaders.createFromJS(ctx.ptr(), headers_)) |headers__| {
+ headers = Headers.from(headers__, bun.default_allocator) catch unreachable;
+ headers__.deref();
+ } else if (request.headers) |head| {
+ headers = Headers.from(head, bun.default_allocator) catch unreachable;
+ }
+ } else if (request.headers) |head| {
+ headers = Headers.from(head, bun.default_allocator) catch unreachable;
+ }
- url = ZigURL.parse(url_slice.slice());
+ if (options.fastGet(ctx.ptr(), .body)) |body__| {
+ if (Body.Value.fromJS(ctx.ptr(), body__)) |body_const| {
+ var body_value = body_const;
+ // TODO: buffer ReadableStream?
+ // we have to explicitly check for InternalBlob
+ body = body_value.useAsAnyBlob();
+ } else {
+ // an error was thrown
+ return JSC.JSValue.jsUndefined().asObjectRef();
+ }
+ } else {
+ body = request.body.useAsAnyBlob();
+ }
+ if (options.get(ctx, "timeout")) |timeout_value| {
+ if (timeout_value.isBoolean()) {
+ disable_timeout = !timeout_value.asBoolean();
+ } else if (timeout_value.isNumber()) {
+ disable_timeout = timeout_value.to(i32) == 0;
+ }
+ }
+
+ if (options.get(ctx, "redirect")) |redirect_value| {
+ if (redirect_value.getZigString(globalThis).eqlComptime("manual")) {
+ follow_redirects = false;
+ }
+ }
+
+ if (options.get(ctx, "keepalive")) |keepalive_value| {
+ if (keepalive_value.isBoolean()) {
+ disable_keepalive = !keepalive_value.asBoolean();
+ } else if (keepalive_value.isNumber()) {
+ disable_keepalive = keepalive_value.to(i32) == 0;
+ }
+ }
+ if (options.get(globalThis, "verbose")) |verb| {
+ verbose = verb.toBoolean();
+ }
+ if (options.get(globalThis, "proxy")) |proxy_arg| {
+ if (!proxy_arg.isUndefined()) {
+ if (proxy_arg.isNull()) {
+ //if null we add an empty proxy to be ignore all proxy
+ //only allocate url
+ url = ZigURL.parse(getAllocator(ctx).dupe(u8, request.url) catch unreachable);
+ url_proxy_buffer = url.href;
+ proxy = ZigURL{}; //empty proxy
+ } else {
+ var proxy_str = proxy_arg.toStringOrNull(globalThis) orelse return null;
+ // proxy + url 1 allocation
+ var proxy_url_zig = proxy_str.getZigString(globalThis);
+
+ // ignore proxy if it is len = 0
+ if (proxy_url_zig.len == 0) {
+ url = ZigURL.parse(getAllocator(ctx).dupe(u8, request.url) catch unreachable);
+ url_proxy_buffer = url.href;
+ } else {
+ var total_len = request.url.len + proxy_url_zig.len;
+
+ const allocator = getAllocator(ctx);
+
+ var buffer = allocator.alloc(u8, total_len) catch {
+ JSC.JSError(bun.default_allocator, "Out of memory", .{}, ctx, exception);
+ return null;
+ };
+
+ var url_slice = buffer[0..request.url.len];
+ std.mem.copy(u8, url_slice, request.url);
+ var proxy_url_slice = buffer[request.url.len..buffer.len];
+ std.mem.copy(u8, proxy_url_slice, proxy_url_zig.ptr[0..proxy_url_zig.len]);
+
+ url = ZigURL.parse(url_slice);
+ proxy = ZigURL.parse(proxy_url_slice);
+ url_proxy_buffer = buffer;
+ }
+ }
+ }
+ } else {
+ // no proxy only url
+ url = ZigURL.parse(getAllocator(ctx).dupe(u8, request.url) catch unreachable);
+ url_proxy_buffer = url.href;
+ }
+ }
+ } else {
+ method = request.method;
+ if (request.headers) |head| {
+ headers = Headers.from(head, bun.default_allocator) catch unreachable;
+ }
+ body = request.body.useAsAnyBlob();
+ // no proxy only url
+ url = ZigURL.parse(getAllocator(ctx).dupe(u8, request.url) catch unreachable);
+ url_proxy_buffer = url.href;
+ }
+ } else if (first_arg.toStringOrNull(globalThis)) |jsstring| {
if (arguments.len >= 2) {
const options = arguments[1].?.value();
if (options.isObject() or options.jsType() == .DOMWrapper) {
@@ -901,17 +991,108 @@ pub const Fetch = struct {
disable_keepalive = keepalive_value.to(i32) == 0;
}
}
- }
- // non-standard debug things
- if (arguments.len == 3) {
- const special = arguments[2].?.value();
- if (!special.isEmptyOrUndefinedOrNull() and special.isObject()) {
- if (special.get(globalThis, "verbose")) |verb| {
- verbose = verb.toBoolean();
+ if (options.get(globalThis, "verbose")) |verb| {
+ verbose = verb.toBoolean();
+ }
+ if (options.get(globalThis, "proxy")) |proxy_arg| {
+ if (!proxy_arg.isUndefined()) {
+ var proxy_str = proxy_arg.toStringOrNull(globalThis) orelse return null;
+ // proxy + url 1 allocation
+ var url_zig = proxy_str.getZigString(globalThis);
+
+ if (url_zig.len == 0) {
+ const fetch_error = fetch_error_blank_url;
+ return JSPromise.rejectedPromiseValue(globalThis, ZigString.init(fetch_error).toErrorInstance(globalThis)).asRef();
+ }
+
+ if (proxy_arg.isNull()) {
+ //if null we add an empty proxy to be ignore all proxy
+ //only allocate url
+ const url_slice = url_zig.toSlice(bun.default_allocator).cloneIfNeeded(bun.default_allocator) catch {
+ JSC.JSError(bun.default_allocator, "Out of memory", .{}, ctx, exception);
+ return null;
+ };
+ url = ZigURL.parse(url_slice.slice());
+ url_proxy_buffer = url.href;
+ proxy = ZigURL{}; //empty proxy
+
+ } else {
+ var proxy_url_zig = proxy_str.getZigString(globalThis);
+
+ // proxy is actual 0 len so ignores it
+ if (proxy_url_zig.len == 0) {
+ const url_slice = url_zig.toSlice(bun.default_allocator).cloneIfNeeded(bun.default_allocator) catch {
+ JSC.JSError(bun.default_allocator, "Out of memory", .{}, ctx, exception);
+ return null;
+ };
+ url = ZigURL.parse(url_slice.slice());
+ url_proxy_buffer = url.href;
+ } else {
+ const allocator = getAllocator(ctx);
+
+ var total_len = url_zig.len + proxy_url_zig.len;
+ var buffer = allocator.alloc(u8, total_len) catch {
+ JSC.JSError(bun.default_allocator, "Out of memory", .{}, ctx, exception);
+ return null;
+ };
+
+ var url_slice = buffer[0..url_zig.len];
+
+ std.mem.copy(u8, url_slice, url_zig.ptr[0..url_zig.len]);
+ var proxy_url_slice = buffer[url_zig.len..buffer.len];
+ std.mem.copy(u8, proxy_url_slice, proxy_url_zig.ptr[0..proxy_url_zig.len]);
+
+ url = ZigURL.parse(url_slice);
+ proxy = ZigURL.parse(proxy_url_slice);
+ url_proxy_buffer = buffer;
+ }
+ }
+ } else {
+ //no proxy only url
+ var url_slice = jsstring.toSlice(globalThis, bun.default_allocator).cloneIfNeeded(bun.default_allocator) catch {
+ JSC.JSError(bun.default_allocator, "Out of memory", .{}, ctx, exception);
+ return null;
+ };
+
+ if (url_slice.len == 0) {
+ const fetch_error = fetch_error_blank_url;
+ return JSPromise.rejectedPromiseValue(globalThis, ZigString.init(fetch_error).toErrorInstance(globalThis)).asRef();
+ }
+
+ url = ZigURL.parse(url_slice.slice());
+ url_proxy_buffer = url.href;
+ }
+ } else {
+ //no proxy only url
+ var url_slice = jsstring.toSlice(globalThis, bun.default_allocator).cloneIfNeeded(bun.default_allocator) catch {
+ JSC.JSError(bun.default_allocator, "Out of memory", .{}, ctx, exception);
+ return null;
+ };
+
+ if (url_slice.len == 0) {
+ const fetch_error = fetch_error_blank_url;
+ return JSPromise.rejectedPromiseValue(globalThis, ZigString.init(fetch_error).toErrorInstance(globalThis)).asRef();
}
+
+ url = ZigURL.parse(url_slice.slice());
+ url_proxy_buffer = url.href;
}
}
+ } else {
+ //no proxy only url
+ var url_slice = jsstring.toSlice(globalThis, bun.default_allocator).cloneIfNeeded(bun.default_allocator) catch {
+ JSC.JSError(bun.default_allocator, "Out of memory", .{}, ctx, exception);
+ return null;
+ };
+
+ if (url_slice.len == 0) {
+ const fetch_error = fetch_error_blank_url;
+ return JSPromise.rejectedPromiseValue(globalThis, ZigString.init(fetch_error).toErrorInstance(globalThis)).asRef();
+ }
+
+ url = ZigURL.parse(url_slice.slice());
+ url_proxy_buffer = url.href;
}
} else {
const fetch_error = fetch_type_error_strings.get(js.JSValueGetType(ctx, arguments[0]));
@@ -925,19 +1106,9 @@ pub const Fetch = struct {
_ = FetchTasklet.queue(
default_allocator,
globalThis,
- .{
- .method = method,
- .url = url,
- .headers = headers orelse Headers{
- .allocator = bun.default_allocator,
- },
- .body = body,
- .timeout = std.time.ns_per_hour,
- .disable_keepalive = disable_keepalive,
- .disable_timeout = disable_timeout,
- .follow_redirects = follow_redirects,
- .verbose = verbose,
- },
+ .{ .method = method, .url = url, .headers = headers orelse Headers{
+ .allocator = bun.default_allocator,
+ }, .body = body, .timeout = std.time.ns_per_hour, .disable_keepalive = disable_keepalive, .disable_timeout = disable_timeout, .follow_redirects = follow_redirects, .verbose = verbose, .proxy = proxy, .url_proxy_buffer = url_proxy_buffer },
JSC.JSValue.fromRef(deferred_promise),
) catch unreachable;
return deferred_promise;
diff --git a/test/bun.js/fetch-gzip.test.ts b/test/bun.js/fetch-gzip.test.ts
index 6dc8d2a7f..bdfc48f53 100644
--- a/test/bun.js/fetch-gzip.test.ts
+++ b/test/bun.js/fetch-gzip.test.ts
@@ -24,7 +24,6 @@ it("fetch() with a buffered gzip response works (one chunk)", async () => {
const res = await fetch(
`http://${server.hostname}:${server.port}`,
- {},
{ verbose: true },
);
gcTick(true);
@@ -64,7 +63,6 @@ it("fetch() with a redirect that returns a buffered gzip response works (one chu
const res = await fetch(
`http://${server.hostname}:${server.port}/hey`,
- {},
{ verbose: true },
);
const arrayBuffer = await res.arrayBuffer();
@@ -100,7 +98,6 @@ it("fetch() with a protocol-relative redirect that returns a buffered gzip respo
const res = await fetch(
`http://${server.hostname}:${server.port}/hey`,
- {},
{ verbose: true },
);
expect(res.url).toBe(`http://${server.hostname}:${server.port}/redirect`);
diff --git a/test/bun.js/fetch.test.js b/test/bun.js/fetch.test.js
index 5d0ca4854..28a7c109b 100644
--- a/test/bun.js/fetch.test.js
+++ b/test/bun.js/fetch.test.js
@@ -127,7 +127,7 @@ describe("fetch", () => {
}
it(name, async () => {
gc();
- const response = await fetch(url, {}, { verbose: true });
+ const response = await fetch(url, { verbose: true });
gc();
const text = await response.text();
gc();
diff --git a/test/bun.js/proxy.test.js b/test/bun.js/proxy.test.js
new file mode 100644
index 000000000..32b21f7e8
--- /dev/null
+++ b/test/bun.js/proxy.test.js
@@ -0,0 +1,60 @@
+import { afterAll, beforeAll, describe, expect, it } from "bun:test";
+import { gc } from "./gc";
+
+let proxy, server;
+
+// TODO: Proxy with TLS requests
+
+beforeAll(()=> {
+ proxy = Bun.serve({
+ async fetch(request) {
+ // if is not an proxy connection just drop it
+ if (!request.headers.has("proxy-connection")) {
+ return new Response("Bad Request", { status: 400 });
+ }
+
+ // simple http proxy
+ if (request.url.startsWith("http://")) {
+ return await fetch(request.url, { method: request.method, body: await request.text() });
+ }
+
+ // no TLS support here
+ return new Response("Bad Request", { status: 400 });
+
+ },
+ port: 54321,
+ });
+ server = Bun.serve({
+ async fetch(request) {
+ if (request.method === "POST"){
+ const text = await request.text();
+ return new Response(text,{ status: 200 });
+ }
+ return new Response("Hello, World",{ status: 200 });
+ },
+ port: 54322,
+ });
+});
+
+afterAll(() => {
+ server.stop();
+ proxy.stop();
+});
+
+describe("proxy", () => {
+ const requests = [
+ [ new Request("http://localhost:54322"), "fetch() GET with non-TLS Proxy", "http://localhost:54321"],
+ [ new Request("http://localhost:54322", { method: "POST", body: "Hello, World" }), "fetch() POST with non-TLS Proxy", "http://localhost:54321"]
+ ];
+ for (let [ request, name, proxy ] of requests) {
+ gc();
+ it(name, async () => {
+ gc();
+ const response = await fetch(request, { verbose: true, proxy });
+ gc();
+ const text = await response.text();
+ gc();
+ expect(text).toBe("Hello, World");
+ });
+ }
+}); \ No newline at end of file
diff --git a/test/bun.js/serve.test.ts b/test/bun.js/serve.test.ts
index 1961f58ad..86c5585ce 100644
--- a/test/bun.js/serve.test.ts
+++ b/test/bun.js/serve.test.ts
@@ -905,7 +905,6 @@ describe("should support Content-Range with Bun.file()", () => {
await getServer(async (server) => {
const response = await fetch(
`http://${server.hostname}:${server.port}/?start=${start}&end=${end}`,
- {},
{ verbose: true },
);
expect(await response.arrayBuffer()).toEqual(