diff --git a/src/node/hooks/express/openapi.ts b/src/node/hooks/express/openapi.ts index 3b7dd450904..926ae34f234 100644 --- a/src/node/hooks/express/openapi.ts +++ b/src/node/hooks/express/openapi.ts @@ -868,8 +868,9 @@ const getApiRootForVersion = (version:string, style:any = APIPathStyle.FLAT): st const generateServerForApiVersion = (apiRoot:string, req:any): { url:string } => ({ - url: `${settings.ssl ? 'https' : 'http'}://${req.headers.host}${apiRoot}`, + url: `${req.protocol}://${req.headers.host}${apiRoot}`, }); exports.generateDefinitionForVersion = generateDefinitionForVersion; exports.APIPathStyle = APIPathStyle; +exports.generateServerForApiVersion = generateServerForApiVersion; diff --git a/src/tests/backend/specs/openapi.ts b/src/tests/backend/specs/openapi.ts new file mode 100644 index 00000000000..1b49e9c31ab --- /dev/null +++ b/src/tests/backend/specs/openapi.ts @@ -0,0 +1,25 @@ +'use strict'; + +const assert = require('assert').strict; + +describe('openapi server URL generation', function () { + let generateServerForApiVersion: (apiRoot: string, req: any) => {url: string}; + + before(function () { + ({generateServerForApiVersion} = require('../../../node/hooks/express/openapi')); + }); + + const mockReq = (protocol: string, host: string) => ({protocol, headers: {host}}); + + it('emits http:// for a plain HTTP request', function () { + assert.deepEqual( + generateServerForApiVersion('/api/1.2.15', mockReq('http', 'pad.example.com')), + {url: 'http://pad.example.com/api/1.2.15'}); + }); + + it('emits https:// when the request protocol is https (TLS or reverse proxy)', function () { + assert.deepEqual( + generateServerForApiVersion('/api/1.2.15', mockReq('https', 'pad.example.com')), + {url: 'https://pad.example.com/api/1.2.15'}); + }); +});