fix: use correct request ID header in context

This commit is contained in:
WebStreamr 2025-07-20 11:30:40 +00:00
parent 70e6e670f3
commit 1a37662502
No known key found for this signature in database
4 changed files with 17 additions and 11 deletions

View file

@ -2,7 +2,7 @@ import { Request, Response, Router } from 'express';
import { ContentType } from 'stremio-addon-sdk';
import winston from 'winston';
import { Source } from '../source';
import { contextFromRequest, envIsProd, ImdbId, StreamResolver } from '../utils';
import { contextFromRequestAndResponse, envIsProd, ImdbId, StreamResolver } from '../utils';
export class StreamController {
public readonly router: Router;
@ -25,7 +25,7 @@ export class StreamController {
const type: ContentType = (req.params['type'] || '') as ContentType;
const id: string = req.params['id'] || '';
const ctx = contextFromRequest(req);
const ctx = contextFromRequestAndResponse(req, res);
this.logger.info(`Search stream for type "${type}" and id "${id}" for ip ${ctx.ip}`, ctx);

View file

@ -6,7 +6,7 @@ import winston from 'winston';
import { ConfigureController, ManifestController, StreamController } from './controller';
import { createExtractors, ExtractorRegistry } from './extractor';
import { CineHDPlus, Cuevana, Eurostreaming, Frembed, FrenchCloud, HomeCine, KinoGer, MegaKino, MeineCloud, MostraGuarda, Movix, PrimeWire, Soaper, Source, StreamKiste, VerHdLink, VidSrc, VixSrc } from './source';
import { contextFromRequest, envGet, envIsProd, Fetcher, StreamResolver } from './utils';
import { contextFromRequestAndResponse, envGet, envIsProd, Fetcher, StreamResolver } from './utils';
const logger = winston.createLogger({
transports: [
@ -83,7 +83,7 @@ addon.get('/', (_req: Request, res: Response) => {
});
addon.get('/health', async (req: Request, res: Response) => {
const ctx = contextFromRequest(req);
const ctx = contextFromRequestAndResponse(req, res);
try {
const ip = await fetcher.text(ctx, new URL('https://api.ipify.org'), { noCache: true, noProxyHeaders: true });

View file

@ -1,5 +1,5 @@
import { Request } from 'express';
import { contextFromRequest } from './context';
import { Request, Response } from 'express';
import { contextFromRequestAndResponse } from './context';
describe('contextFromRequest', () => {
test('with config and ip', () => {
@ -12,8 +12,11 @@ describe('contextFromRequest', () => {
ip: '127.0.0.1',
params: { config: '{"de":"on"}' },
};
const res = {
getHeader: (name: string) => ({ 'X-Request-ID': 'fake-id' })[name],
};
expect(contextFromRequest(req as unknown as Request)).toMatchSnapshot();
expect(contextFromRequestAndResponse(req as unknown as Request, res as unknown as Response)).toMatchSnapshot();
});
test('without config', () => {
@ -25,7 +28,10 @@ describe('contextFromRequest', () => {
},
params: { },
};
const res = {
getHeader: (name: string) => ({ 'X-Request-ID': 'fake-id' })[name],
};
expect(contextFromRequest(req as unknown as Request)).toMatchSnapshot();
expect(contextFromRequestAndResponse(req as unknown as Request, res as unknown as Response)).toMatchSnapshot();
});
});

View file

@ -1,11 +1,11 @@
import { Request } from 'express';
import { Request, Response } from 'express';
import { Context } from '../types';
import { getDefaultConfig } from './config';
export const contextFromRequest = (req: Request): Context => {
export const contextFromRequestAndResponse = (req: Request, res: Response): Context => {
return {
hostUrl: new URL(`${req.protocol}://${req.host}`),
id: req.headers['X-Request-ID'] as string,
id: res.getHeader('X-Request-ID') as string,
...(req.ip && { ip: req.ip }),
config: req.params['config'] ? JSON.parse(req.params['config']) : getDefaultConfig(),
};