from http.server import HTTPServer, BaseHTTPRequestHandler
import socket
import select

CLASH_YAML = '''port: 7890
socks-port: 7891
allow-lan: true
mode: rule
log-level: info
ipv6: false

dns:
  enable: true
  listen: 0.0.0.0:53
  enhanced-mode: fake-ip
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
    - 8.8.8.8

proxies:
  - name: "Oracle-VMess-WS (机场同款-推荐)"
    type: vmess
    server: 129.225.181.46
    port: 80
    uuid: e4b387e1-89fa-47d0-9ab2-81e095dbef6a
    alterId: 0
    cipher: auto
    udp: true
    network: ws
    ws-opts:
      path: /vmess

  - name: "Oracle-Trojan (备用)"
    type: trojan
    server: 129.225.181.46
    port: 443
    password: oracle_vpn_ss_key_2026
    udp: true
    sni: itunes.apple.com
    skip-cert-verify: true

proxy-groups:
  - name: "🚀 节点选择"
    type: select
    proxies:
      - "Oracle-VMess-WS (机场同款-推荐)"
      - "Oracle-Trojan (备用)"
      - DIRECT

rules:
  - GEOIP,CN,DIRECT
  - MATCH,🚀 节点选择
'''

class ProxyHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path.startswith('/clash.yaml') or self.path == '/':
            self.send_response(200)
            self.send_header('Content-Type', 'application/yaml; charset=utf-8')
            self.send_header('Content-Length', str(len(CLASH_YAML.encode('utf-8'))))
            self.end_headers()
            self.wfile.write(CLASH_YAML.encode('utf-8'))
        else:
            self.proxy_to_xray()

    def do_POST(self):
        self.proxy_to_xray()

    def do_CONNECT(self):
        self.proxy_to_xray()

    def log_message(self, format, *args):
        pass

    def proxy_to_xray(self):
        try:
            remote = socket.create_connection(('127.0.0.1', 10086))
            req = f"{self.command} {self.path} {self.request_version}\r\n"
            for k, v in self.headers.items():
                req += f"{k}: {v}\r\n"
            req += "\r\n"
            remote.sendall(req.encode('iso-8859-1'))
            
            sockets = [self.connection, remote]
            while True:
                r, _, _ = select.select(sockets, [], [], 10)
                if not r:
                    break
                for s in r:
                    other = remote if s is self.connection else self.connection
                    data = s.recv(4096)
                    if not data:
                        return
                    other.sendall(data)
        except Exception:
            pass

if __name__ == '__main__':
    server = HTTPServer(('0.0.0.0', 80), ProxyHandler)
    server.serve_forever()
