@@ -40,7 +40,7 @@ export interface PdfViewState {}
4040
4141interface Source {
4242 uri: string;
43- headers?: Object;
43+ headers?: Record<string, Object> ;
4444 cache?: boolean;
4545 cacheFileName?: string;
4646 expiration?: number;
@@ -197,6 +197,20 @@ export struct RTNPdfView {
197197 if (fs.accessSync(fullFileName)) {
198198 fs.unlinkSync(fullFileName);
199199 }
200+ const res = await this.downloadAction(context, url, fullFileName, {}, 0);
201+ Logger.info(`[RTNPdfView]:res: ${res}`);
202+ return res;
203+ }
204+ async downloadAction(
205+ context: Context,
206+ url: string,
207+ fullFileName: string,
208+ distHeaders: Record<string, Object>,
209+ redirectCount: number = 0,
210+ ): Promise<string> {
211+ if (redirectCount > 5) {
212+ throw new Error("Too many redirects");
213+ }
200214 return new Promise((resolve, reject) => {
201215 // 获取应用文件路径
202216 try {
@@ -205,9 +219,10 @@ export struct RTNPdfView {
205219 action: request.agent.Action.DOWNLOAD,
206220 url,
207221 method: this.descriptor.rawProps.source.method ?? 'GET',
208- headers: this.descriptor.rawProps.source.headers,
222+ headers: assignHeader( this.descriptor.rawProps.source? .headers || {}, distHeaders|| {}) ,
209223 saveas: fullFileName,
210224 overwrite: true,
225+ mode: request.agent.Mode.FOREGROUND
211226 };
212227 request.agent.create(context, config).then((task: request.agent.Task) => {
213228 task.on('completed', () => {
@@ -217,8 +232,24 @@ export struct RTNPdfView {
217232 task.on('failed', (progress: request.agent.Progress) => {
218233 console.info('[RTNPdfView]: downloadFile failed.', JSON.stringify(progress));
219234 });
220- task.on('response', (response: request.agent.HttpResponse) => {
235+ task.on('response', async (response: request.agent.HttpResponse) => {
221236 console.info('[RTNPdfView]: downloadFile response.', JSON.stringify(response));
237+ if (response.statusCode > 300 && response.statusCode < 400) {
238+ let redirectUrl: string = response.headers.get('location')?.toString() ?? '';
239+ let cookie: string = response.headers.get('set-cookie')?.toString() ?? '';
240+ task.off('progress');
241+ task.off('completed');
242+ task.off('response');
243+ task.stop();
244+ try {
245+ const result = await this.downloadAction(context, redirectUrl, fullFileName, { 'cookie': cookie }, redirectCount + 1);
246+
247+ Logger.info(`[RTNPdfView]:result: ${result} -----count: ${redirectCount}}`);
248+ resolve(result)
249+ } catch (e) {
250+ reject(e);
251+ }
252+ }
222253 });
223254 task.start();
224255 }).catch((err: BusinessError) => {
@@ -242,7 +273,7 @@ export struct RTNPdfView {
242273 try {
243274 await md.update({ data: new Uint8Array(buffer.from(originalURL, 'utf-8').buffer) });
244275 let mdResult: cryptoFramework.DataBlob = await md.digest();
245- const fileName: string = buffer.from(mdResult.data).toString('hex');
276+ const fileName: string = buffer.from(mdResult.data).toString('hex') + new Date().getTime() ;
246277 Logger.info(`[RTNPdfView]: fileName: ${fileName}`);
247278 resolve(fileName);
248279 } catch (e) {
@@ -410,4 +441,12 @@ export struct RTNPdfView {
410441 }
411442 }
412443 }
444+ }
445+ function assignHeader(target: Record<string, Object>, ...source: Record<string, Object>[]): Record<string, Object> {
446+ for(let s of source){
447+ for(let k of Object.keys(s)){
448+ target[k] = Reflect.get(s, k)
449+ }
450+ }
451+ return target
413452}
0 commit comments