Skip to content

Mrw33554432/EZProxyWorkers

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 

Repository files navigation

EZProxyWorkers

A Proxy for OpenAI API on Cloudflare Workers.

Copy The code to your Cloudflare Workers.

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request));
});

const OPENAI_API_URL = 'https://api.openai.com/v1';

async function handleRequest(request) {
  // Handle CORS preflight request
  if (request.method === 'OPTIONS') {
    return handleCorsPreflight(request);
  }

  // Log the full request details
  await logRequest(request);

  // Extract the path from the original request
  const originalUrl = new URL(request.url);
  const originalPath = originalUrl.pathname;

  // Construct the new URL for forwarding the request
  const forwardUrl = OPENAI_API_URL + originalPath;

  // Create a new request with the necessary headers
  let newHeaders = new Headers();

  // List of headers to copy from the original request
  const headersToCopy = ['content-Type', 'openai-beta'];

  // Copy headers from the original request
  copyHeaders(request, newHeaders, headersToCopy);

  const requestBody = request.method !== 'GET' ? await request.clone().text() : null;

  const newRequest = new Request(forwardUrl, {
    method: request.method,
    headers: newHeaders,
    body: requestBody
  });

  await logRequest(newRequest);

  // Forward the new request
  let response = await fetch(newRequest);

  await logRequest(response);

  // Return the response from the OpenAI API
  return response;
}

async function handleCorsPreflight(request) {
  const origin = request.headers.get('Origin');
  const accessControlRequestMethod = request.headers.get('Access-Control-Request-Method');
  const accessControlRequestHeaders = request.headers.get('Access-Control-Request-Headers');

  const responseHeaders = {
    'Access-Control-Allow-Origin': origin,
    'Access-Control-Allow-Methods': accessControlRequestMethod,
    'Access-Control-Allow-Headers': accessControlRequestHeaders,
    'Access-Control-Max-Age': '86400', // Cache the preflight request for 1 day
  };

  return new Response(null, {
    headers: responseHeaders,
    status: 204, // No Content
  });
}

async function logRequest(request) {
  console.log('Request Method:', request.method);
  console.log('Request URL:', request.url);

  console.log('Request Headers:');
  for (const [key, value] of request.headers.entries()) {
    console.log(`  ${key}: ${value}`);
  }

  const requestBody = await request.clone().text();
  console.log('Request Body:', requestBody);
}

function copyHeaders(originalRequest, newHeaders, headersToCopy) {
  headersToCopy.forEach(headerName => {
    const headerValue = originalRequest.headers.get(headerName);
    if (headerValue !== null) {
      newHeaders.set(headerName, headerValue);
    }
  });
}

About

A Proxy for OpenAI API

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published