Spaces:
Runtime error
Runtime error
File size: 2,525 Bytes
c359bb9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
require('dotenv').config();
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const cors = require('cors');
const app = express();
const PORT = process.env.PORT || 8501;
const STREAMLIT_URL = process.env.STREAMLIT_URL || 'http://localhost:8501';
// CORS configuration from environment variables
const corsOptions = {
origin: process.env.CORS_ORIGIN || '*',
credentials: process.env.CORS_CREDENTIALS === 'true',
methods: (process.env.CORS_METHODS || 'GET,POST,PUT,DELETE,OPTIONS,PATCH').split(','),
allowedHeaders: (process.env.CORS_ALLOWED_HEADERS || 'Content-Type,Authorization,X-Requested-With,Accept,Origin').split(','),
optionsSuccessStatus: 200
};
app.use(cors(corsOptions));
// Additional CORS headers
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', '*');
res.header('Access-Control-Allow-Headers', '*');
res.header('X-Frame-Options', 'ALLOWALL');
if (req.method === 'OPTIONS') {
return res.status(200).end();
}
next();
});
// Replace this URL with your actual Streamlit app URL
// Proxy configuration
const proxyOptions = {
target: STREAMLIT_URL,
changeOrigin: true,
secure: true,
ws: true, // WebSocket support
logLevel: 'info',
onProxyReq: (proxyReq, req, res) => {
console.log(`Proxying: ${req.method} ${req.url}`);
// Clean up headers
proxyReq.removeHeader('x-forwarded-host');
proxyReq.setHeader('host', STREAMLIT_URL.replace('https://', ''));
},
onProxyRes: (proxyRes, req, res) => {
console.log(`Response: ${proxyRes.statusCode}`);
// Remove restrictive headers
delete proxyRes.headers['x-frame-options'];
delete proxyRes.headers['content-security-policy'];
delete proxyRes.headers['x-content-type-options'];
// Add permissive headers
proxyRes.headers['x-frame-options'] = 'ALLOWALL';
proxyRes.headers['access-control-allow-origin'] = '*';
},
onError: (err, req, res) => {
console.error('Proxy error:', err);
res.status(500).send('Proxy error: ' + err.message);
}
};
// Apply proxy to all routes
app.use('/', createProxyMiddleware(proxyOptions));
// Health check endpoint
app.get('/health', (req, res) => {
res.json({ status: 'OK', target: STREAMLIT_URL });
});
app.listen(PORT, () => {
console.log(`🚀 Proxy server running on port ${PORT}`);
console.log(`🎯 Proxying to: ${STREAMLIT_URL}`);
console.log(`🌐 CORS enabled for ALL origins`);
}); |