File size: 1,988 Bytes
eb11f84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import indexHTML from '../html/index.html'
import fips from './usIps.json'

function getFIP():string{
    return fips[Math.floor(Math.random() * fips.length)][0];
}
/** CORS */
function handleOptions(request: Request) {
    const corsHeaders = {
        // 'Access-Control-Allow-Origin': "*",
        'Access-Control-Allow-Origin': request.headers.get("Origin") || "",
        'Access-Control-Allow-Methods': 'GET,HEAD,POST,OPTIONS',
        'Access-Control-Allow-Headers': request.headers.get('Access-Control-Request-Headers') || '',
        'Access-Control-Max-Age': '86400',
        'Access-Control-Allow-Credentials': 'true'
    };
    return new Response(null, { headers: corsHeaders });
}

async function notPorxy(req: Request):Promise<Response|undefined>{
    const url = new URL(req.url);
    if(url.pathname=="/"){
        return new Response(
            indexHTML
                .replaceAll("${PHOST}",url.host)
                .replaceAll("${FIP}",getFIP()),
        {status:200,headers:{"content-type":"text/html; charset=utf-8"}});
    }
    return undefined;
}

export const bingPorxyWorker = async (req: Request,env:Env):Promise<Response>=>{
    // console.log(req.url);
    if(req.method=="OPTIONS"){
        return handleOptions(req);
    }
    // 开始请求
    const url = new URL(req.url);
    const headers = new Headers(req.headers);
    headers.delete("host");
    headers.delete("x-forwarded-host")
    const fip = headers.get("MCPXXX-FIP");
    headers.delete("MCPXXX-FIP");
    const toHost = headers.get("MCPXXX-TO-HOST");
    headers.delete("MCPXXX-TO-HOST");
    if(!fip){
        return await notPorxy(req) || new Response("no MCPXXX-FIP",{status:503});
    }
    if(!toHost){
        return await notPorxy(req) || new Response("no MCPXXX-TO-HOST",{status:503});
    }
    headers.set("X-forwarded-for",fip);
    url.host = toHost;
    return await fetch(url,{
        headers:headers,
        body:req.body,
        method:req.method
    }) as any;
}