mirror of
				https://github.com/actions/cache.git
				synced 2025-11-04 07:38:37 +08:00 
			
		
		
		
	Adds socket timeout and validate file size
This commit is contained in:
		
							parent
							
								
									f60097cd16
								
							
						
					
					
						commit
						8b2a57849f
					
				| 
						 | 
					@ -9,7 +9,7 @@ import {
 | 
				
			||||||
import * as crypto from "crypto";
 | 
					import * as crypto from "crypto";
 | 
				
			||||||
import * as fs from "fs";
 | 
					import * as fs from "fs";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Inputs } from "./constants";
 | 
					import { Inputs, SocketTimeout } from "./constants";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    ArtifactCacheEntry,
 | 
					    ArtifactCacheEntry,
 | 
				
			||||||
    CommitCacheRequest,
 | 
					    CommitCacheRequest,
 | 
				
			||||||
| 
						 | 
					@ -144,7 +144,33 @@ export async function downloadCache(
 | 
				
			||||||
    const stream = fs.createWriteStream(archivePath);
 | 
					    const stream = fs.createWriteStream(archivePath);
 | 
				
			||||||
    const httpClient = new HttpClient("actions/cache");
 | 
					    const httpClient = new HttpClient("actions/cache");
 | 
				
			||||||
    const downloadResponse = await httpClient.get(archiveLocation);
 | 
					    const downloadResponse = await httpClient.get(archiveLocation);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Abort download if no traffic received over the socket.
 | 
				
			||||||
 | 
					    downloadResponse.message.socket.setTimeout(SocketTimeout, () => {
 | 
				
			||||||
 | 
					        downloadResponse.message.destroy();
 | 
				
			||||||
 | 
					        core.debug(
 | 
				
			||||||
 | 
					            `Aborting download, socket timed out after ${SocketTimeout} ms`
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await pipeResponseToStream(downloadResponse, stream);
 | 
					    await pipeResponseToStream(downloadResponse, stream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Validate download size.
 | 
				
			||||||
 | 
					    var contentLengthHeader =
 | 
				
			||||||
 | 
					        downloadResponse.message.headers["content-length"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (contentLengthHeader) {
 | 
				
			||||||
 | 
					        const expectedLength = parseInt(contentLengthHeader);
 | 
				
			||||||
 | 
					        const actualLength = utils.getArchiveFileSize(archivePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (actualLength != expectedLength) {
 | 
				
			||||||
 | 
					            throw new Error(
 | 
				
			||||||
 | 
					                `Incomplete download. Expected file size: ${expectedLength}, actual file size: ${actualLength}`
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        core.debug("Unable to validate download, no Content-Length header");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Reserve Cache
 | 
					// Reserve Cache
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,3 +20,5 @@ export enum Events {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const CacheFilename = "cache.tgz";
 | 
					export const CacheFilename = "cache.tgz";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const SocketTimeout = 5000;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user