Skip to content

Commit 6c84cb9

Browse files
committed
working pass
1 parent fca0914 commit 6c84cb9

9 files changed

Lines changed: 107 additions & 42 deletions

File tree

packages/insomnia/src/common/send-request.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import fs from 'fs';
2+
import path from 'path';
3+
14
import { BaseModel, types as modelTypes } from '../models';
25
import * as models from '../models';
36
import { getBodyBuffer } from '../models/response';
@@ -11,6 +14,7 @@ import {
1114
} from '../network/network';
1215
import { invariant } from '../utils/invariant';
1316
import { database } from './database';
17+
import { generateId } from './misc';
1418
import { RENDER_PURPOSE_SEND } from './render';
1519

1620
// The network layer uses settings from the settings model
@@ -60,7 +64,12 @@ export async function getSendRequestCallbackMemDb(environmentId: string, memDB:
6064
const clientCertificates = await models.clientCertificate.findByParentId(workspaceId);
6165
const caCert = await models.caCertificate.findByParentId(workspaceId);
6266

63-
return { request, settings, clientCertificates, caCert };
67+
const responseId = generateId('res');
68+
const responsesDir = path.join(process.env['INSOMNIA_DATA_PATH'] || window.app.getPath('userData'), 'responses');
69+
const timelinePath = path.join(responsesDir, responseId + '.timeline');
70+
const timelineFileStream = fs.createWriteStream(timelinePath);
71+
72+
return { request, settings, clientCertificates, caCert, timelineFileStream, timelinePath, responseId };
6473
};
6574
// Return callback helper to send requests
6675
return async function sendRequest(requestId: string) {
@@ -69,6 +78,9 @@ export async function getSendRequestCallbackMemDb(environmentId: string, memDB:
6978
settings,
7079
clientCertificates,
7180
caCert,
81+
timelineFileStream,
82+
timelinePath,
83+
responseId,
7284
} = await fetchInsoRequestData(requestId);
7385
// NOTE: inso ignores active environment, using the one passed in
7486
const renderResult = await tryToInterpolateRequest(request, environmentId, RENDER_PURPOSE_SEND);
@@ -78,6 +90,9 @@ export async function getSendRequestCallbackMemDb(environmentId: string, memDB:
7890
clientCertificates,
7991
caCert,
8092
settings,
93+
timelineFileStream,
94+
timelinePath,
95+
responseId,
8196
);
8297
const res = await responseTransform(response, environmentId, renderedRequest, renderResult.context);
8398
const { statusCode: status, statusMessage, headers: headerArray, elapsedTime: responseTime } = res;

packages/insomnia/src/models/response.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,10 @@ export function getTimeline(response: Response, showBody?: boolean) {
254254
try {
255255
const rawBuffer = fs.readFileSync(timelinePath);
256256
const timelineString = rawBuffer.toString();
257-
const timeline = JSON.parse(timelineString) as ResponseTimelineEntry[];
257+
const isLegacyTimelineFormat = timelineString.startsWith('[');
258+
const timeline = isLegacyTimelineFormat
259+
? JSON.parse(timelineString) as ResponseTimelineEntry[]
260+
: timelineString.split('\n').filter(e => e?.trim()).map(e => JSON.parse(e));
258261

259262
const body: ResponseTimelineEntry[] = showBody ? [
260263
{

packages/insomnia/src/network/network.ts

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import clone from 'clone';
2-
import electron from 'electron';
32
import fs from 'fs';
43
import { join as pathJoin } from 'path';
5-
import { v4 as uuidv4 } from 'uuid';
64

75
import { database as db } from '../common/database';
86
import {
7+
generateId,
98
getContentTypeHeader,
109
getLocationHeader,
1110
getSetCookieHeaders,
@@ -15,7 +14,7 @@ import {
1514
getRenderedRequestAndContext,
1615
RENDER_PURPOSE_NO_RENDER,
1716
} from '../common/render';
18-
import type { HeaderResult, ResponsePatch, ResponseTimelineEntry } from '../main/network/libcurl-promise';
17+
import type { HeaderResult, ResponsePatch } from '../main/network/libcurl-promise';
1918
import * as models from '../models';
2019
import { CaCertificate } from '../models/ca-certificate';
2120
import { ClientCertificate } from '../models/client-certificate';
@@ -65,8 +64,11 @@ export const fetchRequestData = async (requestId: string) => {
6564
invariant(settings, 'failed to create settings');
6665
const clientCertificates = await models.clientCertificate.findByParentId(workspaceId);
6766
const caCert = await models.caCertificate.findByParentId(workspaceId);
68-
69-
return { request, environment, settings, clientCertificates, caCert, activeEnvironmentId };
67+
const responseId = generateId('res');
68+
const responsesDir = pathJoin(process.env['INSOMNIA_DATA_PATH'] || window.app.getPath('userData'), 'responses');
69+
const timelinePath = pathJoin(responsesDir, responseId + '.timeline');
70+
const timelineFileStream = fs.createWriteStream(timelinePath);
71+
return { request, environment, settings, clientCertificates, caCert, activeEnvironmentId, timelineFileStream, timelinePath, responseId };
7072
};
7173

7274
export const tryToInterpolateRequest = async (request: Request, environmentId: string, purpose?: RenderPurpose, extraInfo?: ExtraRenderInfo) => {
@@ -97,18 +99,19 @@ export async function sendCurlAndWriteTimeline(
9799
clientCertificates: ClientCertificate[],
98100
caCert: CaCertificate | null,
99101
settings: Settings,
102+
timelineFileStream: fs.WriteStream,
103+
timelinePath: string,
104+
responseId: string,
100105
) {
101106
const requestId = renderedRequest._id;
102-
const timeline: ResponseTimelineEntry[] = [];
103107

104108
const { finalUrl, socketPath } = transformUrl(renderedRequest.url, renderedRequest.parameters, renderedRequest.authentication, renderedRequest.settingEncodeUrl);
105-
106-
timeline.push({ value: `Preparing request to ${finalUrl}`, name: 'Text', timestamp: Date.now() });
107-
timeline.push({ value: `Current time is ${new Date().toISOString()}`, name: 'Text', timestamp: Date.now() });
108-
timeline.push({ value: `${renderedRequest.settingEncodeUrl ? 'Enable' : 'Disable'} automatic URL encoding`, name: 'Text', timestamp: Date.now() });
109+
timelineFileStream.write(JSON.stringify({ value: `Preparing request to ${finalUrl}`, name: 'Text', timestamp: Date.now() }) + '\n');
110+
timelineFileStream.write(JSON.stringify({ value: `Current time is ${new Date().toISOString()}`, name: 'Text', timestamp: Date.now() }) + '\n');
111+
timelineFileStream.write(JSON.stringify({ value: `${renderedRequest.settingEncodeUrl ? 'Enable' : 'Disable'} automatic URL encoding`, name: 'Text', timestamp: Date.now() }) + '\n');
109112

110113
if (!renderedRequest.settingSendCookies) {
111-
timeline.push({ value: 'Disable cookie sending due to user setting', name: 'Text', timestamp: Date.now() });
114+
timelineFileStream.write(JSON.stringify({ value: 'Disable cookie sending due to user setting', name: 'Text', timestamp: Date.now() }) + '\n');
112115
}
113116

114117
const authHeader = await getAuthHeader(renderedRequest, finalUrl);
@@ -130,9 +133,9 @@ export async function sendCurlAndWriteTimeline(
130133
const output = await nodejsCurlRequest(requestOptions);
131134

132135
if ('error' in output) {
133-
const timelinePath = await storeTimeline(timeline);
134-
136+
timelineFileStream.end();
135137
return {
138+
_id: responseId,
136139
parentId: requestId,
137140
url: requestOptions.finalUrl,
138141
error: output.error,
@@ -143,17 +146,20 @@ export async function sendCurlAndWriteTimeline(
143146
};
144147
}
145148
const { patch, debugTimeline, headerResults, responseBodyPath } = output;
146-
const timelinePath = await storeTimeline([...timeline, ...debugTimeline]);
149+
// todo: move to main process
150+
debugTimeline.forEach(entry => timelineFileStream.write(JSON.stringify(entry) + '\n'));
147151
// transform output
148152
const { cookies, rejectedCookies, totalSetCookies } = await extractCookies(headerResults, renderedRequest.cookieJar, finalUrl, renderedRequest.settingStoreCookies);
149-
rejectedCookies.forEach(errorMessage => timeline.push({ value: `Rejected cookie: ${errorMessage}`, name: 'Text', timestamp: Date.now() }));
153+
rejectedCookies.forEach(errorMessage => timelineFileStream.write(JSON.stringify({ value: `Rejected cookie: ${errorMessage}`, name: 'Text', timestamp: Date.now() }) + '\n'));
150154
if (totalSetCookies) {
151155
await models.cookieJar.update(renderedRequest.cookieJar, { cookies });
152-
timeline.push({ value: `Saved ${totalSetCookies} cookies`, name: 'Text', timestamp: Date.now() });
156+
timelineFileStream.write(JSON.stringify({ value: `Saved ${totalSetCookies} cookies`, name: 'Text', timestamp: Date.now() }) + '\n');
153157
}
154158
const lastRedirect = headerResults[headerResults.length - 1];
159+
timelineFileStream.end();
155160

156161
return {
162+
_id: responseId,
157163
parentId: renderedRequest._id,
158164
timelinePath,
159165
bodyPath: responseBodyPath,
@@ -305,23 +311,23 @@ async function _applyResponsePluginHooks(
305311

306312
}
307313

308-
export function storeTimeline(timeline: ResponseTimelineEntry[]): Promise<string> {
309-
const timelineStr = JSON.stringify(timeline, null, '\t');
310-
const timelineHash = uuidv4();
311-
const responsesDir = pathJoin(process.env['INSOMNIA_DATA_PATH'] || (process.type === 'renderer' ? window : electron).app.getPath('userData'), 'responses');
314+
// export function storeTimeline(timeline: ResponseTimelineEntry[]): Promise<string> {
315+
// const timelineStr = JSON.stringify(timeline, null, '\t');
316+
// const timelineHash = uuidv4();
317+
// const responsesDir = pathJoin(process.env['INSOMNIA_DATA_PATH'] || (process.type === 'renderer' ? window : electron).app.getPath('userData'), 'responses');
312318

313-
fs.mkdirSync(responsesDir, { recursive: true });
319+
// fs.mkdirSync(responsesDir, { recursive: true });
314320

315-
const timelinePath = pathJoin(responsesDir, timelineHash + '.timeline');
316-
if (process.type === 'renderer') {
317-
return window.main.writeFile({ path: timelinePath, content: timelineStr });
318-
}
319-
return new Promise<string>((resolve, reject) => {
320-
fs.writeFile(timelinePath, timelineStr, err => {
321-
if (err != null) {
322-
return reject(err);
323-
}
324-
resolve(timelinePath);
325-
});
326-
});
327-
}
321+
// const timelinePath = pathJoin(responsesDir, timelineHash + '.timeline');
322+
// if (process.type === 'renderer') {
323+
// return window.main.writeFile({ path: timelinePath, content: timelineStr });
324+
// }
325+
// return new Promise<string>((resolve, reject) => {
326+
// fs.writeFile(timelinePath, timelineStr, err => {
327+
// if (err != null) {
328+
// return reject(err);
329+
// }
330+
// resolve(timelinePath);
331+
// });
332+
// });
333+
// }

packages/insomnia/src/network/o-auth-2/get-token.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,11 @@ const sendAccessTokenRequest = async (requestId: string, authentication: AuthTyp
297297
settings,
298298
clientCertificates,
299299
caCert,
300-
activeEnvironmentId } = await fetchRequestData(requestId);
300+
activeEnvironmentId,
301+
timelineFileStream,
302+
timelinePath,
303+
responseId,
304+
} = await fetchRequestData(requestId);
301305

302306
const newRequest: Request = await models.initModel(models.request.type, {
303307
headers: [
@@ -324,6 +328,9 @@ const sendAccessTokenRequest = async (requestId: string, authentication: AuthTyp
324328
clientCertificates,
325329
caCert,
326330
{ ...settings, validateSSL: settings.validateAuthSSL },
331+
timelineFileStream,
332+
timelinePath,
333+
responseId,
327334
);
328335
const responsePatch = await responseTransform(response, activeEnvironmentId, renderedRequest, renderResult.context);
329336

packages/insomnia/src/network/unit-test-feature.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ export function getSendRequestCallback() {
1212
settings,
1313
clientCertificates,
1414
caCert,
15-
activeEnvironmentId } = await fetchRequestData(requestId);
16-
15+
activeEnvironmentId,
16+
timelineFileStream,
17+
timelinePath,
18+
responseId,
19+
} = await fetchRequestData(requestId);
1720
const renderResult = await tryToInterpolateRequest(request, environment._id, RENDER_PURPOSE_SEND);
1821
const renderedRequest = await tryToTransformRequestWithPlugins(renderResult);
1922

@@ -35,6 +38,9 @@ export function getSendRequestCallback() {
3538
clientCertificates,
3639
caCert,
3740
settings,
41+
timelineFileStream,
42+
timelinePath,
43+
responseId
3844
);
3945
const res = await responseTransform(response, activeEnvironmentId, renderedRequest, renderResult.context);
4046
const { statusCode: status, statusMessage, headers: headerArray, elapsedTime: responseTime } = res;

packages/insomnia/src/plugins/context/network.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ export function init() {
1212
settings,
1313
clientCertificates,
1414
caCert,
15-
activeEnvironmentId } = await fetchRequestData(req._id);
15+
activeEnvironmentId,
16+
timelineFileStream,
17+
timelinePath,
18+
responseId,
19+
} = await fetchRequestData(req._id);
1620

1721
const renderResult = await tryToInterpolateRequest(request, environment._id, RENDER_PURPOSE_SEND, extraInfo);
1822
const renderedRequest = await tryToTransformRequestWithPlugins(renderResult);
@@ -21,6 +25,9 @@ export function init() {
2125
clientCertificates,
2226
caCert,
2327
settings,
28+
timelineFileStream,
29+
timelinePath,
30+
responseId
2431
);
2532
const responsePatch = await responseTransform(response, activeEnvironmentId, renderedRequest, renderResult.context);
2633
return models.response.create(responsePatch, settings.maxHistoryResponses);

packages/insomnia/src/ui/components/editors/body/graph-ql-editor.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,11 @@ const fetchGraphQLSchemaForRequest = async ({
102102
settings,
103103
clientCertificates,
104104
caCert,
105-
activeEnvironmentId } = await fetchRequestData(introspectionRequest._id);
105+
activeEnvironmentId,
106+
timelineFileStream,
107+
timelinePath,
108+
responseId,
109+
} = await fetchRequestData(introspectionRequest._id);
106110

107111
const renderResult = await tryToInterpolateRequest(request, environment._id, RENDER_PURPOSE_SEND);
108112
const renderedRequest = await tryToTransformRequestWithPlugins(renderResult);
@@ -111,6 +115,9 @@ const fetchGraphQLSchemaForRequest = async ({
111115
clientCertificates,
112116
caCert,
113117
settings,
118+
timelineFileStream,
119+
timelinePath,
120+
responseId,
114121
);
115122
const response = await responseTransform(res, activeEnvironmentId, renderedRequest, renderResult.context);
116123
const statusCode = response.statusCode || 0;

packages/insomnia/src/ui/routes/request.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,9 @@ export const sendAction: ActionFunction = async ({ request, params }) => {
364364
clientCertificates,
365365
caCert,
366366
activeEnvironmentId,
367+
timelineFileStream,
368+
timelinePath,
369+
responseId,
367370
} = await fetchRequestData(requestId);
368371
try {
369372
const { shouldPromptForPathAfterResponse } = await request.json() as SendActionParams;
@@ -388,6 +391,9 @@ export const sendAction: ActionFunction = async ({ request, params }) => {
388391
clientCertificates,
389392
caCert,
390393
settings,
394+
timelineFileStream,
395+
timelinePath,
396+
responseId
391397
);
392398

393399
const requestMeta = await models.requestMeta.getByParentId(requestId);
@@ -446,7 +452,11 @@ export const createAndSendToMockbinAction: ActionFunction = async ({ request })
446452
settings,
447453
clientCertificates,
448454
caCert,
449-
activeEnvironmentId } = await fetchRequestData(req._id);
455+
activeEnvironmentId,
456+
timelineFileStream,
457+
timelinePath,
458+
responseId,
459+
} = await fetchRequestData(req._id);
450460

451461
const renderResult = await tryToInterpolateRequest(req, environment._id, RENDER_PURPOSE_SEND);
452462
const renderedRequest = await tryToTransformRequestWithPlugins(renderResult);
@@ -455,6 +465,9 @@ export const createAndSendToMockbinAction: ActionFunction = async ({ request })
455465
clientCertificates,
456466
caCert,
457467
settings,
468+
timelineFileStream,
469+
timelinePath,
470+
responseId,
458471
);
459472
const response = await responseTransform(res, activeEnvironmentId, renderedRequest, renderResult.context);
460473
await models.response.create(response);

packages/insomnia/tsconfig.build.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@
3333
"src/coverage",
3434
"src/main.min.js",
3535
"src/preload.js",
36+
"src/hidden-browser-window/build"
3637
],
3738
}

0 commit comments

Comments
 (0)