From 30172b92e62eba16e1d8a51babd83ad5b76a81ec Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 10 Apr 2019 15:07:21 +0900 Subject: WebFingerリクエストで Proxy, Keep-Alive などをサポート #4658 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: MeiMei --- src/remote/resolve-user.ts | 4 ++-- src/remote/webfinger.ts | 42 ++++++++++++++++++++++++++++++++---------- 2 files changed, 34 insertions(+), 12 deletions(-) (limited to 'src/remote') diff --git a/src/remote/resolve-user.ts b/src/remote/resolve-user.ts index e6a11bc0da..6a8ce45c91 100644 --- a/src/remote/resolve-user.ts +++ b/src/remote/resolve-user.ts @@ -73,8 +73,8 @@ export async function resolveUser(username: string, host: string, option?: any, async function resolveSelf(acctLower: string) { logger.info(`WebFinger for ${chalk.yellow(acctLower)}`); const finger = await webFinger(acctLower).catch(e => { - logger.error(`Failed to WebFinger for ${chalk.yellow(acctLower)}: ${e.message} (${e.status})`); - throw e; + logger.error(`Failed to WebFinger for ${chalk.yellow(acctLower)}: ${ e.statusCode || e.message }`); + throw new Error(`Failed to WebFinger for ${acctLower}: ${ e.statusCode || e.message }`); }); const self = finger.links.find(link => link.rel && link.rel.toLowerCase() === 'self'); if (!self) { diff --git a/src/remote/webfinger.ts b/src/remote/webfinger.ts index 1229dbaf98..67535e37db 100644 --- a/src/remote/webfinger.ts +++ b/src/remote/webfinger.ts @@ -1,6 +1,7 @@ -import { WebFinger } from 'webfinger.js'; - -const webFinger = new WebFinger({ }); +import config from '../config'; +import * as request from 'request-promise-native'; +import { URL } from 'url'; +import { query as urlQuery } from '../prelude/url'; type ILink = { href: string; @@ -12,12 +13,33 @@ type IWebFinger = { subject: string; }; -export default async function resolve(query: any): Promise { - return await new Promise((res, rej) => webFinger.lookup(query, (error: Error | string, result: any) => { - if (error) { - return rej(error); - } +export default async function(query: string): Promise { + const url = genUrl(query); + + return await request({ + url, + proxy: config.proxy, + timeout: 10 * 1000, + forever: true, + headers: { + 'User-Agent': config.userAgent, + Accept: 'application/jrd+json, application/json' + }, + json: true + }); +} + +function genUrl(query: string) { + if (query.match(/^https?:\/\//)) { + const u = new URL(query); + return `${u.protocol}//${u.hostname}/.well-known/webfinger?` + urlQuery({ resource: query }); + } + + const m = query.match(/^([^@]+)@(.*)/); + if (m) { + const hostname = m[2]; + return `https://${hostname}/.well-known/webfinger?` + urlQuery({ resource: `acct:${query}` }); + } - res(result.object); - })) as IWebFinger; + throw new Error(`Invalied query (${query})`); } -- cgit v1.2.3-freya