<commit_before>package http

import (
	"net"
	"net/http"
	"strings"

	"github.com/v2ray/v2ray-core/app"
	_ "github.com/v2ray/v2ray-core/common/log"
	v2net "github.com/v2ray/v2ray-core/common/net"
)

type HttpProxyServer struct {
	accepting  bool
	dispatcher app.PacketDispatcher
	config     Config
}

func NewHttpProxyServer(dispatcher app.PacketDispatcher, config Config) *HttpProxyServer {
	return &HttpProxyServer{
		dispatcher: dispatcher,
		config:     config,
	}
}

func (this *HttpProxyServer) Listen(port v2net.Port) error {
	server := http.Server{
		Addr:    ":" + port.String(),
		Handler: this,
	}
	return server.ListenAndServe()
}

func (this *HttpProxyServer) ServeHTTP(w http.ResponseWriter, request *http.Request) {
	if strings.ToUpper(request.Method) == "CONNECT" {
		host, port, err := net.SplitHostPort(request.URL.Host)
		if err != nil {
			if strings.Contains(err.(*net.AddrError).Err, "missing port") {
				host = request.URL.Host
				port = "80"
			} else {
				http.Error(w, "Bad Request", 400)
				return
			}
		}
		_ = host + port
	} else {

	}
}

func (this *HttpProxyServer) handleConnect(response http.ResponseWriter, request *http.Request) {

}
<commit_msg>handle connect request in http proxy<commit_after>package http

import (
	"bufio"
	"net"
	"net/http"
	"strconv"
	"strings"

	"github.com/v2ray/v2ray-core/app"
	"github.com/v2ray/v2ray-core/common/alloc"
	"github.com/v2ray/v2ray-core/common/log"
	v2net "github.com/v2ray/v2ray-core/common/net"
)

type HttpProxyServer struct {
	accepting bool
	space     app.Space
	config    Config
}

func NewHttpProxyServer(space app.Space, config Config) *HttpProxyServer {
	return &HttpProxyServer{
		space:  space,
		config: config,
	}
}

func (this *HttpProxyServer) Listen(port v2net.Port) error {
	tcpListener, err := net.ListenTCP("tcp", &net.TCPAddr{
		Port: int(port.Value()),
		IP:   []byte{0, 0, 0, 0},
	})
	if err != nil {
		return err
	}
	go this.accept(tcpListener)
	return nil
}

func (this *HttpProxyServer) accept(listener *net.TCPListener) {
	this.accepting = true
	for this.accepting {
		tcpConn, err := listener.AcceptTCP()
		if err != nil {
			log.Error("Failed to accept HTTP connection: %v", err)
			continue
		}
		go this.handleConnection(tcpConn)
	}
}

func parseHost(rawHost string) (v2net.Address, error) {
	port := v2net.Port(80)
	host, rawPort, err := net.SplitHostPort(rawHost)
	if err != nil {
		if addrError, ok := err.(*net.AddrError); ok && strings.Contains(addrError.Err, "missing port") {
			host = rawHost
			port = v2net.Port(80)
		} else {
			return nil, err
		}
	}
	intPort, err := strconv.Atoi(rawPort)
	if err != nil {
		return nil, err
	}
	port = v2net.Port(intPort)
	if ip := net.ParseIP(host); ip != nil {
		return v2net.IPAddress(ip, port), nil
	}
	return v2net.DomainAddress(host, port), nil
}

func (this *HttpProxyServer) handleConnection(conn *net.TCPConn) {
	httpReader := bufio.NewReader(conn)
	request, err := http.ReadRequest(httpReader)
	if err != nil {
		log.Warning("Malformed HTTP request: %v", err)
		return
	}
	if strings.ToUpper(request.Method) == "CONNECT" {
		address, err := parseHost(request.Host)
		if err != nil {
			log.Warning("Malformed proxy host: %v", err)
			return
		}
		response := &http.Response{
			Status:        "200 OK",
			StatusCode:    200,
			Proto:         "HTTP/1.1",
			ProtoMajor:    1,
			ProtoMinor:    1,
			Header:        http.Header(make(map[string][]string)),
			Body:          nil,
			ContentLength: 0,
			Close:         false,
		}

		buffer := alloc.NewSmallBuffer().Clear()
		response.Write(buffer)
		conn.Write(buffer.Value)

		packet := v2net.NewPacket(v2net.NewTCPDestination(address), nil, true)
		this.space.PacketDispatcher().DispatchToOutbound(packet)
	}
}

{'fraction_non_alphanumeric': 0.13883677298311445, 'fraction_numerical': 0.013401232913428035, 'mean_word_length': 3.6943396226415093, 'pattern_counts': {'":': 1, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3173366', 'n_tokens_mistral': 1465, 'n_tokens_neox': 1359, 'n_words': 294}