@@ -253,3 +253,95 @@ describe("MetadataService Socket Leak Checks", () => {
253253 } ) ;
254254 } ) ;
255255} ) ;
256+
257+ describe ( "MetadataService Custom Ports" , ( ) => {
258+ let metadataService : MetadataService ;
259+
260+ beforeEach ( ( ) => {
261+ vi . clearAllMocks ( ) ;
262+ } ) ;
263+
264+ const createMockResponse = ( statusCode : number , body : string ) => {
265+ const stream = Readable . from ( [ body ] ) ;
266+ return {
267+ response : {
268+ statusCode,
269+ body : stream ,
270+ headers : { } ,
271+ } ,
272+ } ;
273+ } ;
274+
275+ it ( "should use custom port from endpoint URL in request()" , async ( ) => {
276+ metadataService = new MetadataService ( {
277+ endpoint : "http://localhost:1338" ,
278+ httpOptions : { timeout : 1000 } ,
279+ } ) ;
280+
281+ const mockResponse = createMockResponse ( 200 , "i-1234567890abcdef0" ) ;
282+ const mockHandle = vi . fn ( ) . mockResolvedValue ( mockResponse ) ;
283+
284+ vi . mocked ( NodeHttpHandler ) . mockImplementation ( ( ) => ( { handle : mockHandle } as any ) ) ;
285+
286+ await metadataService . request ( "/latest/meta-data/instance-id" , { } ) ;
287+
288+ const requestArg = mockHandle . mock . calls [ 0 ] [ 0 ] ;
289+ expect ( requestArg . port ) . toBe ( 1338 ) ;
290+ expect ( requestArg . hostname ) . toBe ( "localhost" ) ;
291+ } ) ;
292+
293+ it ( "should use custom port from endpoint URL in fetchMetadataToken()" , async ( ) => {
294+ metadataService = new MetadataService ( {
295+ endpoint : "http://localhost:1338" ,
296+ httpOptions : { timeout : 1000 } ,
297+ } ) ;
298+
299+ const mockResponse = createMockResponse ( 200 , "test-token-123" ) ;
300+ const mockHandle = vi . fn ( ) . mockResolvedValue ( mockResponse ) ;
301+
302+ vi . mocked ( NodeHttpHandler ) . mockImplementation ( ( ) => ( { handle : mockHandle } as any ) ) ;
303+
304+ await metadataService . fetchMetadataToken ( ) ;
305+
306+ const requestArg = mockHandle . mock . calls [ 0 ] [ 0 ] ;
307+ expect ( requestArg . port ) . toBe ( 1338 ) ;
308+ expect ( requestArg . hostname ) . toBe ( "localhost" ) ;
309+ } ) ;
310+
311+ it ( "should use undefined port for standard HTTP endpoint (port 80)" , async ( ) => {
312+ metadataService = new MetadataService ( {
313+ endpoint : "http://169.254.169.254" ,
314+ httpOptions : { timeout : 1000 } ,
315+ } ) ;
316+
317+ const mockResponse = createMockResponse ( 200 , "test-token-123" ) ;
318+ const mockHandle = vi . fn ( ) . mockResolvedValue ( mockResponse ) ;
319+
320+ vi . mocked ( NodeHttpHandler ) . mockImplementation ( ( ) => ( { handle : mockHandle } as any ) ) ;
321+
322+ await metadataService . fetchMetadataToken ( ) ;
323+
324+ const requestArg = mockHandle . mock . calls [ 0 ] [ 0 ] ;
325+ expect ( requestArg . port ) . toBeUndefined ( ) ;
326+ expect ( requestArg . hostname ) . toBe ( "169.254.169.254" ) ;
327+ } ) ;
328+
329+ it ( "should use custom HTTPS port from endpoint URL" , async ( ) => {
330+ metadataService = new MetadataService ( {
331+ endpoint : "https://localhost:8443" ,
332+ httpOptions : { timeout : 1000 } ,
333+ } ) ;
334+
335+ const mockResponse = createMockResponse ( 200 , "test-token-123" ) ;
336+ const mockHandle = vi . fn ( ) . mockResolvedValue ( mockResponse ) ;
337+
338+ vi . mocked ( NodeHttpHandler ) . mockImplementation ( ( ) => ( { handle : mockHandle } as any ) ) ;
339+
340+ await metadataService . fetchMetadataToken ( ) ;
341+
342+ const requestArg = mockHandle . mock . calls [ 0 ] [ 0 ] ;
343+ expect ( requestArg . port ) . toBe ( 8443 ) ;
344+ expect ( requestArg . hostname ) . toBe ( "localhost" ) ;
345+ expect ( requestArg . protocol ) . toBe ( "https:" ) ;
346+ } ) ;
347+ } ) ;
0 commit comments