@@ -31,6 +31,7 @@ export async function getFlowHeaders(
3131 timeout ,
3232 customProxy ,
3333 flowUrl ,
34+ flowHeaders ,
3435) {
3536 let url = flowUrl || rawUrl || '' ;
3637 let $arguments = { } ;
@@ -69,25 +70,64 @@ export async function getFlowHeaders(
6970 }
7071 const userAgent = ua || defaultFlowUserAgent || 'clash.meta/v1.19.23' ;
7172 const requestTimeout = timeout || defaultTimeout || 8000 ;
72- const id = hex_md5 ( userAgent + url ) ;
73+ let customHeaders ;
74+ const customHeadersArg =
75+ flowHeaders || $arguments ?. flowHeaders || $arguments ?. headers ;
76+ if ( customHeadersArg ) {
77+ try {
78+ const parsed =
79+ typeof customHeadersArg === 'string'
80+ ? JSON . parse ( customHeadersArg )
81+ : customHeadersArg ;
82+ if (
83+ parsed &&
84+ typeof parsed === 'object' &&
85+ ! Array . isArray ( parsed ) &&
86+ Object . keys ( parsed ) . length > 0
87+ ) {
88+ const lowerCaseHeaders = { 'user-agent' : userAgent } ;
89+ for ( const key in parsed ) {
90+ lowerCaseHeaders [ key . toLowerCase ( ) ] = parsed [ key ] ;
91+ }
92+ customHeaders = lowerCaseHeaders ;
93+ }
94+ } catch ( e ) {
95+ $ . error (
96+ `解析自定义 ${
97+ flowHeaders || $arguments ?. flowHeaders
98+ ? 'flowHeaders'
99+ : 'headers'
100+ } 失败: ${ e } `,
101+ ) ;
102+ }
103+ }
104+ const id = hex_md5 (
105+ `${ customHeaders ? JSON . stringify ( customHeaders ) : userAgent } ${ url } ` ,
106+ ) ;
73107 const cached = headersResourceCache . get ( id ) ;
74108 let flowInfo ;
75109 if ( ! $arguments ?. noCache && cached ) {
76- $ . info ( `使用缓存的流量信息: ${ url } , ${ userAgent } ` ) ;
110+ $ . info (
111+ `使用缓存的流量信息: ${ url } , ${
112+ customHeaders ? JSON . stringify ( customHeaders ) : userAgent
113+ } `,
114+ ) ;
77115 flowInfo = cached ;
78116 } else {
79117 const http = HTTP ( ) ;
80118 if ( flowUrl ) {
81119 let flowUrlHeaders ;
82120 try {
83121 $ . info (
84- `使用 GET 方法从响应体获取流量信息: ${ flowUrl } , User-Agent: ${
85- userAgent || ''
122+ `使用 GET 方法从响应体获取流量信息: ${ flowUrl } , ${
123+ customHeaders
124+ ? JSON . stringify ( customHeaders )
125+ : `User-Agent: ${ userAgent || '' } `
86126 } , Insecure: ${ ! ! insecure } , Proxy: ${ proxy } `,
87127 ) ;
88128 const { headers, body, statusCode } = await http . get ( {
89- url : flowUrl ,
90- headers : {
129+ url,
130+ headers : customHeaders || {
91131 'User-Agent' : userAgent ,
92132 } ,
93133 timeout : requestTimeout ,
@@ -113,8 +153,10 @@ export async function getFlowHeaders(
113153 }
114154 } catch ( e ) {
115155 $ . error (
116- `使用 GET 方法从响应体获取流量信息失败: ${ flowUrl } , User-Agent: ${
117- userAgent || ''
156+ `使用 GET 方法从响应体获取流量信息失败: ${ flowUrl } , ${
157+ customHeaders
158+ ? JSON . stringify ( customHeaders )
159+ : `User-Agent: ${ userAgent || '' } `
118160 } , Insecure: ${ ! ! insecure } , Proxy: ${ proxy } : ${
119161 e . message ?? e
120162 } `,
@@ -129,8 +171,10 @@ export async function getFlowHeaders(
129171 Number . isFinite ( parsed ?. usage ?. upload )
130172 ) {
131173 $ . info (
132- `使用 GET 方法从响应头获取流量信息成功: ${ flowUrl } , User-Agent: ${
133- userAgent || ''
174+ `使用 GET 方法从响应头获取流量信息成功: ${ flowUrl } , ${
175+ customHeaders
176+ ? JSON . stringify ( customHeaders )
177+ : `User-Agent: ${ userAgent || '' } `
134178 } , Insecure: ${ ! ! insecure } , Proxy: ${ proxy } `,
135179 ) ;
136180 flowInfo = flowField ;
@@ -139,8 +183,10 @@ export async function getFlowHeaders(
139183 }
140184 } catch ( e ) {
141185 $ . error (
142- `使用 GET 方法从响应头获取流量信息失败: ${ flowUrl } , User-Agent: ${
143- userAgent || ''
186+ `使用 GET 方法从响应头获取流量信息失败: ${ flowUrl } , ${
187+ customHeaders
188+ ? JSON . stringify ( customHeaders )
189+ : `User-Agent: ${ userAgent || '' } `
144190 } , Insecure: ${ ! ! insecure } , Proxy: ${ proxy } : ${
145191 e . message ?? e
146192 } `,
@@ -151,8 +197,10 @@ export async function getFlowHeaders(
151197 } else {
152198 try {
153199 $ . info (
154- `使用 HEAD 方法从响应头获取流量信息: ${ url } , User-Agent: ${
155- userAgent || ''
200+ `使用 HEAD 方法从响应头获取流量信息: ${ url } , ${
201+ customHeaders
202+ ? JSON . stringify ( customHeaders )
203+ : `User-Agent: ${ userAgent || '' } `
156204 } , Insecure: ${ ! ! insecure } , Proxy: ${ proxy } `,
157205 ) ;
158206 const { headers } = await http . head ( {
@@ -161,7 +209,7 @@ export async function getFlowHeaders(
161209 . map ( ( i ) => i . trim ( ) )
162210 . filter ( ( i ) => i . length ) [ 0 ] ,
163211 headers : {
164- 'User-Agent' : userAgent ,
212+ ... ( customHeaders || { 'User-Agent' : userAgent } ) ,
165213 ...( isStash && proxy
166214 ? {
167215 'X-Stash-Selected-Proxy' :
@@ -182,17 +230,21 @@ export async function getFlowHeaders(
182230 flowInfo = getFlowField ( headers ) ;
183231 } catch ( e ) {
184232 $ . error (
185- `使用 HEAD 方法从响应头获取流量信息失败: ${ url } , User-Agent: ${
186- userAgent || ''
233+ `使用 HEAD 方法从响应头获取流量信息失败: ${ url } , ${
234+ customHeaders
235+ ? JSON . stringify ( customHeaders )
236+ : `User-Agent: ${ userAgent || '' } `
187237 } , Insecure: ${ ! ! insecure } , Proxy: ${ proxy } : ${
188238 e . message ?? e
189239 } `,
190240 ) ;
191241 }
192242 if ( ! flowInfo ) {
193243 $ . info (
194- `使用 GET 方法获取流量信息: ${ url } , User-Agent: ${
195- userAgent || ''
244+ `使用 GET 方法获取流量信息: ${ url } , ${
245+ customHeaders
246+ ? JSON . stringify ( customHeaders )
247+ : `User-Agent: ${ userAgent || '' } `
196248 } , Insecure: ${ ! ! insecure } , Proxy: ${ proxy } `,
197249 ) ;
198250 const { headers } = await http . get ( {
@@ -201,7 +253,7 @@ export async function getFlowHeaders(
201253 . map ( ( i ) => i . trim ( ) )
202254 . filter ( ( i ) => i . length ) [ 0 ] ,
203255 headers : {
204- 'User-Agent' : userAgent ,
256+ ... ( customHeaders || { 'User-Agent' : userAgent } ) ,
205257 ...( isStash && proxy
206258 ? {
207259 'X-Stash-Selected-Proxy' :
0 commit comments