Fix response bodies when recording

This commit is contained in:
Koen Vlaswinkel
2023-10-02 11:02:20 +02:00
parent 40b79f2e61
commit 7578697e92
2 changed files with 52 additions and 11 deletions

View File

@@ -17,7 +17,7 @@ export enum RequestKind {
AutoModel = "autoModel",
}
interface BasicErorResponse {
export interface BasicErorResponse {
message: string;
}
@@ -74,7 +74,7 @@ export interface GetVariantAnalysisRepoResultRequest {
};
}
interface CodeSearchResponse {
export interface CodeSearchResponse {
total_count: number;
items: Array<{
repository: Repository;
@@ -92,7 +92,7 @@ interface CodeSearchRequest {
};
}
interface AutoModelResponse {
export interface AutoModelResponse {
models: string;
}

View File

@@ -4,12 +4,21 @@ import { join } from "path";
import { SetupServer } from "msw/node";
import { DisposableObject } from "../disposable-object";
import { gzipDecode } from "../zlib";
import {
AutoModelResponse,
BasicErorResponse,
CodeSearchResponse,
GetVariantAnalysisRepoResultRequest,
GitHubApiRequest,
RequestKind,
} from "./gh-api-request";
import {
VariantAnalysis,
VariantAnalysisRepoTask,
} from "../../variant-analysis/gh-api/variant-analysis";
import { Repository } from "../../variant-analysis/gh-api/repository";
export class Recorder extends DisposableObject {
private currentRecordedScenario: GitHubApiRequest[] = [];
@@ -81,7 +90,7 @@ export class Recorder extends DisposableObject {
let bodyFileLink = undefined;
if (writtenRequest.response.body) {
await writeFile(bodyFilePath, writtenRequest.response.body || "");
await writeFile(bodyFilePath, writtenRequest.response.body);
bodyFileLink = `file:${bodyFileName}`;
}
@@ -137,7 +146,9 @@ async function createGitHubApiRequest(
},
response: {
status,
body: await response.json(),
body: await jsonResponseBody<
Repository | BasicErorResponse | undefined
>(response),
},
};
}
@@ -151,7 +162,9 @@ async function createGitHubApiRequest(
},
response: {
status,
body: await response.json(),
body: await jsonResponseBody<
VariantAnalysis | BasicErorResponse | undefined
>(response),
},
};
}
@@ -167,7 +180,9 @@ async function createGitHubApiRequest(
},
response: {
status,
body: await response.json(),
body: await jsonResponseBody<
VariantAnalysis | BasicErorResponse | undefined
>(response),
},
};
}
@@ -183,7 +198,9 @@ async function createGitHubApiRequest(
},
response: {
status,
body: await response.json(),
body: await jsonResponseBody<
VariantAnalysisRepoTask | BasicErorResponse | undefined
>(response),
},
};
}
@@ -200,7 +217,7 @@ async function createGitHubApiRequest(
},
response: {
status,
body: Buffer.from(await response.arrayBuffer()),
body: Buffer.from(await responseBody(response)),
contentType: headers.get("content-type") ?? "application/octet-stream",
},
};
@@ -215,7 +232,9 @@ async function createGitHubApiRequest(
},
response: {
status,
body: await response.json(),
body: await jsonResponseBody<
CodeSearchResponse | BasicErorResponse | undefined
>(response),
},
};
}
@@ -230,7 +249,9 @@ async function createGitHubApiRequest(
},
response: {
status,
body: await response.json(),
body: await jsonResponseBody<
BasicErorResponse | AutoModelResponse | undefined
>(response),
},
};
}
@@ -238,6 +259,26 @@ async function createGitHubApiRequest(
return undefined;
}
async function responseBody(response: Response): Promise<Uint8Array> {
const body = await response.arrayBuffer();
const view = new Uint8Array(body);
if (view[0] === 0x1f && view[1] === 0x8b) {
// Response body is gzipped, so we need to un-gzip it.
return await gzipDecode(view);
} else {
return view;
}
}
async function jsonResponseBody<T>(response: Response): Promise<T> {
const body = await responseBody(response);
const text = new TextDecoder("utf-8").decode(body);
return JSON.parse(text);
}
function shouldWriteBodyToFile(
request: GitHubApiRequest,
): request is GetVariantAnalysisRepoResultRequest {