mirror of
				https://github.com/actions/cache.git
				synced 2025-10-31 18:34:19 +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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dave Hadka
						Dave Hadka