fix: replace client-side Swagger server detection with server-side dynamic spec
Licence Check / Licence compatibility and copyright header verification (push) Successful in 2m43s
CI / Security audit (push) Successful in 3m15s
Build and Push Docker Image / build (push) Successful in 4m6s
CI / Swagger Validation & Coverage (push) Successful in 4m14s
CI / Tests & coverage (push) Successful in 4m32s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 2m43s
CI / Security audit (push) Successful in 3m15s
Build and Push Docker Image / build (push) Successful in 4m6s
CI / Swagger Validation & Coverage (push) Successful in 4m14s
CI / Tests & coverage (push) Successful in 4m32s
- Change swaggerUi.setup to pass null and fetch spec from /api/swagger.json
- Update /api/swagger.json handler to dynamically set server URL based on request
- Remove dead client-side detection script (swagger-server-detection.js)
- Server-side detection respects TRUST_PROXY for reverse proxy scenarios
- req.protocol and req.get('host') automatically use X-Forwarded headers when configured
- Fixes issue where placeholder URL was never replaced due to window.ui being unavailable
This commit is contained in:
+18
-6
@@ -181,18 +181,30 @@ function createApp({ skipRateLimits = false } = {}) {
|
||||
});
|
||||
|
||||
// Swagger UI - publicly accessible API documentation
|
||||
app.use('/api/swagger', swaggerUi.serve, swaggerUi.setup(swaggerSpec, {
|
||||
app.use('/api/swagger', swaggerUi.serve, swaggerUi.setup(null, {
|
||||
customSiteTitle: 'sofarr API Documentation',
|
||||
customCss: '.swagger-ui .topbar { display: none }',
|
||||
customJs: [
|
||||
'/swagger-auth-banner.js',
|
||||
'/swagger-server-detection.js'
|
||||
]
|
||||
'/swagger-auth-banner.js'
|
||||
],
|
||||
swaggerOptions: {
|
||||
url: '/api/swagger.json'
|
||||
}
|
||||
}));
|
||||
|
||||
// Serve the raw OpenAPI spec as JSON
|
||||
// Serve the raw OpenAPI spec as JSON with dynamic server URL
|
||||
app.get('/api/swagger.json', (req, res) => {
|
||||
res.json(swaggerSpec);
|
||||
// Clone the spec to avoid modifying the original
|
||||
const specCopy = JSON.parse(JSON.stringify(swaggerSpec));
|
||||
|
||||
// Replace the server URL with the current request's origin
|
||||
if (specCopy.servers && specCopy.servers.length > 0) {
|
||||
const protocol = req.protocol;
|
||||
const host = req.get('host');
|
||||
specCopy.servers[0].url = `${protocol}://${host}`;
|
||||
}
|
||||
|
||||
res.json(specCopy);
|
||||
});
|
||||
|
||||
// API routes
|
||||
|
||||
Reference in New Issue
Block a user