57 行
1.4 KiB
TypeScript
57 行
1.4 KiB
TypeScript
import type { Express, RequestHandler } from "express";
|
|
import http from "node:http";
|
|
import https from "node:https";
|
|
|
|
function createMediaProxy(targetUrl: string): RequestHandler {
|
|
const target = new URL(targetUrl);
|
|
const transport = target.protocol === "https:" ? https : http;
|
|
|
|
return (req, res) => {
|
|
const upstreamUrl = new URL(req.originalUrl, target);
|
|
const proxyRequest = transport.request(
|
|
upstreamUrl,
|
|
{
|
|
method: req.method,
|
|
headers: {
|
|
...req.headers,
|
|
host: target.host,
|
|
connection: "keep-alive",
|
|
},
|
|
},
|
|
(proxyResponse) => {
|
|
if (proxyResponse.statusCode) {
|
|
res.status(proxyResponse.statusCode);
|
|
}
|
|
Object.entries(proxyResponse.headers).forEach(([key, value]) => {
|
|
if (value !== undefined) {
|
|
res.setHeader(key, value);
|
|
}
|
|
});
|
|
proxyResponse.pipe(res);
|
|
}
|
|
);
|
|
|
|
proxyRequest.on("error", (error) => {
|
|
if (!res.headersSent) {
|
|
res.status(502).json({
|
|
error: "media_service_unavailable",
|
|
message: error.message,
|
|
});
|
|
} else {
|
|
res.end();
|
|
}
|
|
});
|
|
|
|
req.pipe(proxyRequest);
|
|
};
|
|
}
|
|
|
|
export function registerMediaProxy(app: Express) {
|
|
const mediaServiceUrl = process.env.MEDIA_SERVICE_URL;
|
|
if (!mediaServiceUrl) {
|
|
return;
|
|
}
|
|
|
|
app.use("/media", createMediaProxy(mediaServiceUrl));
|
|
}
|