mirror of
https://github.com/Kong/insomnia.git
synced 2026-10-06 21:14:38 -04:00
refactor: decouple scripting environment imports
This commit is contained in:
38 files changed
+159
-191
No files matched your search
Generated
+1
@@ -27016,6 +27016,7 @@
|
||||
"version": "13.3.0",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@faker-js/faker": "9.7.0",
|
||||
"@seald-io/nedb": "^4.1.1",
|
||||
"clone": "^2.1.2",
|
||||
"deep-equal": "2.2.3",
|
||||
|
||||
File renamed without changes.
@@ -4,6 +4,10 @@ export * from './ndjson';
|
||||
export * from './type';
|
||||
export * from './misc';
|
||||
export * from './constants';
|
||||
export * from './response-reasons';
|
||||
export * from './faker-functions';
|
||||
export * from './protocol';
|
||||
export * from './url-matches-cert-host';
|
||||
export * from './preview-mode';
|
||||
export * from './platform';
|
||||
export * from './strings';
|
||||
|
||||
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,67 @@
|
||||
export const RESPONSE_CODE_REASONS: Record<number, string> = {
|
||||
[-222]: 'Plugin Error',
|
||||
100: 'Continue',
|
||||
101: 'Switching Protocols',
|
||||
200: 'OK',
|
||||
201: 'Created',
|
||||
202: 'Accepted',
|
||||
203: 'Non-Authoritative Information',
|
||||
204: 'No Content',
|
||||
205: 'Reset Content',
|
||||
206: 'Partial Content',
|
||||
207: 'Multi-Status',
|
||||
208: 'Already Reported',
|
||||
226: 'IM Used',
|
||||
300: 'Multiple Choices',
|
||||
301: 'Moved Permanently',
|
||||
302: 'Found',
|
||||
303: 'See Other',
|
||||
304: 'Not Modified',
|
||||
305: 'Use Proxy',
|
||||
306: 'Switch Proxy',
|
||||
307: 'Temporary Redirect',
|
||||
308: 'Permanent Redirect',
|
||||
400: 'Bad Request',
|
||||
401: 'Unauthorized',
|
||||
402: 'Payment Required',
|
||||
403: 'Forbidden',
|
||||
404: 'Not Found',
|
||||
405: 'Method Not Allowed',
|
||||
406: 'Not Acceptable',
|
||||
407: 'Proxy Authentication Required',
|
||||
408: 'Request Timeout',
|
||||
409: 'Conflict',
|
||||
410: 'Gone',
|
||||
411: 'Length Required',
|
||||
412: 'Precondition Failed',
|
||||
413: 'Payload Too Large',
|
||||
414: 'URI Too Long',
|
||||
415: 'Unsupported Media Type',
|
||||
416: 'Range Not Satisfiable',
|
||||
417: 'Expectation Failed',
|
||||
418: "I'm a Teapot",
|
||||
421: 'Misdirected Request',
|
||||
422: 'Unprocessable Entity',
|
||||
423: 'Locked',
|
||||
424: 'Failed Dependency',
|
||||
425: 'Too Early',
|
||||
426: 'Upgrade Required',
|
||||
428: 'Precondition Required',
|
||||
429: 'Too Many Requests',
|
||||
431: 'Request Header Fields Too Large',
|
||||
451: 'Unavailable For Legal Reasons',
|
||||
500: 'Internal Server Error',
|
||||
501: 'Not Implemented',
|
||||
502: 'Bad Gateway',
|
||||
503: 'Service Unavailable',
|
||||
504: 'Gateway Timeout',
|
||||
505: 'HTTP Version Not Supported',
|
||||
506: 'Variant Also Negotiates',
|
||||
507: 'Insufficient Storage',
|
||||
508: 'Loop Detected',
|
||||
509: 'Bandwidth Limit Exceeded',
|
||||
510: 'Not Extended',
|
||||
511: 'Network Authentication Required',
|
||||
598: 'Network read timeout error',
|
||||
599: 'Network Connect Timeout Error',
|
||||
};
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { urlMatchesCertHost } from '../url-matches-cert-host';
|
||||
import { urlMatchesCertHost } from './url-matches-cert-host';
|
||||
|
||||
describe('urlMatchesCertHost', () => {
|
||||
describe('when the certificate host has no wildcard', () => {
|
||||
+3
-2
@@ -1,6 +1,7 @@
|
||||
import { setDefaultProtocol } from '~/common/utils/url/protocol';
|
||||
import { setDefaultProtocol } from './protocol';
|
||||
|
||||
import { escapeRegex } from '../common/misc';
|
||||
const ESCAPE_REGEX_MATCH = /[-[\]/{}()*+?.\\^$|]/g;
|
||||
const escapeRegex = (value: string) => value.replace(ESCAPE_REGEX_MATCH, '\\$&');
|
||||
|
||||
const DEFAULT_PORT = 443;
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
"test": "vitest run"
|
||||
},
|
||||
"dependencies": {
|
||||
"@faker-js/faker": "9.7.0",
|
||||
"@seald-io/nedb": "^4.1.1",
|
||||
"clone": "^2.1.2",
|
||||
"deep-equal": "2.2.3",
|
||||
|
||||
+4
-6
@@ -1,8 +1,6 @@
|
||||
import type { ClientCertificate } from 'insomnia-data';
|
||||
import { models } from 'insomnia-data';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { filterClientCertificates } from '../certificate';
|
||||
import { type ClientCertificate, filterClientCertificates, type } from './client-certificate';
|
||||
|
||||
describe('filterClientCertificates', () => {
|
||||
const requestUrl = 'https://www.example.com:1234';
|
||||
@@ -18,7 +16,7 @@ describe('filterClientCertificates', () => {
|
||||
disabled: false,
|
||||
isPrivate: true,
|
||||
modified: 0,
|
||||
type: models.clientCertificate.type,
|
||||
type,
|
||||
created: 0,
|
||||
name: '',
|
||||
},
|
||||
@@ -33,7 +31,7 @@ describe('filterClientCertificates', () => {
|
||||
disabled: false,
|
||||
isPrivate: true,
|
||||
modified: 0,
|
||||
type: models.clientCertificate.type,
|
||||
type,
|
||||
created: 0,
|
||||
name: '',
|
||||
},
|
||||
@@ -51,7 +49,7 @@ describe('filterClientCertificates', () => {
|
||||
disabled: false,
|
||||
isPrivate: true,
|
||||
modified: 0,
|
||||
type: models.clientCertificate.type,
|
||||
type,
|
||||
created: 0,
|
||||
name: '',
|
||||
},
|
||||
@@ -1,3 +1,5 @@
|
||||
import { setDefaultProtocol, urlMatchesCertHost } from 'insomnia-data/common';
|
||||
|
||||
import type { BaseModel } from './base-types';
|
||||
|
||||
export const name = 'Client Certificate';
|
||||
@@ -38,3 +40,17 @@ export function init(): BaseClientCertificate {
|
||||
}
|
||||
|
||||
export const isClientCertificate = (model: Pick<BaseModel, 'type'>): model is ClientCertificate => model.type === type;
|
||||
|
||||
export function filterClientCertificates(clientCertificates: ClientCertificate[], requestUrl: string, protocol?: string) {
|
||||
const res = clientCertificates.filter(
|
||||
certificate =>
|
||||
!certificate.disabled && urlMatchesCertHost(setDefaultProtocol(certificate.host, protocol), requestUrl, true),
|
||||
);
|
||||
if (!res.length) {
|
||||
return clientCertificates.filter(
|
||||
certificate =>
|
||||
!certificate.disabled && urlMatchesCertHost(setDefaultProtocol(certificate.host, protocol), requestUrl, false),
|
||||
);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { OAuth1SignatureMethod } from 'insomnia/src/common/constants';
|
||||
import type { OAuth2ResponseType, RequestAuthentication } from 'insomnia-data';
|
||||
import type { OAuth1SignatureMethod } from 'insomnia-data/common';
|
||||
|
||||
import { Property } from './properties';
|
||||
import { Variable, VariableList } from './variables';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { expect } from 'chai';
|
||||
import { filterClientCertificates } from 'insomnia/src/network/certificate';
|
||||
import type { ClientCertificate, RequestHeader, RequestTestResult, Settings } from 'insomnia-data';
|
||||
import { models } from 'insomnia-data';
|
||||
|
||||
import { toPreRequestAuth } from './auth';
|
||||
import { getExistingConsole } from './console';
|
||||
@@ -202,7 +202,10 @@ export async function initInsomniaObject(rawObj: RequestContext, log: (...args:
|
||||
// todo: find if theres a better way to get the best cert
|
||||
// (╯°□°)╯︵ ┻━┻
|
||||
const ifUrlIncludesTag = checkIfUrlIncludesTag(rawObj.request.url);
|
||||
const matchedCertificates = filterClientCertificates(rawObj.clientCertificates || [], rawObj.request.url);
|
||||
const matchedCertificates = models.clientCertificate.filterClientCertificates(
|
||||
rawObj.clientCertificates || [],
|
||||
rawObj.request.url,
|
||||
);
|
||||
const initEmptyCert = ifUrlIncludesTag || matchedCertificates?.length === 0;
|
||||
if (initEmptyCert) {
|
||||
getExistingConsole().warn(
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { fakerFunctions } from 'insomnia/src/common/templating/faker-functions';
|
||||
import { fakerFunctions } from 'insomnia-data/common';
|
||||
import { Liquid } from 'liquidjs';
|
||||
|
||||
/** @ignore */
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { Ajv, type ErrorObject } from 'ajv';
|
||||
import * as chai from 'chai';
|
||||
import { RESPONSE_CODE_REASONS } from 'insomnia/src/common/constants';
|
||||
import type { sendCurlAndWriteTimelineError, sendCurlAndWriteTimelineResponse } from 'insomnia/src/network/network';
|
||||
import { services } from 'insomnia-data';
|
||||
import { RESPONSE_CODE_REASONS } from 'insomnia-data/common';
|
||||
|
||||
import { Cookie, type CookieOptions } from './cookies';
|
||||
import { CookieList } from './cookies';
|
||||
@@ -33,6 +32,22 @@ export interface ResponseContentInfo {
|
||||
contentType: string;
|
||||
}
|
||||
|
||||
export interface ScriptResponseError {
|
||||
error: string;
|
||||
}
|
||||
|
||||
export interface ScriptResponseData {
|
||||
statusCode?: number;
|
||||
statusMessage?: string;
|
||||
headers?: { name: string; value: string }[];
|
||||
elapsedTime: number;
|
||||
bytesRead?: number;
|
||||
bodyPath?: string;
|
||||
bodyCompression?: 'zip' | null;
|
||||
}
|
||||
|
||||
export type ScriptResponseInput = ScriptResponseData | ScriptResponseError;
|
||||
|
||||
// TODO: unknown usage
|
||||
// export interface Timings
|
||||
|
||||
@@ -343,14 +358,14 @@ export class Response extends Property {
|
||||
|
||||
export function toScriptResponse(
|
||||
originalRequest: Request,
|
||||
partialInsoResponse: sendCurlAndWriteTimelineResponse | sendCurlAndWriteTimelineError,
|
||||
partialInsoResponse: ScriptResponseInput,
|
||||
responseBody: string,
|
||||
): Response | undefined {
|
||||
if ('error' in partialInsoResponse) {
|
||||
// it is sendCurlAndWriteTimelineError and basically doesn't contain anything useful
|
||||
return undefined;
|
||||
}
|
||||
const partialResponse = partialInsoResponse as sendCurlAndWriteTimelineResponse;
|
||||
const partialResponse = partialInsoResponse;
|
||||
|
||||
const headers = partialResponse.headers
|
||||
? partialResponse.headers.map(
|
||||
@@ -385,9 +400,7 @@ export function toScriptResponse(
|
||||
return new Response(responseOption);
|
||||
}
|
||||
|
||||
export async function readBodyFromPath(
|
||||
response: sendCurlAndWriteTimelineResponse | sendCurlAndWriteTimelineError | undefined,
|
||||
) {
|
||||
export async function readBodyFromPath(response: ScriptResponseInput | undefined) {
|
||||
// it allows to execute scripts (e.g., for testing) but body contains nothing
|
||||
if (!response || 'error' in response) {
|
||||
return '';
|
||||
|
||||
@@ -3,8 +3,5 @@ import { defineConfig } from 'vitest/config';
|
||||
export default defineConfig({
|
||||
test: {
|
||||
hideSkippedTests: true,
|
||||
alias: {
|
||||
'~/': new URL('../insomnia/src/', import.meta.url).pathname,
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -471,79 +471,6 @@ export const RESPONSE_CODE_DESCRIPTIONS: Record<number, string> = {
|
||||
599: 'An error used by some HTTP proxies to signal a network connect timeout behind the proxy to a client in front of the proxy.',
|
||||
};
|
||||
|
||||
export const RESPONSE_CODE_REASONS: Record<number, string> = {
|
||||
// Special
|
||||
[STATUS_CODE_PLUGIN_ERROR]: 'Plugin Error',
|
||||
// 100s
|
||||
100: 'Continue',
|
||||
101: 'Switching Protocols',
|
||||
// 200s
|
||||
200: 'OK',
|
||||
201: 'Created',
|
||||
202: 'Accepted',
|
||||
203: 'Non-Authoritative Information',
|
||||
204: 'No Content',
|
||||
205: 'Reset Content',
|
||||
206: 'Partial Content',
|
||||
207: 'Multi-Status',
|
||||
208: 'Already Reported',
|
||||
226: 'IM Used',
|
||||
// 300s
|
||||
300: 'Multiple Choices',
|
||||
301: 'Moved Permanently',
|
||||
302: 'Found',
|
||||
303: 'See Other',
|
||||
304: 'Not Modified',
|
||||
305: 'Use Proxy',
|
||||
306: 'Switch Proxy',
|
||||
307: 'Temporary Redirect',
|
||||
308: 'Permanent Redirect',
|
||||
// 400s
|
||||
400: 'Bad Request',
|
||||
401: 'Unauthorized',
|
||||
402: 'Payment Required',
|
||||
403: 'Forbidden',
|
||||
404: 'Not Found',
|
||||
405: 'Method Not Allowed',
|
||||
406: 'Not Acceptable',
|
||||
407: 'Proxy Authentication Required',
|
||||
408: 'Request Timeout',
|
||||
409: 'Conflict',
|
||||
410: 'Gone',
|
||||
411: 'Length Required',
|
||||
412: 'Precondition Failed',
|
||||
413: 'Payload Too Large',
|
||||
414: 'URI Too Long',
|
||||
415: 'Unsupported Media Type',
|
||||
416: 'Range Not Satisfiable',
|
||||
417: 'Expectation Failed',
|
||||
418: "I'm a Teapot",
|
||||
421: 'Misdirected Request',
|
||||
422: 'Unprocessable Entity',
|
||||
423: 'Locked',
|
||||
424: 'Failed Dependency',
|
||||
425: 'Too Early',
|
||||
426: 'Upgrade Required',
|
||||
428: 'Precondition Required',
|
||||
429: 'Too Many Requests',
|
||||
431: 'Request Header Fields Too Large',
|
||||
451: 'Unavailable For Legal Reasons',
|
||||
// 500s
|
||||
500: 'Internal Server Error',
|
||||
501: 'Not Implemented',
|
||||
502: 'Bad Gateway',
|
||||
503: 'Service Unavailable',
|
||||
504: 'Gateway Timeout',
|
||||
505: 'HTTP Version Not Supported',
|
||||
506: 'Variant Also Negotiates',
|
||||
507: 'Insufficient Storage',
|
||||
508: 'Loop Detected',
|
||||
509: 'Bandwidth Limit Exceeded',
|
||||
510: 'Not Extended',
|
||||
511: 'Network Authentication Required',
|
||||
598: 'Network read timeout error',
|
||||
599: 'Network Connect Timeout Error',
|
||||
};
|
||||
|
||||
// (ms) curently server timeout is 30s
|
||||
export const INSOMNIA_FETCH_TIME_OUT = 30_000;
|
||||
|
||||
@@ -12,6 +12,7 @@ import type {
|
||||
Workspace,
|
||||
} from 'insomnia-data';
|
||||
import { models, services } from 'insomnia-data';
|
||||
import { setDefaultProtocol } from 'insomnia-data/common';
|
||||
import orderedJSON from 'json-order';
|
||||
|
||||
import { NUNJUCKS_TEMPLATE_GLOBAL_PROPERTY_NAME } from '~/common/templating/constants';
|
||||
@@ -25,7 +26,6 @@ import type {
|
||||
RenderedRequest,
|
||||
} from '~/common/templating/types';
|
||||
import * as templatingUtils from '~/common/templating/utils';
|
||||
import { setDefaultProtocol } from '~/common/utils/url/protocol';
|
||||
|
||||
import { getOrInheritAuthentication, getOrInheritHeaders, shouldSuppressUserAgent } from '../network/network';
|
||||
import { getRuntime } from '../runtimes';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { RequestTestResult } from 'insomnia-data';
|
||||
import { RESPONSE_CODE_REASONS } from 'insomnia-data/common';
|
||||
|
||||
import { RESPONSE_CODE_REASONS } from './constants';
|
||||
import { describeByteSize } from './misc';
|
||||
|
||||
export type RunnerItemStatus = 'pending' | 'running' | 'completed' | 'failed' | 'canceled' | 'skipped';
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { format } from 'date-fns';
|
||||
import type { PluginTemplateTag } from 'insomnia/src/common/templating/types';
|
||||
import { fakerFunctions } from 'insomnia-data/common';
|
||||
import JSONBig from 'json-bigint';
|
||||
import { JSONPath } from 'jsonpath-plus';
|
||||
|
||||
@@ -7,8 +8,6 @@ import type { TemplateTag } from '~/common/plugins/types';
|
||||
import { invariant } from '~/common/utils/invariant';
|
||||
import { utf8StringFromBytes } from '~/common/utils/utf8-bytes';
|
||||
|
||||
import { fakerFunctions } from './faker-functions';
|
||||
|
||||
const JSONBigStringParser = JSONBig({ storeAsString: true });
|
||||
|
||||
const localTemplatePlugins: { templateTag: PluginTemplateTag }[] = [
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import type { IQueryStringOptions, StrictNullSearchParamsValueType } from 'insomnia-data/common';
|
||||
import { deconstructQueryStringToParams } from 'insomnia-data/common';
|
||||
|
||||
import { setDefaultProtocol } from './protocol';
|
||||
import { deconstructQueryStringToParams, setDefaultProtocol } from 'insomnia-data/common';
|
||||
|
||||
const ESCAPE_REGEX_MATCH = /[-[\]/{}()*+?.\\^$|]/g;
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@ import { parse as urlParse } from 'node:url';
|
||||
import { Curl, CurlAuth, CurlFeature, CurlSslOpt, type HeaderInfo } from '@getinsomnia/node-libcurl';
|
||||
import { app, net, protocol, session } from 'electron';
|
||||
import { services } from 'insomnia-data';
|
||||
import { ProxyScopes } from 'insomnia-data/common';
|
||||
import { ProxyScopes, setDefaultProtocol } from 'insomnia-data/common';
|
||||
|
||||
import { getApiBaseURL } from '../common/constants';
|
||||
import { parseResolvedProxy, setDefaultProtocol, shouldBypassProxyForHost } from './network/libcurl-promise';
|
||||
import { parseResolvedProxy, shouldBypassProxyForHost } from './network/libcurl-promise';
|
||||
import { resolveDbByKey } from './templating-worker-database';
|
||||
|
||||
export interface RegisterProtocolOptions {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { CONTENT_TYPE_JSON, CONTENT_TYPE_PLAINTEXT, CONTENT_TYPE_XML } from 'insomnia/src/common/constants';
|
||||
import { fakerFunctions } from 'insomnia/src/common/templating/faker-functions';
|
||||
import { forceBracketNotation } from 'insomnia/src/common/templating/utils';
|
||||
import type { AuthTypeOAuth2 } from 'insomnia-data';
|
||||
import { fakerFunctions } from 'insomnia-data/common';
|
||||
|
||||
import { translateHandlersInScript } from '~/main/importers/importers/translate-postman-script';
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { Readable } from 'node:stream';
|
||||
import { Curl, CurlFeature, CurlInfoDebug, type HeaderInfo } from '@getinsomnia/node-libcurl';
|
||||
import electron, { BrowserWindow } from 'electron';
|
||||
import type { Response } from 'insomnia-data';
|
||||
import { services } from 'insomnia-data';
|
||||
import { models, services } from 'insomnia-data';
|
||||
import { v4 as uuidV4 } from 'uuid';
|
||||
|
||||
import { REALTIME_EVENTS_CHANNELS } from '~/common/constants';
|
||||
@@ -14,7 +14,6 @@ import { invariant } from '~/common/utils/invariant';
|
||||
import { insecureReadFile } from '~/main/secure-read-file';
|
||||
|
||||
import { describeByteSize, generateId, getSetCookieHeaders } from '../../common/misc';
|
||||
import { filterClientCertificates } from '../../network/certificate';
|
||||
import { parseHeaderStrings } from '../../network/parse-header-strings';
|
||||
import { addSetCookiesToToughCookieJar } from '../../network/set-cookie-util';
|
||||
import { ipcMainHandle, ipcMainOn } from '../ipc/electron';
|
||||
@@ -151,7 +150,11 @@ const openCurlConnection = async (
|
||||
const settings = await services.settings.get();
|
||||
const start = performance.now();
|
||||
const clientCertificates = await services.clientCertificate.findByParentId(workspaceId);
|
||||
const filteredClientCertificates = filterClientCertificates(clientCertificates, req.url, 'https:');
|
||||
const filteredClientCertificates = models.clientCertificate.filterClientCertificates(
|
||||
clientCertificates,
|
||||
req.url,
|
||||
'https:',
|
||||
);
|
||||
|
||||
const { header: authHeader, timeline: authTimeline } = await getAuthHeader(req, req.url);
|
||||
authTimeline?.forEach(entry => timelineFileStreams.get(requestId)?.write(JSON.stringify(entry) + '\n'));
|
||||
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
import { isValid } from 'date-fns';
|
||||
import electron from 'electron';
|
||||
import type { ClientCertificate, RequestHeader, ResponseHeader, ResponseTimelineEntry } from 'insomnia-data';
|
||||
import { setDefaultProtocol } from 'insomnia-data/common';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
import { invariant } from '~/common/utils/invariant';
|
||||
@@ -669,20 +670,3 @@ export function shouldBypassProxyForHost(hostname: string | null, noProxy: strin
|
||||
return normalizedHostname === entry;
|
||||
});
|
||||
}
|
||||
|
||||
export const setDefaultProtocol = (url: string, defaultProto?: string) => {
|
||||
const trimmedUrl = url.trim();
|
||||
defaultProto = defaultProto || 'http:';
|
||||
|
||||
// If no url, don't bother returning anything
|
||||
if (!trimmedUrl) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// Default the proto if it doesn't exist
|
||||
if (!trimmedUrl.includes('://')) {
|
||||
return `${defaultProto}//${trimmedUrl}`;
|
||||
}
|
||||
|
||||
return trimmedUrl;
|
||||
};
|
||||
@@ -14,10 +14,10 @@ import type {
|
||||
ResponseTimelineEntry,
|
||||
} from 'insomnia-data';
|
||||
import { database as db, models, services } from 'insomnia-data';
|
||||
import { setDefaultProtocol } from 'insomnia-data/common';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
import { invariant } from '~/common/utils/invariant';
|
||||
import { setDefaultProtocol } from '~/common/utils/url/protocol';
|
||||
import { authorizeUserInDefaultBrowser } from '~/main/authorize-user-in-default-browser';
|
||||
import { authorizeUserInWindow } from '~/main/authorize-user-in-window';
|
||||
import { getElectronStorage as getSharedElectronStorage } from '~/main/electron-storage';
|
||||
|
||||
@@ -12,18 +12,17 @@ import type {
|
||||
RequestHeader,
|
||||
SocketIOResponse,
|
||||
} from 'insomnia-data';
|
||||
import { services } from 'insomnia-data';
|
||||
import { models, services } from 'insomnia-data';
|
||||
import { setDefaultProtocol } from 'insomnia-data/common';
|
||||
import { io as SocketIOClient, type ManagerOptions, type Socket, type SocketOptions } from 'socket.io-client';
|
||||
import { v4 as uuidV4 } from 'uuid';
|
||||
|
||||
import { REALTIME_EVENTS_CHANNELS } from '~/common/constants';
|
||||
import { invariant } from '~/common/utils/invariant';
|
||||
import { setDefaultProtocol } from '~/common/utils/url/protocol';
|
||||
|
||||
import { version } from '../../../package.json';
|
||||
import { jarFromCookies } from '../../common/cookies';
|
||||
import { generateId } from '../../common/misc';
|
||||
import { filterClientCertificates } from '../../network/certificate';
|
||||
import { ipcMainHandle, ipcMainOn } from '../ipc/electron';
|
||||
import { insecureReadFile, secureReadFile } from '../secure-read-file';
|
||||
|
||||
@@ -170,7 +169,7 @@ const getCertificates = async ({
|
||||
(caCertficatePath && (await insecureReadFile(caCertficatePath))) || tls.rootCertificates.join('\n');
|
||||
|
||||
const clientCertificates = await services.clientCertificate.findByParentId(workspaceId);
|
||||
const filteredClientCertificates = filterClientCertificates(clientCertificates, url, 'wss:');
|
||||
const filteredClientCertificates = models.clientCertificate.filterClientCertificates(clientCertificates, url, 'wss:');
|
||||
const pemCertificates: string[] = [];
|
||||
const pemCertificateKeys: string[] = [];
|
||||
const pfxCertificates: string[] = [];
|
||||
|
||||
@@ -16,6 +16,7 @@ import type {
|
||||
WebSocketResponse,
|
||||
} from 'insomnia-data';
|
||||
import { models, services } from 'insomnia-data';
|
||||
import { setDefaultProtocol } from 'insomnia-data/common';
|
||||
import { v4 as uuidV4 } from 'uuid';
|
||||
import { type CloseEvent, type ErrorEvent, type Event, type MessageEvent, WebSocket } from 'ws';
|
||||
|
||||
@@ -24,7 +25,6 @@ import { database } from '~/common/database';
|
||||
import type { RenderedRequest } from '~/common/templating/types';
|
||||
import { parseGraphQLReqeustBody } from '~/common/utils/graph-ql';
|
||||
import { invariant } from '~/common/utils/invariant';
|
||||
import { setDefaultProtocol } from '~/common/utils/url/protocol';
|
||||
import { buildQueryStringFromParams, joinUrlAndQueryString } from '~/common/utils/url/querystring';
|
||||
|
||||
import { version } from '../../../package.json';
|
||||
@@ -33,7 +33,6 @@ import { generateId, getSetCookieHeaders } from '../../common/misc';
|
||||
import { COOKIE, HEADER, QUERY_PARAMS } from '../../network/api-key/constants';
|
||||
import { getBasicAuthHeader } from '../../network/basic-auth/get-header';
|
||||
import { getBearerAuthHeader } from '../../network/bearer-auth/get-header';
|
||||
import { filterClientCertificates } from '../../network/certificate';
|
||||
import { addSetCookiesToToughCookieJar } from '../../network/set-cookie-util';
|
||||
import { ipcMainHandle, ipcMainOn } from '../ipc/electron';
|
||||
import { insecureReadFile, secureReadFile } from '../secure-read-file';
|
||||
@@ -242,7 +241,11 @@ const openWebSocketConnection = async (
|
||||
const start = performance.now();
|
||||
|
||||
const clientCertificates = await services.clientCertificate.findByParentId(options.workspaceId);
|
||||
const filteredClientCertificates = filterClientCertificates(clientCertificates, options.url, 'wss:');
|
||||
const filteredClientCertificates = models.clientCertificate.filterClientCertificates(
|
||||
clientCertificates,
|
||||
options.url,
|
||||
'wss:',
|
||||
);
|
||||
const pemCertificates: string[] = [];
|
||||
const pemCertificateKeys: KeyObject[] = [];
|
||||
const pfxCertificates: PxfObject[] = [];
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { session } from 'electron/main';
|
||||
import { models, services } from 'insomnia-data';
|
||||
import { ProxyScopes } from 'insomnia-data/common';
|
||||
import { ProxyScopes, setDefaultProtocol } from 'insomnia-data/common';
|
||||
|
||||
import {
|
||||
getAIServiceURL,
|
||||
@@ -12,7 +12,6 @@ import {
|
||||
getMockServiceURL,
|
||||
getSentryDsn,
|
||||
} from '~/common/constants';
|
||||
import { setDefaultProtocol } from '~/common/utils/url/protocol';
|
||||
|
||||
import { type ChangeBufferEvent, database as db } from '../common/database';
|
||||
import { getUpdatesBaseURL } from './updates';
|
||||
|
||||
@@ -8,7 +8,7 @@ import { app, BrowserWindow, clipboard, dialog, shell } from 'electron';
|
||||
import iconv from 'iconv-lite';
|
||||
import type { AllTypes, CloudProviderCredential, Request as DBRequest, RequestGroup, Workspace } from 'insomnia-data';
|
||||
import { services } from 'insomnia-data';
|
||||
import { ProxyScopes } from 'insomnia-data/common';
|
||||
import { ProxyScopes, RESPONSE_CODE_REASONS } from 'insomnia-data/common';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
import { jarFromCookies } from '~/common/cookies';
|
||||
@@ -28,7 +28,7 @@ import {
|
||||
} from '~/templating/sandbox/marshal';
|
||||
import type { SandboxModuleDenialError } from '~/templating/sandbox/plugin-tag-sandbox';
|
||||
|
||||
import { getAppBundlePlugins, RESPONSE_CODE_REASONS } from '../common/constants';
|
||||
import { getAppBundlePlugins } from '../common/constants';
|
||||
import { isDevelopment } from '../common/constants';
|
||||
import { database as db } from '../common/database';
|
||||
import { fetchRequestData, sendCurlAndWriteTimeline, tryToInterpolateRequest } from '../network/network';
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
import type { ClientCertificate } from 'insomnia-data';
|
||||
|
||||
import { setDefaultProtocol } from '~/common/utils/url/protocol';
|
||||
|
||||
import { urlMatchesCertHost } from './url-matches-cert-host';
|
||||
|
||||
export function filterClientCertificates(
|
||||
clientCertificates: ClientCertificate[],
|
||||
requestUrl: string,
|
||||
protocol?: string,
|
||||
) {
|
||||
const res = clientCertificates.filter(
|
||||
c => !c.disabled && urlMatchesCertHost(setDefaultProtocol(c.host, protocol), requestUrl, true),
|
||||
);
|
||||
// If didn't get a matching certificate at the first time, ignore the port check and try again
|
||||
if (!res.length) {
|
||||
return clientCertificates.filter(
|
||||
c => !c.disabled && urlMatchesCertHost(setDefaultProtocol(c.host, protocol), requestUrl, false),
|
||||
);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -41,7 +41,6 @@ import { ascendingFirstIndexStringSort } from '../common/sorting';
|
||||
import type { ResponsePatch } from '../main/network/libcurl-promise';
|
||||
import { QUERY_PARAMS } from './api-key/constants';
|
||||
import { getAuthObjectOrNull, isAuthEnabled } from './authentication';
|
||||
import { filterClientCertificates } from './certificate';
|
||||
import type { TransformedExecuteScriptContext } from './concurrency.renderer';
|
||||
|
||||
const { isRequest } = models.request;
|
||||
@@ -876,7 +875,7 @@ export async function sendCurlAndWriteTimeline(
|
||||
finalUrl,
|
||||
socketPath,
|
||||
settings,
|
||||
certificates: filterClientCertificates(clientCertificates, renderedRequest.url, 'https:'),
|
||||
certificates: models.clientCertificate.filterClientCertificates(clientCertificates, renderedRequest.url, 'https:'),
|
||||
caCertficatePath: caCert?.disabled === false ? caCert.path : null,
|
||||
authHeader,
|
||||
};
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import { services } from 'insomnia-data';
|
||||
import { ProxyScopes } from 'insomnia-data/common';
|
||||
import { ProxyScopes, RESPONSE_CODE_REASONS } from 'insomnia-data/common';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
import type { NodeCurlRequestOptions, NodeCurlResponseType, PluginTemplateTagContext } from '~/common/templating/types';
|
||||
|
||||
import { RESPONSE_CODE_REASONS } from '../../common/constants';
|
||||
import {
|
||||
fetchRequestData,
|
||||
responseTransform,
|
||||
|
||||
+1
-1
@@ -2,6 +2,7 @@ import type * as Har from 'har-format';
|
||||
import { isApiError, upsertMockbin } from 'insomnia-api';
|
||||
import type { MockRoute, MockServer, Request, RequestHeader, Response } from 'insomnia-data';
|
||||
import { models, services } from 'insomnia-data';
|
||||
import { RESPONSE_CODE_REASONS } from 'insomnia-data/common';
|
||||
import { useCallback } from 'react';
|
||||
import { Button, Tab, TabList, TabPanel, Tabs, Toolbar } from 'react-aria-components';
|
||||
import { useParams, useRouteLoaderData } from 'react-router';
|
||||
@@ -15,7 +16,6 @@ import {
|
||||
contentTypesMap,
|
||||
getMockServiceBinURL,
|
||||
getMockServiceURL,
|
||||
RESPONSE_CODE_REASONS,
|
||||
} from '~/common/constants';
|
||||
import { database as db } from '~/common/database';
|
||||
import { invariant } from '~/common/utils/invariant';
|
||||
|
||||
@@ -2,6 +2,7 @@ import type { IconProp } from '@fortawesome/fontawesome-svg-core';
|
||||
import { getOnboardingState, type UserOnboarding } from 'insomnia-api';
|
||||
import type { Request } from 'insomnia-data';
|
||||
import { services } from 'insomnia-data';
|
||||
import { setDefaultProtocol } from 'insomnia-data/common';
|
||||
import { type KeyboardEvent as ReactKeyboardEvent, useEffect, useRef, useState } from 'react';
|
||||
import { useParams } from 'react-router';
|
||||
|
||||
@@ -10,7 +11,6 @@ import { SelectPopover } from '~/basic-components/select-popover';
|
||||
import { getCurrentSessionId } from '~/common/account/session';
|
||||
import { METHOD_GET } from '~/common/constants';
|
||||
import { isCurlCommand } from '~/common/utils/curl';
|
||||
import { setDefaultProtocol } from '~/common/utils/url/protocol';
|
||||
import { useRootLoaderData } from '~/root';
|
||||
import { AnalyticsEvent } from '~/ui/analytics';
|
||||
import { MethodSelector } from '~/ui/components/dropdowns/method-selector';
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import type { GrpcRequest, GrpcRequestHeader, RequestGroup } from 'insomnia-data';
|
||||
import { models, services } from 'insomnia-data';
|
||||
import { setDefaultProtocol, urlMatchesCertHost } from 'insomnia-data/common';
|
||||
import React, { type FunctionComponent, useRef, useState } from 'react';
|
||||
import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components';
|
||||
import { useParams } from 'react-router';
|
||||
import * as reactUse from 'react-use';
|
||||
|
||||
import { RenderError } from '~/common/templating/render-error';
|
||||
import { setDefaultProtocol } from '~/common/utils/url/protocol';
|
||||
import { useRootLoaderData } from '~/root';
|
||||
import { AnalyticsEvent } from '~/ui/analytics';
|
||||
import { CodeEditor, type CodeEditorHandle } from '~/ui/components/.client/codemirror/code-editor';
|
||||
@@ -21,7 +21,6 @@ import { generateId } from '../../../common/misc';
|
||||
import { getRenderedGrpcRequest, getRenderedGrpcRequestMessage } from '../../../common/render';
|
||||
import type { GrpcMethodType } from '../../../main/ipc/grpc';
|
||||
import { getOrInheritHeaders } from '../../../network/network';
|
||||
import { urlMatchesCertHost } from '../../../network/url-matches-cert-host';
|
||||
import { useWorkspaceLoaderData } from '../../../routes/organization.$organizationId.project.$projectId.workspace.$workspaceId';
|
||||
import type { GrpcRequestState } from '../../../routes/organization.$organizationId.project.$projectId.workspace.$workspaceId.debug';
|
||||
import {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import classnames from 'classnames';
|
||||
import { RESPONSE_CODE_REASONS } from 'insomnia-data/common';
|
||||
import React, { type FC, memo, type ReactNode } from 'react';
|
||||
|
||||
import { RESPONSE_CODE_DESCRIPTIONS, RESPONSE_CODE_REASONS } from '../../../common/constants';
|
||||
import { RESPONSE_CODE_DESCRIPTIONS } from '../../../common/constants';
|
||||
import { Tooltip } from '../tooltip';
|
||||
|
||||
interface Props {
|
||||
|
||||
@@ -1,15 +1,5 @@
|
||||
{
|
||||
"insomnia": [
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/common/render.ts -> packages/insomnia/src/common/templating/mask-or-decrypt-vault-data.ts -> packages/insomnia/src/common/utils/vault.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/common/render.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/common/templating/mask-or-decrypt-vault-data.ts -> packages/insomnia/src/common/utils/vault.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/common/templating/mask-or-decrypt-vault-data.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/network/concurrency.renderer.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/index.ts -> packages/insomnia-scripting-environment/src/objects/insomnia.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/index.ts -> packages/insomnia-scripting-environment/src/objects/insomnia.ts -> packages/insomnia-scripting-environment/src/objects/send-request.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/index.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts",
|
||||
"packages/insomnia/src/common/import.ts -> packages/insomnia/src/common/insomnia-v5.ts",
|
||||
"packages/insomnia/src/common/render.ts -> packages/insomnia/src/network/network.ts",
|
||||
"packages/insomnia/src/main/git-service.ts -> packages/insomnia/src/sync/git/repo-file-watcher.ts",
|
||||
@@ -98,18 +88,7 @@
|
||||
"insomnia-api": [],
|
||||
"insomnia-data": [],
|
||||
"insomnia-inso": [],
|
||||
"insomnia-scripting-environment": [
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/common/render.ts -> packages/insomnia/src/common/templating/mask-or-decrypt-vault-data.ts -> packages/insomnia/src/common/utils/vault.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/common/render.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/common/templating/mask-or-decrypt-vault-data.ts -> packages/insomnia/src/common/utils/vault.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/common/templating/mask-or-decrypt-vault-data.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/network/concurrency.renderer.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/collection.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts -> packages/insomnia/src/runtimes/index.ts -> packages/insomnia/src/runtimes/types.ts -> packages/insomnia-scripting-environment/src/objects/index.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/index.ts -> packages/insomnia-scripting-environment/src/objects/insomnia.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/index.ts -> packages/insomnia-scripting-environment/src/objects/insomnia.ts -> packages/insomnia-scripting-environment/src/objects/send-request.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts",
|
||||
"packages/insomnia-scripting-environment/src/objects/index.ts -> packages/insomnia-scripting-environment/src/objects/response.ts -> packages/insomnia/src/network/network.ts"
|
||||
],
|
||||
"insomnia-scripting-environment": [],
|
||||
"insomnia-smoke-test": [],
|
||||
"insomnia-testing": [],
|
||||
"insomnia-vcs": []
|
||||
|
||||
Reference in new issue
Block a user