Spaces:
Running
Running
import { json } from '@remix-run/cloudflare'; | |
import type { ActionFunctionArgs, LoaderFunctionArgs } from '@remix-run/cloudflare'; | |
// Handle all HTTP methods | |
export async function action({ request, params }: ActionFunctionArgs) { | |
return handleProxyRequest(request, params['*']); | |
} | |
export async function loader({ request, params }: LoaderFunctionArgs) { | |
return handleProxyRequest(request, params['*']); | |
} | |
async function handleProxyRequest(request: Request, path: string | undefined) { | |
try { | |
if (!path) { | |
return json({ error: 'Invalid proxy URL format' }, { status: 400 }); | |
} | |
const url = new URL(request.url); | |
// Reconstruct the target URL | |
const targetURL = `https://${path}${url.search}`; | |
// Forward the request to the target URL | |
const response = await fetch(targetURL, { | |
method: request.method, | |
headers: { | |
...Object.fromEntries(request.headers), | |
// Override host header with the target host | |
host: new URL(targetURL).host, | |
}, | |
body: ['GET', 'HEAD'].includes(request.method) ? null : await request.arrayBuffer(), | |
}); | |
// Create response with CORS headers | |
const corsHeaders = { | |
'Access-Control-Allow-Origin': '*', | |
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', | |
'Access-Control-Allow-Headers': '*', | |
}; | |
// Handle preflight requests | |
if (request.method === 'OPTIONS') { | |
return new Response(null, { | |
headers: corsHeaders, | |
status: 204, | |
}); | |
} | |
// Forward the response with CORS headers | |
const responseHeaders = new Headers(response.headers); | |
Object.entries(corsHeaders).forEach(([key, value]) => { | |
responseHeaders.set(key, value); | |
}); | |
return new Response(response.body, { | |
status: response.status, | |
headers: responseHeaders, | |
}); | |
} catch (error) { | |
console.error('Git proxy error:', error); | |
return json({ error: 'Proxy error' }, { status: 500 }); | |
} | |
} | |