41、【Agent】【OpenCode】本地代理分析(五)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Agent】【OpenCode】本地代理分析(四)

开始分析 end 事件,其中分析到了获取 Autorization 头部信息,并分析了其中的 JavaScript 细节:代理会尝试从请求头部信息中读取 authorization 字段,如果该字段不存在(或为假值),就用空字符串代替,然后本地代理会直接透传这个获取到的 authorization 字段,然后分析了 end 事件中的 option 对象,这个 options 对象是 Node.js 中使用的内置模块 https.request 发起 HTTPS 请求时必需的配置参数,定义了向哪个服务器,用什么方式,发送什么样的请求,并详细分析了其中的元素,比如 hostnameportpath,以及 method,下面继续分析

OpenCode

下面继续分析 options 对象剩余的元素

接下来是 headers: {...}:请求头,用于传递元数据,关键字段如下

  • 'Authorization': authHeader身份认证 ,这里的 authHeader 是从 OpenCode 原始请求里提取的 API Key
  • 'Content-Type': 'application/json'通知服务器 request body 是 JSON 格式,DashScope 要求 request body 需是 JSON,所以这里必须设置
  • 'Content-Length': Buffer.byteLength(body)声明 request body 的字节长度 ,注意,这里不能用 body.length,因为 body.length 返回的是字符串字符数(UTF-16),而 HTTP 协议要求的是字节数(bytes),某些中文字符会占多个字节,Buffer.byteLength 可以正确计算出真正的字节数(UTF-8),如果 Content-Length 不准确,服务器可能提前关闭连接,或返回 400 错误

综合以上字段,最终可以形成完整的 URL 请求示例如下

javascript 复制代码
POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
Headers:
  Authorization: Bearer sk-xxxx
  Content-Type: application/json
  Content-Length: 123
Body:
  {"model":"qwen-plus","messages":[...]}

OK,接着分析剩余部分

首先是这里的创建 HTTPS 请求对象

javascript 复制代码
const proxyReq = https.request(options, (proxyRes) => {
  // 当收到 DashScope 的响应头时触发
});

这是 Node.js 中使用 https 模块发起 HTTPS 请求的标准写法,其整体语法结构是函数调用 + 回调函数的典型模式

  • const requestObject = https.request(config, callback);

https.request 是 Node.js 内置模块 https 提供的方法,用于创建一个 HTTP/HTTPS 客户端请求对象,这里的第二个参数是个回调函数,当目标服务器返回响应头时,该回调会被自动调用

这里有四个关键点

  • https.request(...)来自 Node.js 标准库,负责构造一个 HTTPS 客户端请求对象,注意,构造对象并不会立即发送请求 ,必须要调用 .write.end 才会真正发出请求,就好像写好了一封信(设置了地址,写了内容),但还没投进邮箱
  • config(第一个参数):就是前面说过的 options,定义消息的头部信息,配置请求要向哪个服务器发送,以及怎么发
  • callback(第二个参数,回调函数):就是上面的 (proxyRes) => {...},是个箭头函数 ,关于箭头函数之前 blog 【Agent】【OpenCode】本地代理分析(三) 已经介绍过

回调 (proxyRes) => {...} 里面的参数 proxyRes 详细分析下:

  • 类型http.IncomingMessage,是 Node.js 的内置类
  • 含义:来自目标服务器的响应对象

该对象 proxyRes 包含如下关键属性

  • proxyRes.statusCode:响应码,比如 200,401,500 等
  • proxyRes.headers:响应头部信息,比如 {'content-type': 'application/json', ...}
  • 可读流,响应体数据通过 .on('data').pipe 可以获取

OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Agent】【OpenCode】本地代理分析(六)

相关推荐
熊猫钓鱼>_>2 分钟前
当“虾”遇上“马”:QClaw 融合 Hermes 背后的智能体进化论
人工智能·ai·腾讯云·agent·openclaw·qclaw·hermes
深念Y4 分钟前
Denuvo加密被全面攻破?聊聊D加密原理和这次的破解事件
人工智能·游戏·ai·逆向·虚拟机·虚拟·d加密
KKKlucifer9 分钟前
日志审计与行为分析在安全服务中的应用实践
网络·人工智能·安全
SelectDB9 分钟前
Doris & SelectDB for AI 实战:从基础 RAG 到知识图谱增强的完整实现
数据库·人工智能·数据分析
Agent产品评测局11 分钟前
生产排期与MES/ERP系统打通,实操方法详解:2026企业级智能体与超自动化集成实战指南
运维·人工智能·ai·chatgpt·自动化
GitCode官方12 分钟前
一声唤醒 万物响应|AtomGit 首款开源鸿蒙 AI 硬件「小鸿」发布会圆满落幕 定义智能交互新入口
人工智能·开源·harmonyos
互联网志12 分钟前
打通转化通道 赋能产业发展——高校科技成果转化的现状与破局
大数据·人工智能·物联网
时序之心19 分钟前
ICLR 2026两篇时间序列论文新思路:都用Patch作为建模基础单元
人工智能·iclr·时间序列
天天进步201521 分钟前
实时通信的艺术:OpenWork 中 SSE 与事件流驱动的 UI 交互实现
人工智能
AI_paid_community24 分钟前
我花了一晚上把 Claude Code 彻底"薅羊毛"了——free-claude-code 项目深度实测
人工智能·claude