From da74dded7f6fdf69fa8dc6252452d4cbe88e1978 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 24 Mar 2026 14:51:41 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=B7=A8=E5=9F=9F=E6=83=85=E5=86=B5?= =?UTF-8?q?=E4=B8=8D=E8=B5=B0=E8=BD=AC=E5=8F=91=E7=9B=B4=E6=8E=A5=E5=9C=A8?= =?UTF-8?q?node=E4=B8=AD=E9=97=B4=E5=B1=82=E5=8E=BB=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/hap-server/src/server.js | 79 ++++++++++++++++++++++++++----- 1 file changed, 67 insertions(+), 12 deletions(-) diff --git a/packages/hap-server/src/server.js b/packages/hap-server/src/server.js index 7b803668..3ee15de3 100644 --- a/packages/hap-server/src/server.js +++ b/packages/hap-server/src/server.js @@ -4,6 +4,7 @@ */ import http from 'http' +import https from 'https' import Koa from 'koa' import opn from 'opn' import portfinder from 'portfinder' @@ -16,7 +17,6 @@ import { } from '@hap-toolkit/shared-utils' import { browerOptions } from './config' const moduler = [require('@hap-toolkit/debugger')] -const proxies = require('koa-proxies') let server = null export async function launch(conf) { return new Promise(async (resolve) => { @@ -26,19 +26,74 @@ export async function launch(conf) { moduler.push((await import('@hap-toolkit/packager')).router, require('./preview/index.js')) } const app = new Koa() - // 插件方式的预览页面是iframe,快应用开发ajax请求会受同源策略限制,需要做代理转发 + // 插件方式的预览页面是iframe,快应用开发ajax请求会受同源策略限制,需要根据/api/proxy判断是否在node服务端做请求接口 app.use(async (ctx, next) => { - if (ctx.request.url.startsWith('/api/proxy')) { - const target = ctx.request.url.split('target=')[1] // 从查询参数获取实际请求的目标地址 - // const apiReg = new RegExp(`^${api}/`); - return proxies('/api/proxy', { - target: target, - changeOrigin: true, - logs: true, - rewrite: (path) => path.replace(/^\/api\/proxy/, '') - })(ctx, next) + if (!ctx.request.url.startsWith('/api/proxy')) { + return next() } - return next() + // 浏览器引擎拼接的接口地址格式为/api/proxy/+实际地址 + const urlString = ctx.request.url.split('/api/proxy/')[1] || ''; + + const url = new URL(urlString) + if (!url) { + ctx.status = 400 + ctx.body = { + message: 'Missing required query param: target' + } + return + } + const requestBody = await new Promise((resolve, reject) => { + const chunks = [] + ctx.req.on('data', (chunk) => chunks.push(chunk)) + ctx.req.on('end', () => resolve(Buffer.concat(chunks))) + ctx.req.on('error', reject) + }) + console.log('ctx', ctx); + console.log('requestBody', requestBody); + const requestHeaders = { ...ctx.headers } + delete requestHeaders.host + if (requestBody.length > 0) { + requestHeaders['content-length'] = requestBody.length + } else { + delete requestHeaders['content-length'] + } + + const requestOptions = { + method: ctx.method, + headers: requestHeaders + } + console.log('requestOptions', requestOptions) + console.log('url', url) + const transport = url.protocol === 'https:' ? https : http + const proxyResponse = await new Promise((resolve, reject) => { + const req = transport.request(url,requestOptions, (res) => { + const chunks = [] + res.on('data', (chunk) => chunks.push(chunk)) + res.on('end', () => { + resolve({ + statusCode: res.statusCode || 500, + headers: res.headers, + body: Buffer.concat(chunks) + }) + }) + }) + req.on('error', reject) + req.setTimeout(30000, () => { + req.destroy(new Error('proxy request timeout')) + }) + if (requestBody.length > 0) { + req.write(requestBody) + } + req.end() + }) + + ctx.status = proxyResponse.statusCode + Object.entries(proxyResponse.headers || {}).forEach(([key, value]) => { + if (value !== undefined) { + ctx.set(key, value) + } + }) + ctx.body = proxyResponse.body }) let serverPort = globalConfig.server.port // 如果设置的端口被占用,则自动递增获取可用端口 From 4b5f0886c272f6355b5a53d21b63bea473f97cc8 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 24 Mar 2026 14:57:20 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/hap-server/src/server.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/hap-server/src/server.js b/packages/hap-server/src/server.js index 3ee15de3..e3fad7c0 100644 --- a/packages/hap-server/src/server.js +++ b/packages/hap-server/src/server.js @@ -48,8 +48,6 @@ export async function launch(conf) { ctx.req.on('end', () => resolve(Buffer.concat(chunks))) ctx.req.on('error', reject) }) - console.log('ctx', ctx); - console.log('requestBody', requestBody); const requestHeaders = { ...ctx.headers } delete requestHeaders.host if (requestBody.length > 0) { @@ -62,8 +60,6 @@ export async function launch(conf) { method: ctx.method, headers: requestHeaders } - console.log('requestOptions', requestOptions) - console.log('url', url) const transport = url.protocol === 'https:' ? https : http const proxyResponse = await new Promise((resolve, reject) => { const req = transport.request(url,requestOptions, (res) => { From b3600c1774474a32ce4694a7559842f32dc3634e Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 24 Mar 2026 14:58:08 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/hap-server/src/server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/hap-server/src/server.js b/packages/hap-server/src/server.js index e3fad7c0..89feacb8 100644 --- a/packages/hap-server/src/server.js +++ b/packages/hap-server/src/server.js @@ -32,8 +32,8 @@ export async function launch(conf) { return next() } // 浏览器引擎拼接的接口地址格式为/api/proxy/+实际地址 - const urlString = ctx.request.url.split('/api/proxy/')[1] || ''; - + const urlString = ctx.request.url.split('/api/proxy/')[1] || '' + const url = new URL(urlString) if (!url) { ctx.status = 400 @@ -62,7 +62,7 @@ export async function launch(conf) { } const transport = url.protocol === 'https:' ? https : http const proxyResponse = await new Promise((resolve, reject) => { - const req = transport.request(url,requestOptions, (res) => { + const req = transport.request(url, requestOptions, (res) => { const chunks = [] res.on('data', (chunk) => chunks.push(chunk)) res.on('end', () => {