Skip to content

Commit

Permalink
Adds socket timeout and validate file size
Browse files Browse the repository at this point in the history
  • Loading branch information
Dave Hadka committed Apr 22, 2020
1 parent f60097c commit 8b2a578
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
28 changes: 27 additions & 1 deletion src/cacheHttpClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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.
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
Expand Down
2 changes: 2 additions & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ export enum Events {
}

export const CacheFilename = "cache.tgz";

export const SocketTimeout = 5000;

0 comments on commit 8b2a578

Please sign in to comment.