3
0
Fork 0
mirror of https://code.forgejo.org/actions/cache.git synced 2025-04-22 11:25:31 +00:00

Merge pull request #269 from actions/socket-timeout

Adds socket timeout and validate file size
This commit is contained in:
David Hadka 2020-04-29 12:21:27 -05:00 committed by GitHub
commit 54626c4a4f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 88 additions and 1 deletions

View file

@ -9,7 +9,7 @@ import {
import * as crypto from "crypto";
import * as fs from "fs";
import { Inputs } from "./constants";
import { Inputs, SocketTimeout } from "./constants";
import {
ArtifactCacheEntry,
CommitCacheRequest,
@ -144,7 +144,33 @@ export async function downloadCache(
const stream = fs.createWriteStream(archivePath);
const httpClient = new HttpClient("actions/cache");
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);
// Validate download size.
const 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

View file

@ -20,3 +20,8 @@ export enum Events {
}
export const CacheFilename = "cache.tgz";
// Socket timeout in milliseconds during download. If no traffic is received
// over the socket during this period, the socket is destroyed and the download
// is aborted.
export const SocketTimeout = 5000;