From 1a37662502c68effdb153b887ba47f495b17585d Mon Sep 17 00:00:00 2001 From: WebStreamr <210764791+webstreamr@users.noreply.github.com> Date: Sun, 20 Jul 2025 11:30:40 +0000 Subject: [PATCH] fix: use correct request ID header in context --- src/controller/StreamController.ts | 4 ++-- src/index.ts | 4 ++-- src/utils/context.test.ts | 14 ++++++++++---- src/utils/context.ts | 6 +++--- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/controller/StreamController.ts b/src/controller/StreamController.ts index f7a799f..61da946 100644 --- a/src/controller/StreamController.ts +++ b/src/controller/StreamController.ts @@ -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); diff --git a/src/index.ts b/src/index.ts index 31a51d6..31baee4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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 }); diff --git a/src/utils/context.test.ts b/src/utils/context.test.ts index 68345cf..aac8967 100644 --- a/src/utils/context.test.ts +++ b/src/utils/context.test.ts @@ -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(); }); }); diff --git a/src/utils/context.ts b/src/utils/context.ts index 92076c2..eb73125 100644 --- a/src/utils/context.ts +++ b/src/utils/context.ts @@ -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(), };