文件
tennis-training-hub/server/_core/mediaProxy.ts
2026-03-14 21:45:31 +08:00

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));
}