@@ -54,6 +54,7 @@ function createFile(req, res) {
5454async function getFile ( req , res , next ) {
5555 let { name } = req . params ;
5656 const reqUA = req . headers [ 'user-agent' ] || req . headers [ 'User-Agent' ] ;
57+ const isShareRoute = req . path ?. startsWith ( '/share/' ) ;
5758 $ . info ( `正在下载文件:${ name } \n请求 User-Agent: ${ reqUA } ` ) ;
5859 let {
5960 url,
@@ -66,6 +67,7 @@ async function getFile(req, res, next) {
6667 proxy,
6768 noCache,
6869 produceType,
70+ fakeFile : _fakeFile ,
6971 } = req . query ;
7072 let $options = {
7173 _req : {
@@ -100,9 +102,79 @@ async function getFile(req, res, next) {
100102 $ . info ( `传入 $options: ${ JSON . stringify ( options ) } ` ) ;
101103 Object . assign ( $options , options ) ;
102104 }
105+ if ( isShareRoute && _fakeFile ) {
106+ $ . warn ( `分享链接禁止使用 fakeFile: ${ name } ` ) ;
107+ failed (
108+ res ,
109+ new RequestInvalidError (
110+ 'UNSUPPORTED_SHARE_FAKE_FILE' ,
111+ 'share/file 不支持 fakeFile 参数' ,
112+ ) ,
113+ 400 ,
114+ ) ;
115+ return ;
116+ }
117+ if (
118+ _fakeFile &&
119+ ( content == null || content === '' ) &&
120+ ( url == null || url === '' )
121+ ) {
122+ $ . warn ( `fakeFile 缺少 content/url: ${ name } ` ) ;
123+ failed (
124+ res ,
125+ new RequestInvalidError (
126+ 'INVALID_FAKE_FILE_SOURCE' ,
127+ 'fakeFile 需要提供 content 或 url 参数' ,
128+ ) ,
129+ 400 ,
130+ ) ;
131+ return ;
132+ }
133+ if (
134+ isShareRoute &&
135+ ( ( url != null && url !== '' ) || ( content != null && content !== '' ) )
136+ ) {
137+ $ . warn ( `分享链接禁止使用 url/content: ${ name } ` ) ;
138+ failed (
139+ res ,
140+ new RequestInvalidError (
141+ 'UNSUPPORTED_SHARE_FILE_SOURCE_OVERRIDE' ,
142+ 'share/file 不支持 url 或 content 参数' ,
143+ ) ,
144+ 400 ,
145+ ) ;
146+ return ;
147+ }
148+ if ( isShareRoute && subInfoUrl != null && subInfoUrl !== '' ) {
149+ $ . warn ( `分享链接禁止使用 subInfoUrl: ${ name } ` ) ;
150+ failed (
151+ res ,
152+ new RequestInvalidError (
153+ 'UNSUPPORTED_SHARE_FILE_SUB_INFO_URL' ,
154+ 'share/file 不支持 subInfoUrl 参数' ,
155+ ) ,
156+ 400 ,
157+ ) ;
158+ return ;
159+ }
160+ if ( isShareRoute && mergeSources ) {
161+ $ . warn ( `分享链接禁止使用 mergeSources: ${ name } ` ) ;
162+ failed (
163+ res ,
164+ new RequestInvalidError (
165+ 'UNSUPPORTED_SHARE_FILE_MERGE_SOURCES' ,
166+ 'share/file 不支持 mergeSources 参数' ,
167+ ) ,
168+ 400 ,
169+ ) ;
170+ return ;
171+ }
103172 if ( url ) {
104173 $ . info ( `指定远程文件 URL: ${ maskAgeSecretInUrl ( url ) } ` ) ;
105174 }
175+ if ( _fakeFile ) {
176+ $ . info ( `使用假文件, 不再通过单个文件名称 ${ name } 查询` ) ;
177+ }
106178 if ( proxy ) {
107179 $ . info ( `指定远程订阅使用代理/策略 proxy: ${ proxy } ` ) ;
108180 }
@@ -132,7 +204,12 @@ async function getFile(req, res, next) {
132204 }
133205
134206 const allFiles = $ . read ( FILES_KEY ) ;
135- const file = findByName ( allFiles , name ) ;
207+ const fakeFile = {
208+ name : 'fakeFile' ,
209+ source : 'remote' ,
210+ url : '' ,
211+ } ;
212+ const file = _fakeFile ? fakeFile : findByName ( allFiles , name ) ;
136213 if ( file ) {
137214 try {
138215 const output = await produceArtifact ( {
@@ -148,6 +225,7 @@ async function getFile(req, res, next) {
148225 noCache,
149226 produceType,
150227 all : true ,
228+ file : _fakeFile ? fakeFile : undefined ,
151229 } ) ;
152230
153231 try {
0 commit comments