From 1e3aba24222ddce84372a498c980926b3a2ee2d0 Mon Sep 17 00:00:00 2001 From: KagurazakaNyaa Date: Sun, 24 Oct 2021 02:17:07 +0800 Subject: [PATCH] Proxy support for external network access --- api/package-lock.json | Bin 1009067 -> 1027311 bytes api/package.json | 1 + api/src/routes/gifs/search.ts | 4 ++++ api/src/routes/gifs/trending-gifs.ts | 4 ++++ api/src/routes/gifs/trending.ts | 5 +++++ bundle/package-lock.json | Bin 744975 -> 762551 bytes bundle/package.json | 4 +++- util/src/util/AutoUpdate.ts | 7 +++++-- 8 files changed, 22 insertions(+), 3 deletions(-) diff --git a/api/package-lock.json b/api/package-lock.json index 58e31f70715d103438a789c730d6c9c164fa145a..e83d8c61913e1a1233e692daa5d0b36863433eb0 100644 GIT binary patch delta 11514 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 delta 2278 zcmZ8hdsGzX6+hq1&U~};Twr$rd9517D9T2`qzbYWqen4_rco3hn8;}nl}(~;Le->s zoK_K+(}~=pC~i!QhA3=Y^-}RcV~$lp+1Qv?1BPIdLY;r4xotat&LOInF(9d@$EKq!n_~IV)_LNgTml zXRkP6$28-*WIN-~3$NMq^WC>0Fr8bVzkPjzzN%*z%$rP-gN4`P2_%$LC-}2SzutW# z1xgNbcc7lKj$rox7h5MALHyIq1tFBZB2WzL)`9DVq#6bC?A1PhlruVG%_e!IR0$U~3jdSTR-=_3mdJP@Bmg ziXbZYkj1S2rjh#nN&L^@H%w_D2`c>ix?+X)AaUYb&19n!sz&looZ3OY=isI7Ofr^T zB7fq;Kpfji(oR0fIT{{ROCqFtGzDrlQ43VIDK;qC#>B&|I;JP$2XZob1zgDRn7ET^ zqVWDql8o9Orj0S*Px^QfUHh0lMlFrF;2TMKqz#Nr^pB4u5RKVE^b~y38>BA?8AEr2lw7n$3v|cMR8$VL#>~X~2OqbWnf0 z)PeP{Qh|U!*O-NF%HM*jwPvIBiZ~G_hv;KSDyMb`4Db}bYvi2p=%ytGmiAaE$`jdX zJWR>sV$qkyrb&>}NgKni;vxAxb_lpGaW38SuUH7})`sh$Ls78HD^x`c@QrTjiiC|v zF`rFj%tS7{Mu$PcXjy`$CNc_KA;|^XCu{GTgB3sWA9D7YF{+s(4IBy@2vz?gO99QavY#SVp!i2=IRL@9XB#jj=YBOnC?`$zK4 z5@u)chgeA5OKxNOB%YI?x{1VN(saHuUO({42w41A@>?iLvM89ojMt;F{1P#i*}smr z;kmW^f(_7D!F;G&bDl=mU4Equiw3Ex7e+hL&(Qodw7Tihp>VvNd1yK@W+#rr`eHgY z3VvG6+=RmAbQG-WW&R#HVMP*~Ma-W*uTk(B71VBnEW&!gKaZ;5`vaA+p0HO84#pjg zdm{%yk?jqaMZxB3nwkwKZ&^~He}UDCOFQVnX|Q=HCxH7RlLUq989PpL3bQisSiVqe z@V(30z`KsmMqiOIPDN*swG!wr6I8tQ8{yOs+W%=JxFx}<`$P(lmN8VHVJ(G}pkjxb z7>gA;PVf@GRA4P=!1MR4*)deK8sGXfX!X!|J=D#?l`6>wWwLk`7VDB7PEY5Cz%E7X z!|Y#bU2VTpW$w7sc@kwwH)g;xOY)v5v)o zbz(e&S#OCOpM$P!(GClJl7`XE;sF*UD%$Z;i`XJ#&l&MzG>lC(48C;Bqi{&4_`rfW z-;3FtX?FC6c;^$7+f_l)@Lsj_6o~-P@R&pKRISv`m>y0xidIP3$0&Gho0Ml*wMkA$ z-)7~(TPHn$wJW4VJiJ4?z?tSvc8TJd-4biS4NF7Xq|p&jEN=KjQY~hba}ClQg3s@l zD2XJ3n+`}{vtdRK-1)gQgP<)aZ4vNHi_}0OL@{t&3OonrImM3kcO~k;4oOxy{MjbY z5KW5>3GzR!;RK!VY$r{Gn}60)z}rb>a64oR49-zh2ptnGP}50ysOS=HaQ-XhC-Cmp z6l7B6I}BXAs6K;+R&2^O>pM^&Y7jUk@;GLt?1{#$8|2$r`s^Jx@OQ{IXvnvUxU)rm zWe!?YrD!$ITCdzU)Hl4pd6i-mmb{~6GFZM*8I=N|-xHhef7!~Eu7TDc4DIzU7cJPl zPsxokcQ@xR3WxNl633$Tgfc?H@^eZL1Kd%gkM6zX3K*+v#rYjdkAO!nD>EICuvZu! z-rcEC->-;R+NXS@;)BOZOc}rB~4VsXU5c(^Fde xMA$Tx6T$mXhy#PC19ul|6{-03yV`sS(pSkG6yIf~aP2U|r)`$dSErRk{STuVP0j!S diff --git a/api/package.json b/api/package.json index 1c6b4fc0..3be75f68 100644 --- a/api/package.json +++ b/api/package.json @@ -86,6 +86,7 @@ "multer": "^1.4.2", "node-fetch": "^2.6.1", "patch-package": "^6.4.7", + "proxy-agent": "^5.0.0", "supertest": "^6.1.6", "typeorm": "^0.2.37" }, diff --git a/api/src/routes/gifs/search.ts b/api/src/routes/gifs/search.ts index 45b3ddca..9ad7a592 100644 --- a/api/src/routes/gifs/search.ts +++ b/api/src/routes/gifs/search.ts @@ -1,5 +1,6 @@ import { Router, Response, Request } from "express"; import fetch from "node-fetch"; +import ProxyAgent from 'proxy-agent'; import { route } from "@fosscord/api"; import { getGifApiKey, parseGifResult } from "./trending"; @@ -10,8 +11,11 @@ router.get("/", route({}), async (req: Request, res: Response) => { const { q, media_format, locale } = req.query; const apiKey = getGifApiKey(); + + const agent = new ProxyAgent(); const response = await fetch(`https://g.tenor.com/v1/search?q=${q}&media_format=${media_format}&locale=${locale}&key=${apiKey}`, { + agent, method: "get", headers: { "Content-Type": "application/json" } }); diff --git a/api/src/routes/gifs/trending-gifs.ts b/api/src/routes/gifs/trending-gifs.ts index b5f87222..6d97bf7c 100644 --- a/api/src/routes/gifs/trending-gifs.ts +++ b/api/src/routes/gifs/trending-gifs.ts @@ -1,5 +1,6 @@ import { Router, Response, Request } from "express"; import fetch from "node-fetch"; +import ProxyAgent from 'proxy-agent'; import { route } from "@fosscord/api"; import { getGifApiKey, parseGifResult } from "./trending"; @@ -10,8 +11,11 @@ router.get("/", route({}), async (req: Request, res: Response) => { const { media_format, locale } = req.query; const apiKey = getGifApiKey(); + + const agent = new ProxyAgent(); const response = await fetch(`https://g.tenor.com/v1/trending?media_format=${media_format}&locale=${locale}&key=${apiKey}`, { + agent, method: "get", headers: { "Content-Type": "application/json" } }); diff --git a/api/src/routes/gifs/trending.ts b/api/src/routes/gifs/trending.ts index 7ee9337e..c81b4c08 100644 --- a/api/src/routes/gifs/trending.ts +++ b/api/src/routes/gifs/trending.ts @@ -1,5 +1,6 @@ import { Router, Response, Request } from "express"; import fetch from "node-fetch"; +import ProxyAgent from 'proxy-agent'; import { route } from "@fosscord/api"; import { Config } from "@fosscord/util"; import { HTTPError } from "lambert-server"; @@ -33,13 +34,17 @@ router.get("/", route({}), async (req: Request, res: Response) => { const { media_format, locale } = req.query; const apiKey = getGifApiKey(); + + const agent = new ProxyAgent(); const [responseSource, trendGifSource] = await Promise.all([ fetch(`https://g.tenor.com/v1/categories?locale=${locale}&key=${apiKey}`, { + agent, method: "get", headers: { "Content-Type": "application/json" } }), fetch(`https://g.tenor.com/v1/trending?locale=${locale}&key=${apiKey}`, { + agent, method: "get", headers: { "Content-Type": "application/json" } }) diff --git a/bundle/package-lock.json b/bundle/package-lock.json index 2e3336059875abf5ab60edffcc263a62210d16da..9b5e38ae234732d2e3f36f9a88805f103be81f51 100644 GIT binary patch delta 13076 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 delta 3613 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