Add interceptors for MITM

This commit is contained in:
Sander Declerck 2025-11-06 18:00:11 +01:00
parent 0b056e92de
commit e251908cb3
No known key found for this signature in database
4 changed files with 123 additions and 11 deletions

View file

@ -0,0 +1,50 @@
/**
* @typedef {import('./requestInterceptorBuilder.js').RequestInterceptorBuilder} RequestInterceptorBuilder
* @typedef {import('./requestInterceptorBuilder.js').RequestInterceptor} RequestInterceptor
*
* @typedef {Object} InterceptorBuilder
* @property {(requestFunc: (requestHandlerBuilder: RequestInterceptorBuilder) => Promise<void>) => void} onRequest
* @property {() => Interceptor} build
*
* @typedef {Object} Interceptor
* @property {(targetUrl: string) => Promise<RequestInterceptor>} handleRequest
*/
import { createRequestInterceptorBuilder } from "./requestInterceptorBuilder.js";
/**
* @returns {InterceptorBuilder}
*/
export function createInterceptorBuilder() {
/**
* @type {Array<(requestHandlerBuilder: RequestInterceptorBuilder) => Promise<void>>}
*/
const requestHandlers = [];
return {
onRequest(requestFunc) {
requestHandlers.push(requestFunc);
},
build() {
return buildInterceptor(requestHandlers);
},
};
}
/**
* @param {Array<(requestHandlerBuilder: RequestInterceptorBuilder) => Promise<void>>} requestHandlers
* @returns {Interceptor}
*/
function buildInterceptor(requestHandlers) {
return {
async handleRequest(targetUrl) {
const reqInterceptorBuilder = createRequestInterceptorBuilder(targetUrl);
for (const handler of requestHandlers) {
await handler(reqInterceptorBuilder);
}
return reqInterceptorBuilder.build();
},
};
}

View file

@ -0,0 +1,30 @@
/**
* @typedef {Object} RequestInterceptorBuilder
* @property {string} targetUrl
* @property {(statusCode: number, message: string) => void} blockRequest
* @property {() => RequestInterceptor} build
*
* @typedef {Object} RequestInterceptor
* @property {{statusCode: number, message: string} | undefined} blockResponse
*/
/**
* @param {string} targetUrl
* @returns {RequestInterceptorBuilder}
*/
export function createRequestInterceptorBuilder(targetUrl) {
/** @type {{statusCode: number, message: string} | undefined} */
let blockResponse = undefined;
return {
targetUrl,
blockRequest(statusCode, message) {
blockResponse = { statusCode, message };
},
build() {
return {
blockResponse,
};
},
};
}