Skip to content

Commit

Permalink
fix: resolves #2176
Browse files Browse the repository at this point in the history
  • Loading branch information
jxom committed Apr 23, 2024
1 parent 6fc8f3f commit cfff94c
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 7 deletions.
5 changes: 5 additions & 0 deletions .changeset/modern-rockets-look.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"viem": patch
---

Added workaround to parse a raw text response into JSON if an RPC provider does not set `Content-Type: application/json` as a response header.
48 changes: 42 additions & 6 deletions src/utils/rpc/http.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,42 @@ describe('request', () => {
await wait(500)
})

test('no application/json header', async () => {
const server = await createHttpServer((_, res) => {
res.end(JSON.stringify({ result: '0x1' }))
})
const client = getHttpRpcClient(server.url)
expect(
await client.request({
body: { method: 'web3_clientVersion' },
}),
).toMatchInlineSnapshot(`
{
"result": "0x1",
}
`)
await server.close()

const server2 = await createHttpServer((_, res) => {
res.end('bogus')
})
const client2 = getHttpRpcClient(server2.url)
await expect(() =>

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 2` mismatched Anvil log output ======================================= Block Number: 16280865 Block Hash: 0x8a7e2f21441fe03d2784815fe8b673eb5e334cf682b7e1b22b7aeacd5ef36d4f Block Time: "Wed, 28 Dec 2022 04:11:23 +0000" Block Number: 16280866 Block Hash: 0xb116a0f22b0c2d17e06290066ae75f942c21700347c438e06df6d4a711513993 Block Time: "Wed, 28 Dec 2022 04:11:24 +0000" Block Number: 16280867 Block Hash: 0x6469156bfcfe93919ddb2c27e22025cc5ae328fd6feb45d29b5d8d4eb3fe65a9 Block Time: "Wed, 28 Dec 2022 04:11:25 +0000" Block Number: 16280868 Block Hash: 0x1fce126b4cfa62c455c92b362314dda3accb3f2d10a5c28ec4ca37dfae61280f Block Time: "Wed, 28 Dec 2022 04:11:26 +0000" Block Number: 16280869 Block Hash: 0x9ef563824fdae38993c9c6818ff6dd860a87bca5f9f6dd1ba52d648c42e1bf5b Block Time: "Wed, 28 Dec 2022 04:11:27 +0000" Block Number: 16280870 Block Hash: 0x30b69440fdb87ea0b873db2a1ec1bb46c37e0ea702fe02bf5f0571f1a6c491d2 Block Time: "Wed, 28 Dec 2022 04:11:28 +0000" eth_blockNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber evm_setIntervalMining evm_setIntervalMining evm_setIntervalMining evm_setIntervalMining Anvil log output ======================================= Block Number: 16280865 Block Hash: 0x8a7e2f21441fe03d2784815fe8b673eb5e334cf682b7e1b22b7aeacd5ef36d4f Block Time: "Wed, 28 Dec 2022 04:11:23 +0000" Block Number: 16280866 Block Hash: 0xb116a0f22b0c2d17e06290066ae75f942c21700347c438e06df6d4a711513993 Block Time: "Wed, 28 Dec 2022 04:11:24 +0000" Block Number: 16280867 Block Hash: 0x6469156bfcfe93919ddb2c27e22025cc5ae328fd6feb45d29b5d8d4eb3fe65a9 Block Time: "Wed, 28 Dec 2022 04:11:25 +0000" Block Number: 16280868 Block Hash: 0x1fce126b4cfa62c455c92b362314dda3accb3f2d10a5c28ec4ca37dfae61280f Block Time: "Wed, 28 Dec 2022 04:11:26 +0000" Block Number: 16280869 Block Hash: 0x9ef563824fdae38993c9c6818ff6dd860a87bca5f9f6dd1ba52d648c42e1bf5b Block Time: "Wed, 28 Dec 2022 04:11:27 +0000" Block Number: 16280870 Block Hash: 0x30b69440fdb87ea0b873db2a1ec1bb46c37e0ea702fe02bf5f0571f1a6c491d2 Block Time: "Wed, 28 Dec 2022 04:11:28 +0000" eth_blockNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_get

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 4` mismatched - Expected + Received [HttpRequestError: HTTP request failed. URL: http://localhost Request body: {"method":"web3_clientVersion"} - Details: Unexpected token 'b', "bogus" is not valid JSON + Details: Unexpected token b in JSON at position 0 Version: viem@1.0.2] ❯ src/utils/rpc/http.test.ts:155:5

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 6` mismatched - Expected + Received [HttpRequestError: HTTP request failed. URL: http://localhost Request body: {"method":"web3_clientVersion"} - Details: Unexpected token 'b', "bogus" is not valid JSON + Details: Unexpected token b in JSON at position 0 Version: viem@1.0.2] ❯ src/utils/rpc/http.test.ts:155:5

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 8` mismatched - Expected + Received [HttpRequestError: HTTP request failed. URL: http://localhost Request body: {"method":"web3_clientVersion"} - Details: Unexpected token 'b', "bogus" is not valid JSON + Details: Unexpected token b in JSON at position 0 Version: viem@1.0.2] ❯ src/utils/rpc/http.test.ts:155:5

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 2` mismatched Anvil log output ======================================= Block Number: 16280862 Block Hash: 0x2cf39e9420d92df3bbcf7d820ecadd06b66e1a36eb612a5fc81467af4ef2ea94 Block Time: "Wed, 28 Dec 2022 04:11:21 +0000" Block Number: 16280863 Block Hash: 0x60be2e93c8b09e28752d98f4584ac1fbb6ca49bf7833a055221b765c42298b0d Block Time: "Wed, 28 Dec 2022 04:11:22 +0000" Block Number: 16280864 Block Hash: 0xa34d2f0f4e0c504cdba27f234d8c92280687c644a58b67d59d907823477954a7 Block Time: "Wed, 28 Dec 2022 04:11:23 +0000" Block Number: 16280865 Block Hash: 0x81f05c538892956ac736bbace852494f3518dcdbf359c5ee9ff2fc46d95b42f5 Block Time: "Wed, 28 Dec 2022 04:11:24 +0000" Block Number: 16280866 Block Hash: 0xacf45cd6ffe6ddf481d5e7b68e2f641085fa35981909737077b3f748b45e38fc Block Time: "Wed, 28 Dec 2022 04:11:25 +0000" Block Number: 16280867 Block Hash: 0x04d483a7fb4d2372b905865270ee60310d47dd7c23509ac1197ffdd622ede3d8 Block Time: "Wed, 28 Dec 2022 04:11:26 +0000" Block Number: 16280868 Block Hash: 0x9da00e6ca630bb4f5a4fc4a8d8dd9e33831db931fdd756c8fe041e17f2526d1f Block Time: "Wed, 28 Dec 2022 04:11:27 +0000" Block Number: 16280869 Block Hash: 0xd2eb2514d2b0696d431a7a05e87810b93e3cda390fccdec8e9cc1ef5ccb344d1 Block Time: "Wed, 28 Dec 2022 04:11:28 +0000" Block Number: 16280870 Block Hash: 0xa9f9f049689d500435481519a1f2bcb044c9e2e680d9b2b6ee1454631ef3e6e8 Block Time: "Wed, 28 Dec 2022 04:11:29 +0000" eth_blockNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber evm_setIntervalMining evm_setIntervalMining evm_setIntervalMining evm_setIntervalMining Anvil log output ======================================= Block Number: 16280862 Block Hash: 0x2cf39e9420d92df3bbcf7d820ecadd06b66e1a36eb612a5fc81467af4ef2ea94 Block Time: "Wed, 28 Dec 2022 04:11:21 +0000" Block Number: 16280863 Block Hash: 0x60be2e93c8b09e28752d98f4584ac1fbb6ca49bf7833a055221b765c42298b0d Block Time: "Wed, 28 Dec 2022 04:11:22 +0000" Block Number: 16280864 Block Hash: 0xa34d2f0f4e0c504cdba27f234d8c92280687c644a58b67d59d907823477954a7 Block Time: "Wed, 28 Dec 2022 04:11:23 +0000" Block Number: 16280865 Block Hash: 0x81f05c538892956ac736bbace852494f3518dcdbf359c5ee9ff2fc46d95b42f5 Block Time: "Wed, 28 Dec 2022 04:11:24 +0000" Block Number: 16280866 Block Hash: 0xacf45cd6ffe6ddf481d5e7b68e2f641085fa35981909737077b3f748b45e38fc Block Time: "Wed, 28 Dec 2022 04:11:25 +0000" Block Number: 16280867 Block Hash: 0x04d483a7fb4d2372b905865270ee60310d47dd7c23509ac1197ffdd622ede3d8 Block Time: "Wed, 28 Dec 2022 04:11:26 +0000" Block Number: 16280868 Block Hash: 0x9da00e6ca630bb4f5a4fc4a8d8dd9e33831db931fdd756c8fe041e17f2526d1f Block Time: "Wed, 28 Dec 2022 04:11:27 +0000" Block Number: 16280869 Block Hash: 0xd2eb2514d2b0696d431a7a05e87810b93e3cda390fccdec8e9cc1ef5ccb344d1 Block Time: "Wed, 2

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 4` mismatched - Expected + Received [HttpRequestError: HTTP request failed. URL: http://localhost Request body: {"method":"web3_clientVersion"} - Details: Unexpected token 'b', "bogus" is not valid JSON + Details: Unexpected token b in JSON at position 0 Version: viem@1.0.2] ❯ src/utils/rpc/http.test.ts:155:5

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 6` mismatched - Expected + Received [HttpRequestError: HTTP request failed. URL: http://localhost Request body: {"method":"web3_clientVersion"} - Details: Unexpected token 'b', "bogus" is not valid JSON + Details: Unexpected token b in JSON at position 0 Version: viem@1.0.2] ❯ src/utils/rpc/http.test.ts:155:5

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 8` mismatched - Expected + Received [HttpRequestError: HTTP request failed. URL: http://localhost Request body: {"method":"web3_clientVersion"} - Details: Unexpected token 'b', "bogus" is not valid JSON + Details: Unexpected token b in JSON at position 0 Version: viem@1.0.2] ❯ src/utils/rpc/http.test.ts:155:5

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 2` mismatched Anvil log output ======================================= Block Number: 16280861 Block Hash: 0x6305120a15b8ac1d191a425e44e1fe62c253e48d04feed286b9e23467f04d4c4 Block Time: "Wed, 28 Dec 2022 04:11:19 +0000" Block Number: 16280862 Block Hash: 0x72fe5d7707c898882e8c80fef47bc83252b04aa1faaaa6cec33baa4315b9f5d8 Block Time: "Wed, 28 Dec 2022 04:11:20 +0000" Block Number: 16280863 Block Hash: 0xb81d21fa7547d79bc8bd015309e09acffba79c6754fc03e3181e32ff39cb3b69 Block Time: "Wed, 28 Dec 2022 04:11:21 +0000" Block Number: 16280864 Block Hash: 0x932043b7076740feba67d42ac06fe375613017c81f622327c998f96f9a54fdc9 Block Time: "Wed, 28 Dec 2022 04:11:22 +0000" Block Number: 16280865 Block Hash: 0x8a7e2f21441fe03d2784815fe8b673eb5e334cf682b7e1b22b7aeacd5ef36d4f Block Time: "Wed, 28 Dec 2022 04:11:23 +0000" Block Number: 16280866 Block Hash: 0xb116a0f22b0c2d17e06290066ae75f942c21700347c438e06df6d4a711513993 Block Time: "Wed, 28 Dec 2022 04:11:24 +0000" Block Number: 16280867 Block Hash: 0x6469156bfcfe93919ddb2c27e22025cc5ae328fd6feb45d29b5d8d4eb3fe65a9 Block Time: "Wed, 28 Dec 2022 04:11:25 +0000" Block Number: 16280868 Block Hash: 0x1fce126b4cfa62c455c92b362314dda3accb3f2d10a5c28ec4ca37dfae61280f Block Time: "Wed, 28 Dec 2022 04:11:26 +0000" Block Number: 16280869 Block Hash: 0x9ef563824fdae38993c9c6818ff6dd860a87bca5f9f6dd1ba52d648c42e1bf5b Block Time: "Wed, 28 Dec 2022 04:11:27 +0000" Block Number: 16280870 Block Hash: 0x30b69440fdb87ea0b873db2a1ec1bb46c37e0ea702fe02bf5f0571f1a6c491d2 Block Time: "Wed, 28 Dec 2022 04:11:28 +0000" eth_blockNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber eth_getBlockByNumber evm_setIntervalMining evm_setIntervalMining evm_setIntervalMining evm_setIntervalMining Anvil log output ======================================= Block Number: 16280861 Block Hash: 0x6305120a15b8ac1d191a425e44e1fe62c253e48d04feed286b9e23467f04d4c4 Block Time: "Wed, 28 Dec 2022 04:11:19 +0000" Block Number: 16280862 Block Hash: 0x72fe5d7707c898882e8c80fef47bc83252b04aa1faaaa6cec33baa4315b9f5d8 Block Time: "Wed, 28 Dec 2022 04:11:20 +0000" Block Number: 16280863 Block Hash: 0xb81d21fa7547d79bc8bd015309e09acffba79c6754fc03e3181e32ff39cb3b69 Block Time: "Wed, 28 Dec 2022 04:11:21 +0000" Block Number: 16280864 Block Hash: 0x932043b7076740feba67d42ac06fe375613017c81f622327c998f96f9a54fdc9 Block Time: "Wed, 28 Dec 2022 04:11:22 +0000" Block Number: 16280865 Block Hash: 0x8a7e2f21441fe03d2784815fe8b673eb5e334cf682b7e1b22b7aeacd5ef36d4f Block Time: "Wed, 28 Dec 2022 04:11:23 +0000" Block Number: 16280866 Block Hash: 0xb116a0f22b0c2d17e06290066ae75f942c21700347c438e06df6d4a711513993 Block Time: "Wed, 28 Dec 2022 04:11:24 +0000" Block Number: 16280867 Block Hash: 0x6469156bfcfe93919ddb2c27e22025cc5ae328fd6feb45d29b5d8d4eb3fe65a9 Block Time: "Wed, 28 De

Check failure on line 155 in src/utils/rpc/http.test.ts

View workflow job for this annotation

GitHub Actions / Verify / Test (http, 2, 3)

src/utils/rpc/http.test.ts > request > no application/json header

Error: Snapshot `request > no application/json header 4` mismatched - Expected + Received [HttpRequestError: HTTP request failed. URL: http://localhost Request body: {"method":"web3_clientVersion"} - Details: Unexpected token 'b', "bogus" is not valid JSON + Details: Unexpected token b in JSON at position 0 Version: viem@1.0.2] ❯ src/utils/rpc/http.test.ts:155:5
client2.request({
body: { method: 'web3_clientVersion' },
}),
).rejects.toMatchInlineSnapshot(`
[HttpRequestError: HTTP request failed.
URL: http://localhost
Request body: {"method":"web3_clientVersion"}
Details: Unexpected token 'b', "bogus" is not valid JSON
Version: viem@1.0.2]
`)
await server2.close()
})

test('fetchOptions', async () => {
let headers: IncomingHttpHeaders = {}
const server = await createHttpServer((req, res) => {
Expand Down Expand Up @@ -335,12 +371,12 @@ describe('http (batch)', () => {
).toMatchInlineSnapshot(`
[
{
"id": 86,
"id": 89,
"jsonrpc": "2.0",
"result": "anvil/v0.2.0",
},
{
"id": 87,
"id": 90,
"jsonrpc": "2.0",
"result": "anvil/v0.2.0",
},
Expand All @@ -361,7 +397,7 @@ describe('http (batch)', () => {
).toMatchInlineSnapshot(`
[
{
"id": 89,
"id": 92,
"jsonrpc": "2.0",
"result": "anvil/v0.2.0",
},
Expand All @@ -370,7 +406,7 @@ describe('http (batch)', () => {
"code": -32602,
"message": "Odd number of digits",
},
"id": 90,
"id": 93,
"jsonrpc": "2.0",
},
]
Expand All @@ -387,7 +423,7 @@ describe('http (batch)', () => {
).toMatchInlineSnapshot(`
[
{
"id": 92,
"id": 95,
"jsonrpc": "2.0",
"result": "anvil/v0.2.0",
},
Expand All @@ -396,7 +432,7 @@ describe('http (batch)', () => {
"code": -32601,
"message": "Method not found",
},
"id": 93,
"id": 96,
"jsonrpc": "2.0",
},
]
Expand Down
5 changes: 4 additions & 1 deletion src/utils/rpc/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,10 @@ export function getHttpRpcClient(
response.headers.get('Content-Type')?.startsWith('application/json')
)
data = await response.json()
else data = await response.text()
else {
data = await response.text()
data = JSON.parse(data || '{}')
}

if (!response.ok) {
throw new HttpRequestError({
Expand Down

0 comments on commit cfff94c

Please sign in to comment.