diff --git a/packages/providers/src.ts/base-provider.ts b/packages/providers/src.ts/base-provider.ts index e352a4536e..68d2682db1 100644 --- a/packages/providers/src.ts/base-provider.ts +++ b/packages/providers/src.ts/base-provider.ts @@ -404,6 +404,8 @@ export class Resolver implements EnsResolver { async getAvatar(): Promise { const linkage: Array<{ type: string, content: string }> = [ ]; try { + // test data for ricmoo.eth + //const avatar = "eip155:1/erc721:0x265385c7f4132228A0d54EB1A9e7460b91c0cC68/29233"; const avatar = await this.getText("avatar"); if (avatar == null) { return null; } @@ -475,7 +477,7 @@ export class Resolver implements EnsResolver { const metadata = await fetchJson(metadataUrl); // Pull the image URL out - if (!metadata || typeof(metadata.image) !== "string" || !metadata.image.match(/^https:\/\//i)) { + if (!metadata || typeof(metadata.image) !== "string" || !metadata.image.match(/^(https:\/\/|data:)/i)) { return null; } linkage.push({ type: "metadata", content: JSON.stringify(metadata) }); diff --git a/packages/web/src.ts/index.ts b/packages/web/src.ts/index.ts index 9f72c7ed81..afd0e9b508 100644 --- a/packages/web/src.ts/index.ts +++ b/packages/web/src.ts/index.ts @@ -1,6 +1,6 @@ "use strict"; -import { encode as base64Encode } from "@ethersproject/base64"; +import { decode as base64Decode, encode as base64Encode } from "@ethersproject/base64"; import { hexlify, isBytesLike } from "@ethersproject/bytes"; import { shallowCopy } from "@ethersproject/properties"; import { toUtf8Bytes, toUtf8String } from "@ethersproject/strings"; @@ -150,6 +150,33 @@ export function _fetchData(connection: string | ConnectionInfo, }; } } + const reData = new RegExp("^data:([a-z0-9-]+/[a-z0-9-]+);base64,(.*)$", "i"); + const dataMatch = ((url) ? url.match(reData): null); + if (dataMatch) { + try { + const response = { + statusCode: 200, + statusMessage: "OK", + headers: { "content-type": dataMatch[1] }, + body: base64Decode(dataMatch[2]) + }; + + let result: T = response.body; + if (processFunc) { + result = processFunc(response.body, response); + } + return Promise.resolve(result); + + } catch (error) { + logger.throwError("processing response error", Logger.errors.SERVER_ERROR, { + body: bodyify(dataMatch[1], dataMatch[2]), + error: error, + requestBody: null, + requestMethod: "GET", + url: url + }); + } + } if (body) { options.method = "POST";